Browse Source

Merge branch 'main' into es-translations

pull/5240/head
Diego Noah 4 weeks ago
committed by GitHub
parent
commit
84b7dcaf3f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 22
      CHANGELOG.md
  2. 2
      README.md
  3. 92
      apps/api/src/app/admin/create-asset-profile.dto.ts
  4. 1
      apps/api/src/app/export/export.service.ts
  5. 17
      apps/api/src/app/import/create-asset-profile-with-market-data.dto.ts
  6. 11
      apps/api/src/app/import/import-data.dto.ts
  7. 1
      apps/api/src/app/import/import.controller.ts
  8. 2
      apps/api/src/app/import/import.module.ts
  9. 72
      apps/api/src/app/import/import.service.ts
  10. 23
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  11. 32
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
  12. 1
      apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts
  13. 6
      apps/api/src/app/portfolio/portfolio.controller.ts
  14. 13
      apps/api/src/app/portfolio/portfolio.service.ts
  15. 20
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts
  16. 3
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  17. 64
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  18. 2
      apps/client/src/app/components/header/header.component.html
  19. 2
      apps/client/src/app/components/header/header.component.ts
  20. 2
      apps/client/src/app/components/home-holdings/home-holdings.component.ts
  21. 2
      apps/client/src/app/components/home-holdings/home-holdings.html
  22. 2
      apps/client/src/app/components/home-overview/home-overview.component.ts
  23. 2
      apps/client/src/app/components/markets/markets.component.ts
  24. 2
      apps/client/src/app/components/markets/markets.html
  25. 2
      apps/client/src/app/pages/api/api-page.component.ts
  26. 5
      apps/client/src/app/pages/faq/overview/faq-overview-page.html
  27. 6
      apps/client/src/app/pages/faq/saas/saas-page.html
  28. 11
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  29. 3
      apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
  30. 4
      apps/client/src/app/pages/portfolio/analysis/analysis-page.html
  31. 6
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
  32. 5
      apps/client/src/app/pages/pricing/pricing-page.html
  33. 26
      apps/client/src/app/services/import-activities.service.ts
  34. 58
      apps/client/src/locales/messages.ca.xlf
  35. 58
      apps/client/src/locales/messages.de.xlf
  36. 58
      apps/client/src/locales/messages.es.xlf
  37. 58
      apps/client/src/locales/messages.fr.xlf
  38. 58
      apps/client/src/locales/messages.it.xlf
  39. 58
      apps/client/src/locales/messages.nl.xlf
  40. 58
      apps/client/src/locales/messages.pl.xlf
  41. 88
      apps/client/src/locales/messages.pt.xlf
  42. 58
      apps/client/src/locales/messages.tr.xlf
  43. 58
      apps/client/src/locales/messages.uk.xlf
  44. 58
      apps/client/src/locales/messages.xlf
  45. 58
      apps/client/src/locales/messages.zh.xlf
  46. 8
      libs/common/src/lib/config.ts
  47. 8
      libs/common/src/lib/interfaces/export.interface.ts
  48. 2
      libs/common/src/lib/interfaces/index.ts
  49. 4
      libs/common/src/lib/interfaces/market-data.interface.ts
  50. 2
      libs/common/src/lib/interfaces/responses/portfolio-report.interface.ts
  51. 111
      libs/common/src/lib/personal-finance-tools.ts
  52. 30
      libs/ui/src/lib/activity-type/activity-type.component.stories.ts
  53. 4
      libs/ui/src/lib/fire-calculator/fire-calculator.component.html
  54. 1
      libs/ui/src/lib/i18n.ts
  55. 1
      libs/ui/src/lib/toggle/index.ts
  56. 0
      libs/ui/src/lib/toggle/toggle.component.html
  57. 0
      libs/ui/src/lib/toggle/toggle.component.scss
  58. 33
      libs/ui/src/lib/toggle/toggle.component.stories.ts
  59. 14
      libs/ui/src/lib/toggle/toggle.component.ts
  60. 4
      package-lock.json
  61. 2
      package.json
  62. 115
      test/import/ok/sample.json

22
CHANGELOG.md

@ -9,9 +9,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Improved the language localization for Spanish (`es`)
- Restructured the response of the portfolio report endpoint (_X-ray_)
### Fixed
- Excluded the holdings originated of `FEE`, `INTEREST` and `LIABILITY` activities from the closed holdings on the portfolio holdings page
## 2.185.0 - 2025-07-26
### Added
- Added a _Storybook_ story for the activity type component
- Added a _Storybook_ story for the toggle component
### Changed
- Extended the import functionality by custom asset profiles
- Migrated the get country and sector weightings, dividends, ETF holdings, ETF info, historical price, profile, quote and symbol search functionalities of the _Financial Modeling Prep_ service to its stable API version
- Refactored the toggle component to standalone
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for Spanish (`es`)
- Improved the language localization for Portuguese (`pt`)
- Improved the language localization for Turkish (`tr`)
- Upgraded the _Stripe_ dependencies
- Upgraded `angular` from version `19.2.1` to `20.0.7`
@ -23,8 +41,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Fixed the date format of the retirement date in the _FIRE_ calculator
- Fixed an issue with the permissions of the impersonation mode related to the onboarding on the overview tab of the home page
- Fixed an issue with the permissions of the impersonation mode related to the manage activities button of the holdings tab on the home page
- Fixed an issue with the currency detection related to `USD.AX` in the _Yahoo Finance_ service
## 2.184.0 - 2025-07-22

2
README.md

@ -25,7 +25,7 @@
## Ghostfolio Premium
Our official **[Ghostfolio Premium](https://ghostfol.io/en/pricing)** 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 the costs of the hosting infrastructure and to fund ongoing development.
Our official **[Ghostfolio Premium](https://ghostfol.io/en/pricing)** 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.
If you prefer to run Ghostfolio on your own infrastructure, please find further instructions in the [Self-hosting](#self-hosting) section.

92
apps/api/src/app/admin/create-asset-profile.dto.ts

@ -0,0 +1,92 @@
import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code';
import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client';
import {
IsArray,
IsBoolean,
IsEnum,
IsObject,
IsOptional,
IsString,
IsUrl
} from 'class-validator';
export class CreateAssetProfileDto {
@IsEnum(AssetClass, { each: true })
@IsOptional()
assetClass?: AssetClass;
@IsEnum(AssetSubClass, { each: true })
@IsOptional()
assetSubClass?: AssetSubClass;
@IsOptional()
@IsString()
comment?: string;
@IsArray()
@IsOptional()
countries?: Prisma.InputJsonArray;
@IsCurrencyCode()
currency: string;
@IsOptional()
@IsString()
cusip?: string;
@IsEnum(DataSource)
dataSource: DataSource;
@IsOptional()
@IsString()
figi?: string;
@IsOptional()
@IsString()
figiComposite?: string;
@IsOptional()
@IsString()
figiShareClass?: string;
@IsArray()
@IsOptional()
holdings?: Prisma.InputJsonArray;
@IsBoolean()
@IsOptional()
isActive?: boolean;
@IsOptional()
@IsString()
isin?: string;
@IsOptional()
@IsString()
name?: string;
@IsObject()
@IsOptional()
scraperConfiguration?: Prisma.InputJsonObject;
@IsArray()
@IsOptional()
sectors?: Prisma.InputJsonArray;
@IsString()
symbol: string;
@IsObject()
@IsOptional()
symbolMapping?: {
[dataProvider: string]: string;
};
@IsOptional()
@IsUrl({
protocols: ['https'],
require_protocol: true
})
url?: string;
}

1
apps/api/src/app/export/export.service.ts

@ -195,7 +195,6 @@ export class ExportService {
figiComposite,
figiShareClass,
holdings: holdings as unknown as Prisma.JsonArray,
id,
isActive,
isin,
marketData: marketDataByAssetProfile[id],

17
apps/api/src/app/import/create-asset-profile-with-market-data.dto.ts

@ -0,0 +1,17 @@
import { MarketData } from '@ghostfolio/common/interfaces';
import { DataSource } from '@prisma/client';
import { IsArray, IsEnum, IsOptional } from 'class-validator';
import { CreateAssetProfileDto } from '../admin/create-asset-profile.dto';
export class CreateAssetProfileWithMarketDataDto extends CreateAssetProfileDto {
@IsEnum([DataSource.MANUAL], {
message: `dataSource must be '${DataSource.MANUAL}'`
})
dataSource: DataSource;
@IsArray()
@IsOptional()
marketData?: MarketData[];
}

11
apps/api/src/app/import/import-data.dto.ts

@ -4,16 +4,23 @@ import { Type } from 'class-transformer';
import { IsArray, IsOptional, ValidateNested } from 'class-validator';
import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto';
import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto';
export class ImportDataDto {
@IsOptional()
@IsArray()
@IsOptional()
@Type(() => CreateAccountWithBalancesDto)
@ValidateNested({ each: true })
accounts: CreateAccountWithBalancesDto[];
accounts?: CreateAccountWithBalancesDto[];
@IsArray()
@Type(() => CreateOrderDto)
@ValidateNested({ each: true })
activities: CreateOrderDto[];
@IsArray()
@IsOptional()
@Type(() => CreateAssetProfileWithMarketDataDto)
@ValidateNested({ each: true })
assetProfiles?: CreateAssetProfileWithMarketDataDto[];
}

1
apps/api/src/app/import/import.controller.ts

@ -73,6 +73,7 @@ export class ImportController {
maxActivitiesToImport,
accountsWithBalancesDto: importData.accounts ?? [],
activitiesDto: importData.activities,
assetProfilesWithMarketDataDto: importData.assetProfiles ?? [],
user: this.request.user
});

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

@ -9,6 +9,7 @@ import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptor
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module';
import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module';
@ -27,6 +28,7 @@ import { ImportService } from './import.service';
DataGatheringModule,
DataProviderModule,
ExchangeRateDataModule,
MarketDataModule,
OrderModule,
PlatformModule,
PortfolioModule,

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

@ -10,6 +10,7 @@ import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { DATA_GATHERING_QUEUE_PRIORITY_HIGH } from '@ghostfolio/common/config';
@ -31,6 +32,7 @@ import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns';
import { omit, uniqBy } from 'lodash';
import { v4 as uuidv4 } from 'uuid';
import { CreateAssetProfileDto } from '../admin/create-asset-profile.dto';
import { ImportDataDto } from './import-data.dto';
@Injectable()
@ -40,6 +42,7 @@ export class ImportService {
private readonly configurationService: ConfigurationService,
private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService,
private readonly marketDataService: MarketDataService,
private readonly orderService: OrderService,
private readonly platformService: PlatformService,
private readonly portfolioService: PortfolioService,
@ -148,17 +151,20 @@ export class ImportService {
public async import({
accountsWithBalancesDto,
activitiesDto,
assetProfilesWithMarketDataDto,
isDryRun = false,
maxActivitiesToImport,
user
}: {
accountsWithBalancesDto: ImportDataDto['accounts'];
activitiesDto: ImportDataDto['activities'];
assetProfilesWithMarketDataDto: ImportDataDto['assetProfiles'];
isDryRun?: boolean;
maxActivitiesToImport: number;
user: UserWithSettings;
}): Promise<Activity[]> {
const accountIdMapping: { [oldAccountId: string]: string } = {};
const assetProfileSymbolMapping: { [oldSymbol: string]: string } = {};
const userCurrency = user.settings.settings.baseCurrency;
if (!isDryRun && accountsWithBalancesDto?.length) {
@ -230,6 +236,63 @@ export class ImportService {
}
}
if (!isDryRun && assetProfilesWithMarketDataDto?.length) {
const existingAssetProfiles =
await this.symbolProfileService.getSymbolProfiles(
assetProfilesWithMarketDataDto.map(({ dataSource, symbol }) => {
return { dataSource, symbol };
})
);
for (const assetProfileWithMarketData of assetProfilesWithMarketDataDto) {
// Check if there is any existing asset profile
const existingAssetProfile = existingAssetProfiles.find(
({ dataSource, symbol }) => {
return (
dataSource === assetProfileWithMarketData.dataSource &&
symbol === assetProfileWithMarketData.symbol
);
}
);
// If there is no asset profile or if the asset profile belongs to a different user, then create a new asset profile
if (!existingAssetProfile || existingAssetProfile.userId !== user.id) {
const assetProfile: CreateAssetProfileDto = omit(
assetProfileWithMarketData,
'marketData'
);
// Asset profile belongs to a different user
if (existingAssetProfile) {
const symbol = uuidv4();
assetProfileSymbolMapping[assetProfile.symbol] = symbol;
assetProfile.symbol = symbol;
}
// Create a new asset profile
const assetProfileObject: Prisma.SymbolProfileCreateInput = {
...assetProfile,
user: { connect: { id: user.id } }
};
await this.symbolProfileService.add(assetProfileObject);
}
// Insert or update market data
const marketDataObjects = assetProfileWithMarketData.marketData.map(
(marketData) => {
return {
...marketData,
dataSource: assetProfileWithMarketData.dataSource,
symbol: assetProfileWithMarketData.symbol
} as Prisma.MarketDataUpdateInput;
}
);
await this.marketDataService.updateMany({ data: marketDataObjects });
}
}
for (const activity of activitiesDto) {
if (!activity.dataSource) {
if (['FEE', 'INTEREST', 'LIABILITY'].includes(activity.type)) {
@ -240,11 +303,16 @@ export class ImportService {
}
}
// If a new account is created, then update the accountId in all activities
if (!isDryRun) {
if (Object.keys(accountIdMapping).includes(activity.accountId)) {
// If a new account is created, then update the accountId in all activities
if (accountIdMapping[activity.accountId]) {
activity.accountId = accountIdMapping[activity.accountId];
}
// If a new asset profile is created, then update the symbol in all activities
if (assetProfileSymbolMapping[activity.symbol]) {
activity.symbol = assetProfileSymbolMapping[activity.symbol];
}
}
}

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

@ -13,6 +13,7 @@ import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfac
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
import {
INVESTMENT_ACTIVITY_TYPES,
PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME,
PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS,
PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH,
@ -287,10 +288,12 @@ export abstract class PortfolioCalculator {
firstIndex--;
}
const positions: TimelinePosition[] = [];
const errors: ResponseError['errors'] = [];
let hasAnySymbolMetricsErrors = false;
const errors: ResponseError['errors'] = [];
const positions: (TimelinePosition & {
includeInHoldings: boolean;
})[] = [];
const accumulatedValuesByDate: {
[date: string]: {
@ -409,6 +412,7 @@ export abstract class PortfolioCalculator {
grossPerformanceWithCurrencyEffect: !hasErrors
? (grossPerformanceWithCurrencyEffect ?? null)
: null,
includeInHoldings: item.includeInHoldings,
investment: totalInvestment,
investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect,
marketPrice:
@ -605,14 +609,23 @@ export abstract class PortfolioCalculator {
const overall = this.calculateOverallPerformance(positions);
const positionsIncludedInHoldings = positions
.filter(({ includeInHoldings }) => {
return includeInHoldings;
})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
.map(({ includeInHoldings, ...rest }) => {
return rest;
});
return {
...overall,
errors,
historicalData,
positions,
totalInterestWithCurrencyEffect,
totalLiabilitiesWithCurrencyEffect,
hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors
hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors,
positions: positionsIncludedInHoldings
};
}
@ -935,6 +948,7 @@ export abstract class PortfolioCalculator {
dividend: new Big(0),
fee: oldAccumulatedSymbol.fee.plus(fee),
firstBuyDate: oldAccumulatedSymbol.firstBuyDate,
includeInHoldings: oldAccumulatedSymbol.includeInHoldings,
quantity: newQuantity,
tags: oldAccumulatedSymbol.tags.concat(tags),
transactionCount: oldAccumulatedSymbol.transactionCount + 1
@ -950,6 +964,7 @@ export abstract class PortfolioCalculator {
averagePrice: unitPrice,
dividend: new Big(0),
firstBuyDate: date,
includeInHoldings: INVESTMENT_ACTIVITY_TYPES.includes(type),
investment: unitPrice.mul(quantity).mul(factor),
quantity: quantity.mul(factor),
transactionCount: 1

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

@ -116,37 +116,7 @@ describe('PortfolioCalculator', () => {
currentValueInBaseCurrency: new Big('0'),
errors: [],
hasErrors: true,
positions: [
{
averagePrice: new Big('0'),
currency: 'USD',
dataSource: 'MANUAL',
dividend: new Big('0'),
dividendInBaseCurrency: new Big('0'),
fee: new Big('49'),
feeInBaseCurrency: new Big('49'),
firstBuyDate: '2021-09-01',
grossPerformance: null,
grossPerformancePercentage: null,
grossPerformancePercentageWithCurrencyEffect: null,
grossPerformanceWithCurrencyEffect: null,
investment: new Big('0'),
investmentWithCurrencyEffect: new Big('0'),
marketPrice: null,
marketPriceInBaseCurrency: 0,
netPerformance: null,
netPerformancePercentage: null,
netPerformancePercentageWithCurrencyEffectMap: null,
netPerformanceWithCurrencyEffectMap: null,
quantity: new Big('0'),
symbol: '2c463fb3-af07-486e-adb0-8301b3d72141',
tags: [],
timeWeightedInvestment: new Big('0'),
timeWeightedInvestmentWithCurrencyEffect: new Big('0'),
transactionCount: 1,
valueInBaseCurrency: new Big('0')
}
],
positions: [],
totalFeesWithCurrencyEffect: new Big('49'),
totalInterestWithCurrencyEffect: new Big('0'),
totalInvestment: new Big('0'),

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

@ -8,6 +8,7 @@ export interface TransactionPointSymbol {
dividend: Big;
fee: Big;
firstBuyDate: string;
includeInHoldings: boolean;
investment: Big;
quantity: Big;
skipErrors: boolean;

6
apps/api/src/app/portfolio/portfolio.controller.ts

@ -655,11 +655,11 @@ export class PortfolioController {
this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') &&
this.request.user.subscription.type === 'Basic'
) {
for (const rule in report.rules) {
report.rules[rule] = null;
for (const rule in report['x-ray'].rules) {
report['x-ray'].rules[rule] = null;
}
report.statistics = {
report['x-ray'].statistics = {
rulesActiveCount: 0,
rulesFulfilledCount: 0
};

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

@ -1156,7 +1156,7 @@ export class PortfolioService {
})
).toNumber();
const rules: PortfolioReportResponse['rules'] = {
const rules: PortfolioReportResponse['x-ray']['rules'] = {
accountClusterRisk:
summary.activityCount > 0
? await this.rulesService.evaluate(
@ -1311,7 +1311,12 @@ export class PortfolioService {
: undefined
};
return { rules, statistics: this.getReportStatistics(rules) };
return {
'x-ray': {
rules,
statistics: this.getReportStatistics(rules)
}
};
}
public async updateTags({
@ -1731,8 +1736,8 @@ export class PortfolioService {
}
private getReportStatistics(
evaluatedRules: PortfolioReportResponse['rules']
): PortfolioReportResponse['statistics'] {
evaluatedRules: PortfolioReportResponse['x-ray']['rules']
): PortfolioReportResponse['x-ray']['statistics'] {
const rulesActiveCount = Object.values(evaluatedRules)
.flat()
.filter((rule) => {

20
apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts

@ -47,11 +47,21 @@ describe('YahooFinanceDataEnhancerService', () => {
'BTC-USD'
)
).toEqual('BTCUSD');
expect(
await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol(
'USD.AX'
)
).toEqual('USD.AX');
expect(
await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol(
'EURUSD=X'
)
).toEqual('EURUSD');
expect(
await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol(
'USDCHF=X'
)
).toEqual('USDCHF');
});
it('convertToYahooFinanceSymbol', async () => {
@ -65,6 +75,16 @@ describe('YahooFinanceDataEnhancerService', () => {
'DOGEUSD'
)
).toEqual('DOGE-USD');
expect(
await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
'EURUSD'
)
).toEqual('EURUSD=X');
expect(
await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
'USD.AX'
)
).toEqual('USD.AX');
expect(
await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
'USDCHF'

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

@ -63,7 +63,8 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
if (
isCurrency(
aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length)
)
) &&
isCurrency(aSymbol.substring(aSymbol.length - DEFAULT_CURRENCY.length))
) {
return `${aSymbol}=X`;
} else if (

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

@ -46,7 +46,6 @@ import {
@Injectable()
export class FinancialModelingPrepService implements DataProviderInterface {
private apiKey: string;
private readonly URL = this.getUrl({ version: 3 });
public constructor(
private readonly configurationService: ConfigurationService,
@ -81,7 +80,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
);
} else if (this.cryptocurrencyService.isCryptocurrency(symbol)) {
const [quote] = await fetch(
`${this.URL}/quote/${symbol}?apikey=${this.apiKey}`,
`${this.getUrl({ version: 'stable' })}/quote?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@ -95,7 +94,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
response.name = quote.name;
} else {
const [assetProfile] = await fetch(
`${this.URL}/profile/${symbol}?apikey=${this.apiKey}`,
`${this.getUrl({ version: 'stable' })}/profile?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@ -109,7 +108,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
if (assetSubClass === AssetSubClass.ETF) {
const etfCountryWeightings = await fetch(
`${this.URL}/etf-country-weightings/${symbol}?apikey=${this.apiKey}`,
`${this.getUrl({ version: 'stable' })}/etf/country-weightings?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@ -133,45 +132,38 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
);
const [etfInformation] = await fetch(
`${this.getUrl({ version: 4 })}/etf-info?symbol=${symbol}&apikey=${this.apiKey}`,
const etfHoldings = await fetch(
`${this.getUrl({ version: 'stable' })}/etf/holdings?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
).then((res) => res.json());
if (etfInformation.website) {
response.url = etfInformation.website;
}
const sortedTopHoldings = etfHoldings
.sort((a, b) => {
return b.weightPercentage - a.weightPercentage;
})
.slice(0, 10);
const [portfolioDate] = await fetch(
`${this.getUrl({ version: 4 })}/etf-holdings/portfolio-date?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
response.holdings = sortedTopHoldings.map(
({ name, weightPercentage }) => {
return { name, weight: weightPercentage / 100 };
}
).then((res) => res.json());
);
if (portfolioDate) {
const etfHoldings = await fetch(
`${this.getUrl({ version: 4 })}/etf-holdings?date=${portfolioDate.date}&symbol=${symbol}&apikey=${this.apiKey}`,
const [etfInformation] = await fetch(
`${this.getUrl({ version: 'stable' })}/etf/info?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
).then((res) => res.json());
const sortedTopHoldings = etfHoldings
.sort((a, b) => {
return b.pctVal - a.pctVal;
})
.slice(0, 10);
response.holdings = sortedTopHoldings.map(({ name, pctVal }) => {
return { name, weight: pctVal / 100 };
});
if (etfInformation.website) {
response.url = etfInformation.website;
}
const etfSectorWeightings = await fetch(
`${this.URL}/etf-sector-weightings/${symbol}?apikey=${this.apiKey}`,
`${this.getUrl({ version: 'stable' })}/etf/sector-weightings?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@ -181,7 +173,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
({ sector, weightPercentage }) => {
return {
name: sector,
weight: parseFloat(weightPercentage.slice(0, -1)) / 100
weight: weightPercentage / 100
};
}
);
@ -246,14 +238,14 @@ export class FinancialModelingPrepService implements DataProviderInterface {
[date: string]: IDataProviderHistoricalResponse;
} = {};
const { historical = [] } = await fetch(
`${this.URL}/historical-price-full/stock_dividend/${symbol}?apikey=${this.apiKey}`,
const dividends = await fetch(
`${this.getUrl({ version: 'stable' })}/dividends?symbol=${symbol}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
).then((res) => res.json());
historical
dividends
.filter(({ date }) => {
return (
(isSameDay(parseISO(date), from) ||
@ -307,21 +299,21 @@ export class FinancialModelingPrepService implements DataProviderInterface {
? addYears(currentFrom, MAX_YEARS_PER_REQUEST)
: to;
const { historical = [] } = await fetch(
`${this.URL}/historical-price-full/${symbol}?apikey=${this.apiKey}&from=${format(currentFrom, DATE_FORMAT)}&to=${format(currentTo, DATE_FORMAT)}`,
const historical = await fetch(
`${this.getUrl({ version: 'stable' })}/historical-price-eod/full?symbol=${symbol}&apikey=${this.apiKey}&from=${format(currentFrom, DATE_FORMAT)}&to=${format(currentTo, DATE_FORMAT)}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
).then((res) => res.json());
for (const { adjClose, date } of historical) {
for (const { close, date } of historical) {
if (
(isSameDay(parseDate(date), currentFrom) ||
isAfter(parseDate(date), currentFrom)) &&
isBefore(parseDate(date), currentTo)
) {
result[symbol][date] = {
marketPrice: adjClose
marketPrice: close
};
}
}
@ -454,7 +446,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
});
} else {
const result = await fetch(
`${this.URL}/search?query=${query}&apikey=${this.apiKey}`,
`${this.getUrl({ version: 'stable' })}/search-symbol?query=${query}&apikey=${this.apiKey}`,
{
signal: AbortSignal.timeout(
this.configurationService.get('REQUEST_TIMEOUT')

2
apps/client/src/app/components/header/header.component.html

@ -205,7 +205,7 @@
<ion-icon
class="mr-2"
[name]="
impersonationId
hasImpersonationId
? 'radio-button-off-outline'
: 'radio-button-on-outline'
"

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

@ -82,6 +82,7 @@ export class HeaderComponent implements OnChanges {
@ViewChild('assistantTrigger') assistentMenuTriggerElement: MatMenuTrigger;
public hasFilters: boolean;
public hasImpersonationId: boolean;
public hasPermissionForSocialLogin: boolean;
public hasPermissionForSubscription: boolean;
public hasPermissionToAccessAdminControl: boolean;
@ -124,6 +125,7 @@ export class HeaderComponent implements OnChanges {
.onChangeHasImpersonation()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
this.impersonationId = impersonationId;
});

2
apps/client/src/app/components/home-holdings/home-holdings.component.ts

@ -1,4 +1,3 @@
import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -12,6 +11,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import { GfTreemapChartComponent } from '@ghostfolio/ui/treemap-chart';
import { CommonModule } from '@angular/common';

2
apps/client/src/app/components/home-holdings/home-holdings.html

@ -28,7 +28,7 @@
[defaultValue]="holdingType"
[isLoading]="false"
[options]="holdingTypeOptions"
(change)="onChangeHoldingType($event.value)"
(valueChange)="onChangeHoldingType($event.value)"
/>
</div>
</div>

2
apps/client/src/app/components/home-overview/home-overview.component.ts

@ -1,5 +1,4 @@
import { GfPortfolioPerformanceModule } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.module';
import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { LayoutService } from '@ghostfolio/client/core/layout.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
@ -43,7 +42,6 @@ import { takeUntil } from 'rxjs/operators';
templateUrl: './home-overview.html'
})
export class GfHomeOverviewComponent implements OnDestroy, OnInit {
public dateRangeOptions = GfToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
public deviceType: string;
public errors: AssetProfileIdentifier[];
public hasError: boolean;

2
apps/client/src/app/components/markets/markets.component.ts

@ -1,5 +1,4 @@
import { GfFearAndGreedIndexModule } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.module';
import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { resetHours } from '@ghostfolio/common/helper';
@ -13,6 +12,7 @@ import {
import { FearAndGreedIndexMode } from '@ghostfolio/common/types';
import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import {
ChangeDetectionStrategy,

2
apps/client/src/app/components/markets/markets.html

@ -9,7 +9,7 @@
[defaultValue]="fearAndGreedIndexMode"
[isLoading]="false"
[options]="fearAndGreedIndexModeOptions"
(change)="onChangeFearAndGreedIndexMode($event.value)"
(valueChange)="onChangeFearAndGreedIndexMode($event.value)"
/>
</div>
}

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

@ -44,7 +44,7 @@ export class GfApiPageComponent implements OnInit {
this.historicalData$ = this.fetchHistoricalData({ symbol: 'AAPL' });
this.isinLookupItems$ = this.fetchLookupItems({ query: 'US0378331005' });
this.lookupItems$ = this.fetchLookupItems({ query: 'apple' });
this.quotes$ = this.fetchQuotes({ symbols: ['AAPL', 'VOO.US'] });
this.quotes$ = this.fetchQuotes({ symbols: ['AAPL', 'VOO'] });
this.status$ = this.fetchStatus();
}

5
apps/client/src/app/pages/faq/overview/faq-overview-page.html

@ -133,8 +133,9 @@
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
subscription to finance the hosting infrastructure, a positive rating
in the
subscription to finance the operational costs for the hosting
infrastructure and professional data providers, a positive rating in
the
<a
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
>Google Play Store</a

6
apps/client/src/app/pages/faq/saas/saas-page.html

@ -58,9 +58,9 @@
[enableLink]="false"
/></a>
is a fully managed Ghostfolio cloud offering for ambitious investors.
Revenue is used to cover the costs of the hosting infrastructure and
to fund ongoing development. It is the Open Source code base with some
extras like the
Revenue is used to cover operational costs for the hosting
infrastructure and professional data providers, and to fund ongoing
development. It is the Open Source code base with some extras like the
<a [routerLink]="routerLinkMarkets">markets overview</a> and a
professional data provider.</mat-card-content
>

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

@ -1,4 +1,5 @@
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.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 { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module';
import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module';
@ -75,9 +76,10 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
templateUrl: 'import-activities-dialog.html'
})
export class GfImportActivitiesDialog implements OnDestroy {
public accounts: CreateAccountDto[] = [];
public accounts: CreateAccountWithBalancesDto[] = [];
public activities: Activity[] = [];
public assetProfileForm: FormGroup;
public assetProfiles: CreateAssetProfileWithMarketDataDto[] = [];
public dataSource: MatTableDataSource<Activity>;
public details: any[] = [];
public deviceType: string;
@ -166,7 +168,8 @@ export class GfImportActivitiesDialog implements OnDestroy {
await this.importActivitiesService.importSelectedActivities({
accounts: this.accounts,
activities: this.selectedActivities
activities: this.selectedActivities,
assetProfiles: this.assetProfiles
});
this.snackBar.open(
@ -293,6 +296,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
const content = JSON.parse(fileContent);
this.accounts = content.accounts;
this.assetProfiles = content.assetProfiles;
if (!isArray(content.activities)) {
if (isArray(content.orders)) {
@ -323,6 +327,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
await this.importActivitiesService.importJson({
accounts: content.accounts,
activities: content.activities,
assetProfiles: content.assetProfiles,
isDryRun: true
});
this.activities = activities;

3
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts

@ -1,6 +1,5 @@
import { GfBenchmarkComparatorModule } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.module';
import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module';
import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -17,6 +16,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import type { AiPromptMode, GroupBy } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { Clipboard } from '@angular/cdk/clipboard';
@ -68,7 +68,6 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
public benchmarkDataItems: HistoricalDataItem[] = [];
public benchmarks: Partial<SymbolProfile>[];
public bottom3: PortfolioPosition[];
public dateRangeOptions = GfToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
public deviceType: string;
public dividendsByGroup: InvestmentItem[];
public dividendTimelineDataLabel = $localize`Dividend`;

4
apps/client/src/app/pages/portfolio/analysis/analysis-page.html

@ -375,7 +375,7 @@
[defaultValue]="mode"
[isLoading]="false"
[options]="modeOptions"
(change)="onChangeGroupBy($event.value)"
(valueChange)="onChangeGroupBy($event.value)"
/>
</div>
@if (streaks) {
@ -432,7 +432,7 @@
[defaultValue]="mode"
[isLoading]="false"
[options]="modeOptions"
(change)="onChangeGroupBy($event.value)"
(valueChange)="onChangeGroupBy($event.value)"
/>
</div>
<div class="chart-container">

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

@ -47,7 +47,7 @@ export class GfXRayPageComponent {
public inactiveRules: PortfolioReportRule[];
public isLoading = false;
public regionalMarketClusterRiskRules: PortfolioReportRule[];
public statistics: PortfolioReportResponse['statistics'];
public statistics: PortfolioReportResponse['x-ray']['statistics'];
public user: User;
private unsubscribeSubject = new Subject<void>();
@ -115,7 +115,7 @@ export class GfXRayPageComponent {
this.dataService
.fetchPortfolioReport()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ rules, statistics }) => {
.subscribe(({ 'x-ray': { rules, statistics } }) => {
this.inactiveRules = this.mergeInactiveRules(rules);
this.statistics = statistics;
@ -161,7 +161,7 @@ export class GfXRayPageComponent {
}
private mergeInactiveRules(
rules: PortfolioReportResponse['rules']
rules: PortfolioReportResponse['x-ray']['rules']
): PortfolioReportRule[] {
let inactiveRules: PortfolioReportRule[] = [];

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

@ -6,8 +6,9 @@
<p i18n>
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 the costs of the hosting
infrastructure and to fund ongoing development.
for most people. Revenue is used to cover operational costs for the
hosting infrastructure and professional data providers, and to fund
ongoing development.
</p>
<p i18n>
If you prefer to run Ghostfolio on your own infrastructure, please

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

@ -1,4 +1,5 @@
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.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 { 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';
@ -73,20 +74,22 @@ export class ImportActivitiesService {
public importJson({
accounts,
activities,
assetProfiles,
isDryRun = false
}: {
activities: CreateOrderDto[];
accounts?: CreateAccountDto[];
accounts?: CreateAccountWithBalancesDto[];
assetProfiles?: CreateAssetProfileWithMarketDataDto[];
isDryRun?: boolean;
}): Promise<{
activities: Activity[];
accounts?: CreateAccountDto[];
}> {
return new Promise((resolve, reject) => {
this.postImport(
{
accounts,
activities
activities,
assetProfiles
},
isDryRun
)
@ -106,13 +109,14 @@ export class ImportActivitiesService {
public importSelectedActivities({
accounts,
activities
activities,
assetProfiles
}: {
accounts: CreateAccountDto[];
accounts?: CreateAccountWithBalancesDto[];
activities: Activity[];
assetProfiles?: CreateAssetProfileWithMarketDataDto[];
}): Promise<{
activities: Activity[];
accounts?: CreateAccountDto[];
}> {
const importData: CreateOrderDto[] = [];
@ -120,7 +124,7 @@ export class ImportActivitiesService {
importData.push(this.convertToCreateOrderDto(activity));
}
return this.importJson({ accounts, activities: importData });
return this.importJson({ accounts, assetProfiles, activities: importData });
}
private convertToCreateOrderDto({
@ -383,7 +387,11 @@ export class ImportActivitiesService {
}
private postImport(
aImportData: { accounts: CreateAccountDto[]; activities: CreateOrderDto[] },
aImportData: {
accounts?: CreateAccountWithBalancesDto[];
activities: CreateOrderDto[];
assetProfiles?: CreateAssetProfileWithMarketDataDto[];
},
aIsDryRun = false
) {
return this.http.post<{ activities: Activity[] }>(

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

@ -22,7 +22,7 @@
<target state="translated">Iniciar sessió</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2199,7 +2199,7 @@
<target state="translated">Oooh! El testimoni de seguretat és incorrecte.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -2913,10 +2913,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Avui</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -2925,10 +2921,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -2937,10 +2929,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1 any</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -2949,10 +2937,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5 anys</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -2961,10 +2945,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Màx</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -3311,7 +3291,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -3331,7 +3311,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -3347,7 +3327,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
@ -4372,7 +4352,7 @@
<target state="translated">Activitats d’importació</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -4380,7 +4360,7 @@
<target state="translated">Importar dividends</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
@ -4388,7 +4368,7 @@
<target state="translated">S’estan important dades...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -4396,7 +4376,7 @@
<target state="translated">La importació s’ha completat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -4404,7 +4384,7 @@
<target state="translated">S’estan validant les dades...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -4692,7 +4672,7 @@
<target state="translated">Dividend</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -4704,11 +4684,11 @@
<target state="translated">Inversió</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -4720,7 +4700,7 @@
<target state="translated">Mensualment</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
@ -4728,7 +4708,7 @@
<target state="translated">Anualment</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -5809,7 +5789,7 @@
<target state="translated">Import total previst</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="5213771062241898526" datatype="html">
@ -7171,7 +7151,7 @@
<target state="new">AI prompt has been copied to the clipboard</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="new">Open Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="new">Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1026,7 +1026,7 @@
<target state="translated">Einloggen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1042,7 +1042,7 @@
<target state="translated">Ups! Falsches Sicherheits-Token.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1412,10 +1412,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Heute</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1424,10 +1420,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1436,10 +1428,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1448,10 +1436,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1460,10 +1444,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1482,7 +1462,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2346,7 +2326,7 @@
<target state="translated">Daten importieren...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2354,7 +2334,7 @@
<target state="translated">Der Import wurde abgeschlossen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
@ -2486,7 +2466,7 @@
<target state="translated">Aktivitäten importieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -2606,7 +2586,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -2618,7 +2598,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="024cdb2814b0cb3f4ced148f1a0b9854447cb214" datatype="html">
@ -2746,7 +2726,7 @@
<target state="translated">Projizierter Gesamtbetrag</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -2754,7 +2734,7 @@
<target state="translated">Monatlich</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="5213771062241898526" datatype="html">
@ -3282,7 +3262,7 @@
<target state="translated">Dividenden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3310,7 +3290,7 @@
<target state="translated">Daten validieren...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
@ -3378,7 +3358,7 @@
<target state="translated">Jährlich</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3386,7 +3366,7 @@
<target state="translated">Dividenden importieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5908,11 +5888,11 @@
<target state="translated">Investition</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7195,7 +7175,7 @@
<target state="translated">KI-Anweisung wurde in die Zwischenablage kopiert</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7283,7 +7263,7 @@
<target state="translated">Öffne Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7315,7 +7295,7 @@
<target state="translated">Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1011,7 +1011,7 @@
<target state="translated">Iniciar sesión</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1027,7 +1027,7 @@
<target state="translated">Vaya! Token de seguridad incorrecto.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1397,10 +1397,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Hoy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1409,10 +1405,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">Desde principio de año</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1421,10 +1413,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1 año</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1433,10 +1421,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5 años</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1445,10 +1429,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Máximo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1467,7 +1447,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2331,7 +2311,7 @@
<target state="translated">Importando datos...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2339,7 +2319,7 @@
<target state="translated">La importación se ha completado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
@ -2471,7 +2451,7 @@
<target state="translated">Importar operaciones</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -2587,7 +2567,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="8947585964755853889" datatype="html">
@ -2603,7 +2583,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="024cdb2814b0cb3f4ced148f1a0b9854447cb214" datatype="html">
@ -2731,7 +2711,7 @@
<target state="translated">Importe total previsto</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="1054498214311181686" datatype="html">
@ -2767,7 +2747,7 @@
<target state="translated">Mensual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8511b16abcf065252b350d64e337ba2447db3ffb" datatype="html">
@ -3259,7 +3239,7 @@
<target state="translated">Dividendo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3295,7 +3275,7 @@
<target state="translated">Validando datos...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
@ -3363,7 +3343,7 @@
<target state="translated">Anual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3371,7 +3351,7 @@
<target state="translated">Importar Dividendos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5885,11 +5865,11 @@
<target state="translated">Inversión</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7172,7 +7152,7 @@
<target state="translated">El aviso de IA ha sido copiado al portapapeles</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7260,7 +7240,7 @@
<target state="translated">Abrir Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7292,7 +7272,7 @@
<target state="translated">Rendimiento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1322,7 +1322,7 @@
<target state="translated">Se connecter</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1338,7 +1338,7 @@
<target state="translated">Oups! Jeton de Sécurité Incorrect.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1712,10 +1712,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Aujourd’hui</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1724,10 +1720,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">CDA</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1736,10 +1728,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1748,10 +1736,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1760,10 +1744,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1790,7 +1770,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -1802,7 +1782,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1818,7 +1798,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2502,7 +2482,7 @@
<target state="translated">Import des données...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2510,7 +2490,7 @@
<target state="translated">L’import est terminé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -2518,7 +2498,7 @@
<target state="translated">Validation des données...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="6f9fd3da06dc9000eef0d4dcbb37747b303048e9" datatype="html">
@ -2702,7 +2682,7 @@
<target state="translated">Dividende</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -2722,7 +2702,7 @@
<target state="translated">Mensuel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -2986,7 +2966,7 @@
<target state="translated">Importer Activités</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -3066,7 +3046,7 @@
<target state="translated">Montant Total Prévu</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -3362,7 +3342,7 @@
<target state="translated">Annuel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3370,7 +3350,7 @@
<target state="translated">Importer Dividendes</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5884,11 +5864,11 @@
<target state="translated">Investissement</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7171,7 +7151,7 @@
<target state="translated">Le prompt IA a été copié dans le presse-papiers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="translated">Ouvrir Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="translated">Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1011,7 +1011,7 @@
<target state="translated">Accedi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1027,7 +1027,7 @@
<target state="translated">Ops! Token di sicurezza errato.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1397,10 +1397,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Oggi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1409,10 +1405,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">anno corrente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1421,10 +1413,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1 anno</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1433,10 +1421,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5 anni</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1445,10 +1429,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Massimo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1467,7 +1447,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2331,7 +2311,7 @@
<target state="translated">Importazione dei dati...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2339,7 +2319,7 @@
<target state="translated">L’importazione è stata completata</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
@ -2471,7 +2451,7 @@
<target state="translated">Importa le attività</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -2587,7 +2567,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="8947585964755853889" datatype="html">
@ -2603,7 +2583,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="024cdb2814b0cb3f4ced148f1a0b9854447cb214" datatype="html">
@ -2731,7 +2711,7 @@
<target state="translated">Importo totale previsto</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="1054498214311181686" datatype="html">
@ -2767,7 +2747,7 @@
<target state="translated">Mensile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8511b16abcf065252b350d64e337ba2447db3ffb" datatype="html">
@ -3259,7 +3239,7 @@
<target state="translated">Dividendi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3295,7 +3275,7 @@
<target state="translated">Convalida dei dati...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
@ -3363,7 +3343,7 @@
<target state="translated">Annuale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3371,7 +3351,7 @@
<target state="translated">Importa i dividendi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5885,11 +5865,11 @@
<target state="translated">Investimento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7172,7 +7152,7 @@
<target state="translated">L’AI prompt è stato copiato negli appunti</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7260,7 +7240,7 @@
<target state="translated">Apri Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7292,7 +7272,7 @@
<target state="translated">Prestazione</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1010,7 +1010,7 @@
<target state="translated">Aanmelden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1026,7 +1026,7 @@
<target state="translated">Oeps! Onjuiste beveiligingstoken.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1396,10 +1396,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Vandaag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1408,10 +1404,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1420,10 +1412,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1432,10 +1420,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1444,10 +1428,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1466,7 +1446,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2330,7 +2310,7 @@
<target state="translated">Gegevens importeren...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2338,7 +2318,7 @@
<target state="translated">Importeren is voltooid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
@ -2470,7 +2450,7 @@
<target state="translated">Activiteiten importeren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -2586,7 +2566,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="8947585964755853889" datatype="html">
@ -2602,7 +2582,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="024cdb2814b0cb3f4ced148f1a0b9854447cb214" datatype="html">
@ -2730,7 +2710,7 @@
<target state="translated">Verwacht totaalbedrag</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="1054498214311181686" datatype="html">
@ -2766,7 +2746,7 @@
<target state="translated">Maandelijks</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8511b16abcf065252b350d64e337ba2447db3ffb" datatype="html">
@ -3258,7 +3238,7 @@
<target state="translated">Dividend</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3294,7 +3274,7 @@
<target state="translated">Gegevens valideren...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
@ -3362,7 +3342,7 @@
<target state="translated">Jaarlijks</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3370,7 +3350,7 @@
<target state="translated">Importeer dividenden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5884,11 +5864,11 @@
<target state="translated">Investering</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7171,7 +7151,7 @@
<target state="translated">AI-prompt is naar het klembord gekopieerd</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="translated">Open Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="translated">Prestatie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1995,7 +1995,7 @@
<target state="translated">Zaloguj się</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2011,7 +2011,7 @@
<target state="translated">Ups! Nieprawidłowy token bezpieczeństwa.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -2673,10 +2673,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Dziś</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -2685,10 +2681,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">Liczony od początku roku (year-to-date)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -2697,10 +2689,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1 rok</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -2709,10 +2697,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5 lat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -2721,10 +2705,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Maksimum</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -3015,7 +2995,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -3027,7 +3007,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -3043,7 +3023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -3999,7 +3979,7 @@
<target state="translated">Importuj Aktywności</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -4007,7 +3987,7 @@
<target state="translated">Impotruj Dywidendy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
@ -4015,7 +3995,7 @@
<target state="translated">Importowanie danych...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -4023,7 +4003,7 @@
<target state="translated">Importowanie zakończone</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -4031,7 +4011,7 @@
<target state="translated">Weryfikacja danych...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -4303,7 +4283,7 @@
<target state="translated">Dywidenda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -4323,7 +4303,7 @@
<target state="translated">Miesięcznie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
@ -4331,7 +4311,7 @@
<target state="translated">Rocznie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -5244,7 +5224,7 @@
<target state="translated">Przewidywana Łączna Kwota</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -5884,11 +5864,11 @@
<target state="translated">Inwestycje</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7171,7 +7151,7 @@
<target state="translated">Prompt AI został skopiowany do schowka</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="translated">Otwórz Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="translated">Wydajność</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1194,7 +1194,7 @@
<target state="translated">Iniciar sessão</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1210,7 +1210,7 @@
<target state="translated">Oops! Token de Segurança Incorreto.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -1696,10 +1696,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Hoje</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -1708,10 +1704,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">AATD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -1720,10 +1712,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -1732,10 +1720,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -1744,10 +1728,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Máx</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -1774,7 +1754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -1786,7 +1766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -1802,7 +1782,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -2442,7 +2422,7 @@
<target state="translated">A importar dados...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -2450,7 +2430,7 @@
<target state="translated">A importação foi concluída</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="6f9fd3da06dc9000eef0d4dcbb37747b303048e9" datatype="html">
@ -2618,7 +2598,7 @@
<target state="translated">Mensalmente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -2866,7 +2846,7 @@
<target state="translated">Importar Atividades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="446d1376bd7f6cf33d75d7a6022c33d2910327a2" datatype="html">
@ -2946,7 +2926,7 @@
<target state="translated">Montante Total Projetado</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -3290,7 +3270,7 @@
<target state="translated">A validar dados...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
@ -3314,7 +3294,7 @@
<target state="translated">Dividendos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3362,7 +3342,7 @@
<target state="translated">Anualmente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3370,7 +3350,7 @@
<target state="translated">Importar Dividendos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
@ -5884,11 +5864,11 @@
<target state="translated">Investimento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7171,7 +7151,7 @@
<target state="new">AI prompt has been copied to the clipboard</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="new">Open Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="new">Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>
@ -8181,7 +8161,7 @@
</trans-unit>
<trans-unit id="rule.economicMarketClusterRiskEmergingMarkets" datatype="html">
<source> Emerging Markets </source>
<target state="new"> Emerging Markets </target>
<target state="translated"> Mercados Emergentes </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">113</context>
@ -8213,7 +8193,7 @@
</trans-unit>
<trans-unit id="rule.accountClusterRiskCurrentInvestment.false.invalid" datatype="html">
<source> No accounts have been set up </source>
<target state="new"> No accounts have been set up </target>
<target state="translated"> Nenhuma conta foi configurada </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">20</context>
@ -8221,7 +8201,7 @@
</trans-unit>
<trans-unit id="rule.accountClusterRiskSingleAccount.false.invalid" datatype="html">
<source> Your net worth is managed by 0 accounts </source>
<target state="new"> Your net worth is managed by 0 accounts </target>
<target state="translated"> Seu patrimônio líquido é gerenciado por 0 contas </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">32</context>
@ -8229,7 +8209,7 @@
</trans-unit>
<trans-unit id="rule.regionalMarketClusterRiskAsiaPacific" datatype="html">
<source>Asia-Pacific</source>
<target state="new">Asia-Pacific</target>
<target state="translated">Ásia-Pacífico</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">152</context>
@ -8261,7 +8241,7 @@
</trans-unit>
<trans-unit id="rule.regionalMarketClusterRiskEmergingMarkets" datatype="html">
<source> Emerging Markets </source>
<target state="new"> Emerging Markets </target>
<target state="translated"> Mercados Emergentes </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">166</context>
@ -8293,7 +8273,7 @@
</trans-unit>
<trans-unit id="rule.regionalMarketClusterRiskEurope" datatype="html">
<source>Europe</source>
<target state="new">Europe</target>
<target state="translated">Europa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">182</context>
@ -8325,7 +8305,7 @@
</trans-unit>
<trans-unit id="rule.regionalMarketClusterRiskJapan" datatype="html">
<source>Japan</source>
<target state="new">Japan</target>
<target state="translated">Japão</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">196</context>
@ -8357,7 +8337,7 @@
</trans-unit>
<trans-unit id="rule.regionalMarketClusterRiskNorthAmerica" datatype="html">
<source>North America</source>
<target state="new">North America</target>
<target state="translated">América do Norte</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">210</context>
@ -8389,7 +8369,7 @@
</trans-unit>
<trans-unit id="1fcac88ae8e9a85075cdb79b41e8e01d99929e36" datatype="html">
<source>Find Ghostfolio on GitHub</source>
<target state="new">Find Ghostfolio on GitHub</target>
<target state="translated">Encontre o Ghostfolio no GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">74</context>
@ -8401,7 +8381,7 @@
</trans-unit>
<trans-unit id="83437c98bf84f17c50c20f5519608f162881a2c8" datatype="html">
<source>Join the Ghostfolio Slack community</source>
<target state="new">Join the Ghostfolio Slack community</target>
<target state="translated">Junte-se à comunidade do Ghostfolio Slack</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">84</context>
@ -8409,7 +8389,7 @@
</trans-unit>
<trans-unit id="f5df23754cae65f4637314605cfad153569c3462" datatype="html">
<source>Follow Ghostfolio on X (formerly Twitter)</source>
<target state="new">Follow Ghostfolio on X (formerly Twitter)</target>
<target state="translated">Siga o Ghostfolio no X (antigo Twitter)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">93</context>
@ -8417,7 +8397,7 @@
</trans-unit>
<trans-unit id="71c7491454b583e05a73d278aef040220b122086" datatype="html">
<source>Send an e-mail</source>
<target state="new">Send an e-mail</target>
<target state="translated">Enviar um e-mail</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">103</context>
@ -8425,7 +8405,7 @@
</trans-unit>
<trans-unit id="b62bff3fbe3999076ed3927ba4beaaa1530ebc33" datatype="html">
<source>Follow Ghostfolio on LinkedIn</source>
<target state="new">Follow Ghostfolio on LinkedIn</target>
<target state="translated">Siga o Ghostfolio no LinkedIn</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">122</context>
@ -8433,7 +8413,7 @@
</trans-unit>
<trans-unit id="4dc6baa510f0fc18e63021108e86605a3ba16e76" datatype="html">
<source>Ghostfolio is an independent &amp; bootstrapped business</source>
<target state="new">Ghostfolio is an independent &amp; bootstrapped business</target>
<target state="translated">Ghostfolio é um negócio independente e autossuficiente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">132</context>
@ -8441,7 +8421,7 @@
</trans-unit>
<trans-unit id="1739057cce181564a4b34537df2aacbd017e5778" datatype="html">
<source>Support Ghostfolio</source>
<target state="new">Support Ghostfolio</target>
<target state="translated">Apoie o Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">141</context>

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

@ -1843,7 +1843,7 @@
<target state="translated">Giriş</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1859,7 +1859,7 @@
<target state="translated">Hay Allah! Güvenlik anahtarı yanlış.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -2513,10 +2513,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Bugün</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -2525,10 +2521,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -2537,10 +2529,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="trasnlated">1Y</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -2549,10 +2537,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5Y</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -2561,10 +2545,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Maks.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -2591,7 +2571,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -2603,7 +2583,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -2619,7 +2599,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -3479,7 +3459,7 @@
<target state="translated">İşlemleri İçe Aktar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -3487,7 +3467,7 @@
<target state="translated">Temettüleri İçe Aktar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
@ -3495,7 +3475,7 @@
<target state="translated">Veri içe aktarılıyor...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -3503,7 +3483,7 @@
<target state="translated">İçe aktarma tamamlandı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -3511,7 +3491,7 @@
<target state="translated">Veri doğrulanıyor...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -3791,7 +3771,7 @@
<target state="translated">Temettü</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3811,7 +3791,7 @@
<target state="translated">Aylık</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
@ -3819,7 +3799,7 @@
<target state="translated">Yıllık</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -4960,7 +4940,7 @@
<target state="translated">Hesaplanan Toplam Tutar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -5884,11 +5864,11 @@
<target state="translated">Yatırım</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7171,7 +7151,7 @@
<target state="translated">Yapay zeka istemi panoya kopyalandı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7259,7 +7239,7 @@
<target state="translated">Duck.ai’yi aç</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="translated">Performans</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -22,7 +22,7 @@
<target state="translated">Увійти</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2295,7 +2295,7 @@
<target state="translated">Упс! Неправильний Секретний Токен.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -3057,10 +3057,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Сьогодні</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -3069,10 +3065,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">З початку року</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -3081,10 +3073,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1 рік</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -3093,10 +3081,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5 років</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -3105,10 +3089,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">Максимум</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -3203,7 +3183,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="9173945515149078768" datatype="html">
@ -3527,7 +3507,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -3547,7 +3527,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
@ -4600,7 +4580,7 @@
<target state="translated">Імпортувати активності</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -4608,7 +4588,7 @@
<target state="translated">Імпорт дивідендів</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
@ -4616,7 +4596,7 @@
<target state="translated">Імпортуються дані...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -4624,7 +4604,7 @@
<target state="translated">Імпорт завершено</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -4632,7 +4612,7 @@
<target state="translated">Перевірка даних...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -4936,7 +4916,7 @@
<target state="translated">Дивіденди</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -4948,11 +4928,11 @@
<target state="translated">Інвестиції</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -4964,7 +4944,7 @@
<target state="translated">Щомісячно</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
@ -4972,7 +4952,7 @@
<target state="translated">Щорічно</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -6431,7 +6411,7 @@
<target state="translated">Прогнозована загальна сума</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="5213771062241898526" datatype="html">
@ -7179,7 +7159,7 @@
<target state="translated">Запит AI скопійовано в буфер обміну</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="189ecd7821c0e70fd7b29d9255600d3157865b3b" datatype="html">
@ -7259,7 +7239,7 @@
<target state="new">Open Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7291,7 +7271,7 @@
<target state="new">Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1885,7 +1885,7 @@
<source>Sign in</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1900,7 +1900,7 @@
<source>Oops! Incorrect Security Token.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -2502,10 +2502,6 @@
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -2513,10 +2509,6 @@
</trans-unit>
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -2524,10 +2516,6 @@
</trans-unit>
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -2535,10 +2523,6 @@
</trans-unit>
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -2546,10 +2530,6 @@
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -2807,7 +2787,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -2818,7 +2798,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -2833,7 +2813,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -3682,35 +3662,35 @@
<source>Import Activities</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
<source>Importing data...</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
<source>Import has been completed</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
<source>Validating data...</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -3953,7 +3933,7 @@
<source>Dividend</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -3971,14 +3951,14 @@
<source>Monthly</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
<source>Yearly</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -4838,7 +4818,7 @@
<source>Projected Total Amount</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -5374,11 +5354,11 @@
<source>Investment</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -6485,7 +6465,7 @@
<source>AI prompt has been copied to the clipboard</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -6562,7 +6542,7 @@
<source>Open Duck.ai</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -6590,7 +6570,7 @@
<source>Performance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -2004,7 +2004,7 @@
<target state="translated">登入</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2020,7 +2020,7 @@
<target state="translated">哎呀!安全令牌不正确。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">272</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
@ -2682,10 +2682,6 @@
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">今天</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">348</context>
@ -2694,10 +2690,6 @@
<trans-unit id="7377728350294749129" datatype="html">
<source>YTD</source>
<target state="translated">年初至今</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">360</context>
@ -2706,10 +2698,6 @@
<trans-unit id="8768104874317770689" datatype="html">
<source>1Y</source>
<target state="translated">1年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">370</context>
@ -2718,10 +2706,6 @@
<trans-unit id="7304247106520037555" datatype="html">
<source>5Y</source>
<target state="translated">5年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">27</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">395</context>
@ -2730,10 +2714,6 @@
<trans-unit id="3667949571823271511" datatype="html">
<source>Max</source>
<target state="translated">最大限度</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">401</context>
@ -3024,7 +3004,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">183</context>
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
@ -3036,7 +3016,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
@ -3052,7 +3032,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">184</context>
<context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="1726363342938046830" datatype="html">
@ -4008,7 +3988,7 @@
<target state="translated">导入活动记录</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
@ -4016,7 +3996,7 @@
<target state="translated">导入股息</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
</trans-unit>
<trans-unit id="848497846891931418" datatype="html">
@ -4024,7 +4004,7 @@
<target state="translated">正在导入数据...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">165</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
@ -4032,7 +4012,7 @@
<target state="translated">导入已完成</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="8763985977445247551" datatype="html">
@ -4040,7 +4020,7 @@
<target state="translated">验证数据...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">281</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="4de7b521c9a386fa682d6c995b30f6bc2d6c14b8" datatype="html">
@ -4312,7 +4292,7 @@
<target state="translated">股息</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">73</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -4332,7 +4312,7 @@
<target state="translated">每月</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="8036977202721714375" datatype="html">
@ -4340,7 +4320,7 @@
<target state="translated">每年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="f6413089f93ac0756a20f8e74ef1ab78c81ef13c" datatype="html">
@ -5301,7 +5281,7 @@
<target state="translated">预计总额</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="3441715041566940420" datatype="html">
@ -5909,11 +5889,11 @@
<target state="translated">投资</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">79</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">95</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
@ -7172,7 +7152,7 @@
<target state="translated">AI 提示已复制到剪贴板</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">198</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="1616747898909934803" datatype="html">
@ -7260,7 +7240,7 @@
<target state="translated">打开 Duck.ai</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts</context>
<context context-type="linenumber">199</context>
<context context-type="linenumber">198</context>
</context-group>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
@ -7292,7 +7272,7 @@
<target state="translated">表现</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-overview/home-overview.component.ts</context>
<context context-type="linenumber">57</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/treemap-chart/treemap-chart.component.ts</context>

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

@ -1,4 +1,4 @@
import { AssetClass, AssetSubClass, DataSource } from '@prisma/client';
import { AssetClass, AssetSubClass, DataSource, Type } from '@prisma/client';
import { JobOptions, JobStatus } from 'bull';
import ms from 'ms';
@ -118,6 +118,12 @@ export const GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_OPTIONS: JobOptions = {
removeOnComplete: true
};
export const INVESTMENT_ACTIVITY_TYPES = [
Type.BUY,
Type.DIVIDEND,
Type.SELL
] as Type[];
export const PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME = 'PORTFOLIO';
export const PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS: JobOptions = {
removeOnComplete: true

8
libs/common/src/lib/interfaces/export.interface.ts

@ -8,6 +8,7 @@ import {
} from '@prisma/client';
import { AccountBalance } from './account-balance.interface';
import { MarketData } from './market-data.interface';
export interface Export {
accounts: (Omit<Account, 'createdAt' | 'updatedAt' | 'userId'> & {
@ -23,8 +24,11 @@ export interface Export {
| 'updatedAt'
| 'userId'
> & { dataSource: DataSource; date: string; symbol: string })[];
assetProfiles: (Omit<SymbolProfile, 'createdAt' | 'updatedAt' | 'userId'> & {
marketData: { date: string; marketPrice: number }[];
assetProfiles: (Omit<
SymbolProfile,
'createdAt' | 'id' | 'updatedAt' | 'userId'
> & {
marketData: MarketData[];
})[];
meta: {
date: string;

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

@ -25,6 +25,7 @@ import type { InfoItem } from './info-item.interface';
import type { InvestmentItem } from './investment-item.interface';
import type { LineChartItem } from './line-chart-item.interface';
import type { LookupItem } from './lookup-item.interface';
import type { MarketData } from './market-data.interface';
import type { PortfolioChart } from './portfolio-chart.interface';
import type { PortfolioDetails } from './portfolio-details.interface';
import type { PortfolioDividends } from './portfolio-dividends.interface';
@ -111,6 +112,7 @@ export {
LineChartItem,
LookupItem,
LookupResponse,
MarketData,
MarketDataDetailsResponse,
MarketDataOfMarketsResponse,
OAuthResponse,

4
libs/common/src/lib/interfaces/market-data.interface.ts

@ -0,0 +1,4 @@
export interface MarketData {
date: string;
marketPrice: number;
}

2
libs/common/src/lib/interfaces/responses/portfolio-report.interface.ts

@ -1,9 +1,11 @@
import { PortfolioReportRule } from '../portfolio-report-rule.interface';
export interface PortfolioReportResponse {
'x-ray': {
rules: { [group: string]: PortfolioReportRule[] };
statistics: {
rulesActiveCount: number;
rulesFulfilledCount: number;
};
};
}

111
libs/common/src/lib/personal-finance-tools.ts

@ -101,6 +101,33 @@ export const personalFinanceTools: Product[] = [
regions: ['Global'],
slogan: 'Take control of your financial future'
},
{
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'capitally',
name: 'Capitally',
origin: 'Poland',
pricingPerYear: '€50',
slogan: 'Optimize your investments performance'
},
{
founded: 2022,
isArchived: true,
key: 'capmon',
name: 'CapMon.org',
origin: 'Germany',
note: 'CapMon.org was discontinued in 2023',
slogan: 'Next Generation Assets Tracking'
},
{
founded: 2024,
hasFreePlan: true,
isOpenSource: true,
key: 'cleverbilling',
languages: ['Español'],
name: 'CleverBilling',
slogan: 'Toma el control total de tus finanzas.'
},
{
founded: 2017,
hasFreePlan: true,
@ -122,35 +149,6 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$120',
slogan: 'The leading Crypto Portfolio Tracker & Tax Calculator'
},
{
founded: 2022,
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'degiro-portfolio-tracker-by-capitalyse',
languages: ['English'],
name: 'DEGIRO Portfolio Tracker by Capitalyse',
origin: 'Netherlands',
pricingPerYear: '€24',
slogan: 'Democratizing Data Analytics'
},
{
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'capitally',
name: 'Capitally',
origin: 'Poland',
pricingPerYear: '€50',
slogan: 'Optimize your investments performance'
},
{
founded: 2022,
isArchived: true,
key: 'capmon',
name: 'CapMon.org',
origin: 'Germany',
note: 'CapMon.org was discontinued in 2023',
slogan: 'Next Generation Assets Tracking'
},
{
founded: 2019,
key: 'compound-planning',
@ -183,6 +181,28 @@ export const personalFinanceTools: Product[] = [
name: 'De.Fi',
slogan: 'DeFi Portfolio Tracker'
},
{
founded: 2016,
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'defi-portfolio-tracker-by-zerion',
languages: ['English'],
name: 'DeFi Portfolio Tracker by Zerion',
origin: 'United States',
pricingPerYear: '$99',
slogan: 'DeFi Portfolio Tracker for All Chains'
},
{
founded: 2022,
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'degiro-portfolio-tracker-by-capitalyse',
languages: ['English'],
name: 'DEGIRO Portfolio Tracker by Capitalyse',
origin: 'Netherlands',
pricingPerYear: '€24',
slogan: 'Democratizing Data Analytics'
},
{
founded: 2017,
hasFreePlan: true,
@ -194,6 +214,15 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$150',
slogan: 'The app to track all your investments. Make smart moves only.'
},
{
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'digrin',
languages: ['English'],
name: 'Digrin',
pricingPerYear: '$49.90',
slogan: 'Dividend Portfolio Tracker'
},
{
founded: 2019,
hasFreePlan: true,
@ -464,12 +493,11 @@ export const personalFinanceTools: Product[] = [
},
{
founded: 2021,
hasSelfHostingAbility: false,
isArchived: true,
key: 'maybe-finance',
languages: ['English'],
name: 'Maybe Finance',
note: 'Maybe Finance was discontinued in 2023',
note: 'Maybe Finance was discontinued in 2023, relaunched in 2024, and discontinued again in 2025',
origin: 'United States',
pricingPerYear: '$145',
regions: ['United States'],
@ -532,6 +560,17 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$60',
slogan: 'Gain financial control and keep your data private.'
},
{
founded: 2025,
hasFreePlan: true,
hasSelfHostingAbility: false,
key: 'monsy',
languages: ['English'],
name: 'Monsy',
origin: 'Indonesia',
pricingPerYear: '$20',
slogan: 'Smart, simple, stress-free money tracking.'
},
{
hasFreePlan: true,
hasSelfHostingAbility: false,
@ -858,6 +897,16 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$348',
slogan: 'Virtual Family Office for Smart Wealth Management'
},
{
founded: 2020,
hasFreePlan: false,
hasSelfHostingAbility: false,
key: 'walletguide',
name: 'Walletguide',
origin: 'Germany',
pricingPerYear: '€90',
slogan: 'Personal finance reimagined with AI'
},
{
hasSelfHostingAbility: false,
key: 'wallmine',

30
libs/ui/src/lib/activity-type/activity-type.component.stories.ts

@ -0,0 +1,30 @@
import { CommonModule } from '@angular/common';
import { IonIcon } from '@ionic/angular/standalone';
import { moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular';
import { GfActivityTypeComponent } from './activity-type.component';
export default {
title: 'Activity Type',
component: GfActivityTypeComponent,
decorators: [
moduleMetadata({
imports: [CommonModule, IonIcon]
})
],
argTypes: {
activityType: {
control: 'select',
options: ['BUY', 'DIVIDEND', 'FEE', 'INTEREST', 'LIABILITY', 'SELL']
}
}
} as Meta<GfActivityTypeComponent>;
type Story = StoryObj<GfActivityTypeComponent>;
export const Default: Story = {
args: {
activityType: 'BUY'
}
};

4
libs/ui/src/lib/fire-calculator/fire-calculator.component.html

@ -31,7 +31,9 @@
<mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Retirement Date</mat-label>
<div>
{{ calculatorForm.get('retirementDate').value | date: 'MMMM YYYY' }}
{{
calculatorForm.get('retirementDate')?.value | date: 'MMMM yyyy'
}}
</div>
<input
class="d-none"

1
libs/ui/src/lib/i18n.ts

@ -84,6 +84,7 @@ const locales = {
France: $localize`France`,
Germany: $localize`Germany`,
India: $localize`India`,
Indonesia: $localize`Indonesia`,
Italy: $localize`Italy`,
Japan: $localize`Japan`,
Netherlands: $localize`Netherlands`,

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

@ -0,0 +1 @@
export * from './toggle.component';

0
apps/client/src/app/components/toggle/toggle.component.html → libs/ui/src/lib/toggle/toggle.component.html

0
apps/client/src/app/components/toggle/toggle.component.scss → libs/ui/src/lib/toggle/toggle.component.scss

33
libs/ui/src/lib/toggle/toggle.component.stories.ts

@ -0,0 +1,33 @@
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { MatRadioModule } from '@angular/material/radio';
import { moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular';
import { GfToggleComponent } from './toggle.component';
export default {
title: 'Toggle',
component: GfToggleComponent,
decorators: [
moduleMetadata({
imports: [CommonModule, MatRadioModule, ReactiveFormsModule]
})
]
} as Meta<GfToggleComponent>;
type Story = StoryObj<GfToggleComponent>;
export const Default: Story = {
args: {
defaultValue: '1d',
isLoading: false,
options: [
{ label: 'Today', value: '1d' },
{ label: 'YTD', value: 'ytd' },
{ label: '1Y', value: '1y' },
{ label: '5Y', value: '5y' },
{ label: 'Max', value: 'max' }
]
}
};

14
apps/client/src/app/components/toggle/toggle.component.ts → libs/ui/src/lib/toggle/toggle.component.ts

@ -20,19 +20,11 @@ import { MatRadioModule } from '@angular/material/radio';
templateUrl: './toggle.component.html'
})
export class GfToggleComponent implements OnChanges {
public static DEFAULT_DATE_RANGE_OPTIONS: ToggleOption[] = [
{ label: $localize`Today`, value: '1d' },
{ label: $localize`YTD`, value: 'ytd' },
{ label: $localize`1Y`, value: '1y' },
{ label: $localize`5Y`, value: '5y' },
{ label: $localize`Max`, value: 'max' }
];
@Input() defaultValue: string;
@Input() isLoading: boolean;
@Input() options: ToggleOption[];
@Input() options: ToggleOption[] = [];
@Output() change = new EventEmitter<Pick<ToggleOption, 'value'>>();
@Output() valueChange = new EventEmitter<Pick<ToggleOption, 'value'>>();
public optionFormControl = new FormControl<string>(undefined);
@ -41,6 +33,6 @@ export class GfToggleComponent implements OnChanges {
}
public onValueChange() {
this.change.emit({ value: this.optionFormControl.value });
this.valueChange.emit({ value: this.optionFormControl.value });
}
}

4
package-lock.json

@ -1,12 +1,12 @@
{
"name": "ghostfolio",
"version": "2.184.0",
"version": "2.185.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
"version": "2.184.0",
"version": "2.185.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {

2
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.184.0",
"version": "2.185.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",

115
test/import/ok/sample.json

@ -16,6 +16,7 @@
"value": 1000
}
],
"comment": null,
"currency": "USD",
"id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
"isExcluded": false,
@ -23,30 +24,80 @@
"platformId": null
}
],
"assetProfiles": [
{
"assetClass": null,
"assetSubClass": null,
"comment": null,
"countries": [],
"currency": "USD",
"cusip": null,
"dataSource": "MANUAL",
"figi": null,
"figiComposite": null,
"figiShareClass": null,
"holdings": [],
"isActive": true,
"isin": null,
"marketData": [],
"name": "Account Opening Fee",
"scraperConfiguration": null,
"sectors": [],
"symbol": "14a69cb9-1e31-43fa-b320-83703d8ed74b",
"symbolMapping": {},
"url": null
},
{
"assetClass": null,
"assetSubClass": null,
"comment": null,
"countries": [],
"currency": "USD",
"cusip": null,
"dataSource": "MANUAL",
"figi": null,
"figiComposite": null,
"figiShareClass": null,
"holdings": [],
"isActive": true,
"isin": null,
"marketData": [],
"name": "Penthouse Apartment",
"scraperConfiguration": null,
"sectors": [],
"symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1",
"symbolMapping": {},
"url": null
}
],
"platforms": [],
"tags": [],
"activities": [
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
"comment": null,
"fee": 0,
"fee": 49,
"quantity": 0,
"type": "BUY",
"type": "FEE",
"unitPrice": 0,
"currency": "USD",
"dataSource": "YAHOO",
"date": "2050-06-06T00:00:00.000Z",
"symbol": "US5949181045"
"dataSource": "MANUAL",
"date": "2021-09-01T00:00:00.000Z",
"symbol": "14a69cb9-1e31-43fa-b320-83703d8ed74b",
"tags": []
},
{
"accountId": null,
"comment": null,
"fee": 0,
"quantity": 1,
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
"comment": "My first order 🤓",
"fee": 19,
"quantity": 5,
"type": "BUY",
"unitPrice": 500000,
"unitPrice": 298.58,
"currency": "USD",
"dataSource": "MANUAL",
"date": "2022-01-01T00:00:00.000Z",
"symbol": "Penthouse Apartment"
"dataSource": "YAHOO",
"date": "2021-09-16T00:00:00.000Z",
"symbol": "MSFT",
"tags": []
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
@ -58,31 +109,39 @@
"currency": "USD",
"dataSource": "YAHOO",
"date": "2021-11-17T00:00:00.000Z",
"symbol": "MSFT"
"symbol": "MSFT",
"tags": []
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
"comment": "My first order 🤓",
"fee": 19,
"quantity": 5,
"accountId": null,
"comment": null,
"fee": 0,
"quantity": 1,
"type": "BUY",
"unitPrice": 298.58,
"unitPrice": 500000,
"currency": "USD",
"dataSource": "YAHOO",
"date": "2021-09-16T00:00:00.000Z",
"symbol": "MSFT"
"dataSource": "MANUAL",
"date": "2022-01-01T00:00:00.000Z",
"symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1",
"tags": []
},
{
"accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0",
"comment": null,
"fee": 49,
"fee": 0,
"quantity": 0,
"type": "FEE",
"type": "BUY",
"unitPrice": 0,
"currency": "USD",
"dataSource": "MANUAL",
"date": "2021-09-01T00:00:00.000Z",
"symbol": "Account Opening Fee"
"dataSource": "YAHOO",
"date": "2050-06-06T00:00:00.000Z",
"symbol": "MSFT",
"tags": []
}
],
"user": {
"settings": {
"currency": "USD"
}
}
]
}

Loading…
Cancel
Save