diff --git a/CHANGELOG.md b/CHANGELOG.md index 96544fee7..f2b8c35b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,16 +9,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added the dividend yield to the position detail dialog (experimental) - Added support to override the asset class of an asset profile in the asset profile details dialog of the admin control - Added support to override the asset sub class of an asset profile in the asset profile details dialog of the admin control - Added support to override the url of an asset profile in the asset profile details dialog of the admin control +## 2.70.0 - 2024-04-02 + +### Added + +- Set up the language localization for Chinese (`zh`) +- Added `init: true` to the `docker-compose` files (`docker-compose.yml` and `docker-compose.build.yml`) to avoid zombie processes +- Set up _Webpack Bundle Analyzer_ + +### Changed + +- Disabled the option to update the cash balance of an account if date is not today +- Improved the usability of the date range support by specific years (`2023`, `2022`, `2021`, etc.) in the assistant (experimental) +- Introduced a factory for the portfolio calculations to support different algorithms in future + +### Fixed + +- Fixed the duplicated tags in the position detail dialog +- Removed `Tini` from the docker image + ## 2.69.0 - 2024-03-30 ### Added - Added the date range support in the activities table on the portfolio activities page (experimental) -- Extended the date range support by specific years (`2023`, `2022`, `2021`, etc.) in the assistant (experimental) +- Extended the date range support by specific years (`2021`, `2022`, `2023`, etc.) in the assistant (experimental) - Set up `Tini` to avoid zombie processes and perform signal forwarding in docker image ### Changed diff --git a/Dockerfile b/Dockerfile index aa578e235..f9396d0e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -56,13 +56,6 @@ RUN apt update && apt install -y \ openssl \ && rm -rf /var/lib/apt/lists/* -# Add tini, which is an init process that handles signaling within the container -# and with the host. See https://github.com/krallin/tini -ENV TINI_VERSION v0.19.0 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini -RUN chmod +x /tini -ENTRYPOINT ["/tini", "--"] - COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps COPY ./docker/entrypoint.sh /ghostfolio/entrypoint.sh WORKDIR /ghostfolio/apps/api diff --git a/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts new file mode 100644 index 000000000..ec744f624 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts @@ -0,0 +1,37 @@ +import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; +import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; +import { + SymbolMetrics, + TimelinePosition, + UniqueAsset +} from '@ghostfolio/common/interfaces'; + +export class MWRPortfolioCalculator extends PortfolioCalculator { + protected calculateOverallPerformance( + positions: TimelinePosition[] + ): CurrentPositions { + throw new Error('Method not implemented.'); + } + + protected getSymbolMetrics({ + dataSource, + end, + exchangeRates, + isChartMode = false, + marketSymbolMap, + start, + step = 1, + symbol + }: { + end: Date; + exchangeRates: { [dateString: string]: number }; + isChartMode?: boolean; + marketSymbolMap: { + [date: string]: { [symbol: string]: Big }; + }; + start: Date; + step?: number; + } & UniqueAsset): SymbolMetrics { + throw new Error('Method not implemented.'); + } +} diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts new file mode 100644 index 000000000..6d1939fcd --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts @@ -0,0 +1,25 @@ +export const activityDummyData = { + accountId: undefined, + accountUserId: undefined, + comment: undefined, + createdAt: new Date(), + feeInBaseCurrency: undefined, + id: undefined, + isDraft: false, + symbolProfileId: undefined, + updatedAt: new Date(), + userId: undefined, + value: undefined, + valueInBaseCurrency: undefined +}; + +export const symbolProfileDummyData = { + activitiesCount: undefined, + assetClass: undefined, + assetSubClass: undefined, + countries: [], + createdAt: undefined, + id: undefined, + sectors: [], + updatedAt: undefined +}; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts new file mode 100644 index 000000000..cf1fe9324 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -0,0 +1,51 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; + +import { Injectable } from '@nestjs/common'; + +import { MWRPortfolioCalculator } from './mwr/portfolio-calculator'; +import { PortfolioCalculator } from './portfolio-calculator'; +import { TWRPortfolioCalculator } from './twr/portfolio-calculator'; + +export enum PerformanceCalculationType { + MWR = 'MWR', // Money-Weighted Rate of Return + TWR = 'TWR' // Time-Weighted Rate of Return +} + +@Injectable() +export class PortfolioCalculatorFactory { + public constructor( + private readonly currentRateService: CurrentRateService, + private readonly exchangeRateDataService: ExchangeRateDataService + ) {} + + public createCalculator({ + activities, + calculationType, + currency + }: { + activities: Activity[]; + calculationType: PerformanceCalculationType; + currency: string; + }): PortfolioCalculator { + switch (calculationType) { + case PerformanceCalculationType.MWR: + return new MWRPortfolioCalculator({ + activities, + currency, + currentRateService: this.currentRateService, + exchangeRateDataService: this.exchangeRateDataService + }); + case PerformanceCalculationType.TWR: + return new TWRPortfolioCalculator({ + activities, + currency, + currentRateService: this.currentRateService, + exchangeRateDataService: this.exchangeRateDataService + }); + default: + throw new Error('Invalid calculation type'); + } + } +} diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts new file mode 100644 index 000000000..48fcaf343 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -0,0 +1,771 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; +import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; +import { TransactionPointSymbol } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point-symbol.interface'; +import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; +import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper'; +import { + DataProviderInfo, + HistoricalDataItem, + InvestmentItem, + ResponseError, + SymbolMetrics, + TimelinePosition, + UniqueAsset +} from '@ghostfolio/common/interfaces'; +import { GroupBy } from '@ghostfolio/common/types'; + +import { Big } from 'big.js'; +import { + eachDayOfInterval, + endOfDay, + format, + isBefore, + isSameDay, + max, + subDays +} from 'date-fns'; +import { last, uniq } from 'lodash'; + +export abstract class PortfolioCalculator { + protected static readonly ENABLE_LOGGING = false; + + protected orders: PortfolioOrder[]; + + private currency: string; + private currentRateService: CurrentRateService; + private dataProviderInfos: DataProviderInfo[]; + private exchangeRateDataService: ExchangeRateDataService; + private transactionPoints: TransactionPoint[]; + + public constructor({ + activities, + currency, + currentRateService, + exchangeRateDataService + }: { + activities: Activity[]; + currency: string; + currentRateService: CurrentRateService; + exchangeRateDataService: ExchangeRateDataService; + }) { + this.currency = currency; + this.currentRateService = currentRateService; + this.exchangeRateDataService = exchangeRateDataService; + this.orders = activities.map( + ({ date, fee, quantity, SymbolProfile, type, unitPrice }) => { + return { + SymbolProfile, + type, + date: format(date, DATE_FORMAT), + fee: new Big(fee), + quantity: new Big(quantity), + unitPrice: new Big(unitPrice) + }; + } + ); + + this.orders.sort((a, b) => { + return a.date?.localeCompare(b.date); + }); + + this.computeTransactionPoints(); + } + + protected abstract calculateOverallPerformance( + positions: TimelinePosition[] + ): CurrentPositions; + + public async getChartData({ + end = new Date(Date.now()), + start, + step = 1 + }: { + end?: Date; + start: Date; + step?: number; + }): Promise { + const symbols: { [symbol: string]: boolean } = {}; + + const transactionPointsBeforeEndDate = + this.transactionPoints?.filter((transactionPoint) => { + return isBefore(parseDate(transactionPoint.date), end); + }) ?? []; + + const currencies: { [symbol: string]: string } = {}; + const dataGatheringItems: IDataGatheringItem[] = []; + const firstIndex = transactionPointsBeforeEndDate.length; + + let dates = eachDayOfInterval({ start, end }, { step }).map((date) => { + return resetHours(date); + }); + + const includesEndDate = isSameDay(last(dates), end); + + if (!includesEndDate) { + dates.push(resetHours(end)); + } + + if (transactionPointsBeforeEndDate.length > 0) { + for (const { + currency, + dataSource, + symbol + } of transactionPointsBeforeEndDate[firstIndex - 1].items) { + dataGatheringItems.push({ + dataSource, + symbol + }); + currencies[symbol] = currency; + symbols[symbol] = true; + } + } + + const { dataProviderInfos, values: marketSymbols } = + await this.currentRateService.getValues({ + dataGatheringItems, + dateQuery: { + in: dates + } + }); + + this.dataProviderInfos = dataProviderInfos; + + const marketSymbolMap: { + [date: string]: { [symbol: string]: Big }; + } = {}; + + let exchangeRatesByCurrency = + await this.exchangeRateDataService.getExchangeRatesByCurrency({ + currencies: uniq(Object.values(currencies)), + endDate: endOfDay(end), + startDate: this.getStartDate(), + targetCurrency: this.currency + }); + + for (const marketSymbol of marketSymbols) { + const dateString = format(marketSymbol.date, DATE_FORMAT); + if (!marketSymbolMap[dateString]) { + marketSymbolMap[dateString] = {}; + } + if (marketSymbol.marketPrice) { + marketSymbolMap[dateString][marketSymbol.symbol] = new Big( + marketSymbol.marketPrice + ); + } + } + + const accumulatedValuesByDate: { + [date: string]: { + investmentValueWithCurrencyEffect: Big; + totalCurrentValue: Big; + totalCurrentValueWithCurrencyEffect: Big; + totalInvestmentValue: Big; + totalInvestmentValueWithCurrencyEffect: Big; + totalNetPerformanceValue: Big; + totalNetPerformanceValueWithCurrencyEffect: Big; + totalTimeWeightedInvestmentValue: Big; + totalTimeWeightedInvestmentValueWithCurrencyEffect: Big; + }; + } = {}; + + const valuesBySymbol: { + [symbol: string]: { + currentValues: { [date: string]: Big }; + currentValuesWithCurrencyEffect: { [date: string]: Big }; + investmentValuesAccumulated: { [date: string]: Big }; + investmentValuesAccumulatedWithCurrencyEffect: { [date: string]: Big }; + investmentValuesWithCurrencyEffect: { [date: string]: Big }; + netPerformanceValues: { [date: string]: Big }; + netPerformanceValuesWithCurrencyEffect: { [date: string]: Big }; + timeWeightedInvestmentValues: { [date: string]: Big }; + timeWeightedInvestmentValuesWithCurrencyEffect: { [date: string]: Big }; + }; + } = {}; + + for (const symbol of Object.keys(symbols)) { + const { + currentValues, + currentValuesWithCurrencyEffect, + investmentValuesAccumulated, + investmentValuesAccumulatedWithCurrencyEffect, + investmentValuesWithCurrencyEffect, + netPerformanceValues, + netPerformanceValuesWithCurrencyEffect, + timeWeightedInvestmentValues, + timeWeightedInvestmentValuesWithCurrencyEffect + } = this.getSymbolMetrics({ + end, + marketSymbolMap, + start, + step, + symbol, + dataSource: null, + exchangeRates: + exchangeRatesByCurrency[`${currencies[symbol]}${this.currency}`], + isChartMode: true + }); + + valuesBySymbol[symbol] = { + currentValues, + currentValuesWithCurrencyEffect, + investmentValuesAccumulated, + investmentValuesAccumulatedWithCurrencyEffect, + investmentValuesWithCurrencyEffect, + netPerformanceValues, + netPerformanceValuesWithCurrencyEffect, + timeWeightedInvestmentValues, + timeWeightedInvestmentValuesWithCurrencyEffect + }; + } + + for (const currentDate of dates) { + const dateString = format(currentDate, DATE_FORMAT); + + for (const symbol of Object.keys(valuesBySymbol)) { + const symbolValues = valuesBySymbol[symbol]; + + const currentValue = + symbolValues.currentValues?.[dateString] ?? new Big(0); + + const currentValueWithCurrencyEffect = + symbolValues.currentValuesWithCurrencyEffect?.[dateString] ?? + new Big(0); + + const investmentValueAccumulated = + symbolValues.investmentValuesAccumulated?.[dateString] ?? new Big(0); + + const investmentValueAccumulatedWithCurrencyEffect = + symbolValues.investmentValuesAccumulatedWithCurrencyEffect?.[ + dateString + ] ?? new Big(0); + + const investmentValueWithCurrencyEffect = + symbolValues.investmentValuesWithCurrencyEffect?.[dateString] ?? + new Big(0); + + const netPerformanceValue = + symbolValues.netPerformanceValues?.[dateString] ?? new Big(0); + + const netPerformanceValueWithCurrencyEffect = + symbolValues.netPerformanceValuesWithCurrencyEffect?.[dateString] ?? + new Big(0); + + const timeWeightedInvestmentValue = + symbolValues.timeWeightedInvestmentValues?.[dateString] ?? new Big(0); + + const timeWeightedInvestmentValueWithCurrencyEffect = + symbolValues.timeWeightedInvestmentValuesWithCurrencyEffect?.[ + dateString + ] ?? new Big(0); + + accumulatedValuesByDate[dateString] = { + investmentValueWithCurrencyEffect: ( + accumulatedValuesByDate[dateString] + ?.investmentValueWithCurrencyEffect ?? new Big(0) + ).add(investmentValueWithCurrencyEffect), + totalCurrentValue: ( + accumulatedValuesByDate[dateString]?.totalCurrentValue ?? new Big(0) + ).add(currentValue), + totalCurrentValueWithCurrencyEffect: ( + accumulatedValuesByDate[dateString] + ?.totalCurrentValueWithCurrencyEffect ?? new Big(0) + ).add(currentValueWithCurrencyEffect), + totalInvestmentValue: ( + accumulatedValuesByDate[dateString]?.totalInvestmentValue ?? + new Big(0) + ).add(investmentValueAccumulated), + totalInvestmentValueWithCurrencyEffect: ( + accumulatedValuesByDate[dateString] + ?.totalInvestmentValueWithCurrencyEffect ?? new Big(0) + ).add(investmentValueAccumulatedWithCurrencyEffect), + totalNetPerformanceValue: ( + accumulatedValuesByDate[dateString]?.totalNetPerformanceValue ?? + new Big(0) + ).add(netPerformanceValue), + totalNetPerformanceValueWithCurrencyEffect: ( + accumulatedValuesByDate[dateString] + ?.totalNetPerformanceValueWithCurrencyEffect ?? new Big(0) + ).add(netPerformanceValueWithCurrencyEffect), + totalTimeWeightedInvestmentValue: ( + accumulatedValuesByDate[dateString] + ?.totalTimeWeightedInvestmentValue ?? new Big(0) + ).add(timeWeightedInvestmentValue), + totalTimeWeightedInvestmentValueWithCurrencyEffect: ( + accumulatedValuesByDate[dateString] + ?.totalTimeWeightedInvestmentValueWithCurrencyEffect ?? new Big(0) + ).add(timeWeightedInvestmentValueWithCurrencyEffect) + }; + } + } + + return Object.entries(accumulatedValuesByDate).map(([date, values]) => { + const { + investmentValueWithCurrencyEffect, + totalCurrentValue, + totalCurrentValueWithCurrencyEffect, + totalInvestmentValue, + totalInvestmentValueWithCurrencyEffect, + totalNetPerformanceValue, + totalNetPerformanceValueWithCurrencyEffect, + totalTimeWeightedInvestmentValue, + totalTimeWeightedInvestmentValueWithCurrencyEffect + } = values; + + const netPerformanceInPercentage = totalTimeWeightedInvestmentValue.eq(0) + ? 0 + : totalNetPerformanceValue + .div(totalTimeWeightedInvestmentValue) + .mul(100) + .toNumber(); + + const netPerformanceInPercentageWithCurrencyEffect = + totalTimeWeightedInvestmentValueWithCurrencyEffect.eq(0) + ? 0 + : totalNetPerformanceValueWithCurrencyEffect + .div(totalTimeWeightedInvestmentValueWithCurrencyEffect) + .mul(100) + .toNumber(); + + return { + date, + netPerformanceInPercentage, + netPerformanceInPercentageWithCurrencyEffect, + investmentValueWithCurrencyEffect: + investmentValueWithCurrencyEffect.toNumber(), + netPerformance: totalNetPerformanceValue.toNumber(), + netPerformanceWithCurrencyEffect: + totalNetPerformanceValueWithCurrencyEffect.toNumber(), + totalInvestment: totalInvestmentValue.toNumber(), + totalInvestmentValueWithCurrencyEffect: + totalInvestmentValueWithCurrencyEffect.toNumber(), + value: totalCurrentValue.toNumber(), + valueWithCurrencyEffect: totalCurrentValueWithCurrencyEffect.toNumber() + }; + }); + } + + public async getCurrentPositions( + start: Date, + end?: Date + ): Promise { + const lastTransactionPoint = last(this.transactionPoints); + + let endDate = end; + + if (!endDate) { + endDate = new Date(Date.now()); + + if (lastTransactionPoint) { + endDate = max([endDate, parseDate(lastTransactionPoint.date)]); + } + } + + const transactionPoints = this.transactionPoints?.filter(({ date }) => { + return isBefore(parseDate(date), endDate); + }); + + if (!transactionPoints.length) { + return { + currentValueInBaseCurrency: new Big(0), + grossPerformance: new Big(0), + grossPerformancePercentage: new Big(0), + grossPerformancePercentageWithCurrencyEffect: new Big(0), + grossPerformanceWithCurrencyEffect: new Big(0), + hasErrors: false, + netPerformance: new Big(0), + netPerformancePercentage: new Big(0), + netPerformancePercentageWithCurrencyEffect: new Big(0), + netPerformanceWithCurrencyEffect: new Big(0), + positions: [], + totalInvestment: new Big(0), + totalInvestmentWithCurrencyEffect: new Big(0) + }; + } + + const currencies: { [symbol: string]: string } = {}; + const dataGatheringItems: IDataGatheringItem[] = []; + let dates: Date[] = []; + let firstIndex = transactionPoints.length; + let firstTransactionPoint: TransactionPoint = null; + + dates.push(resetHours(start)); + + for (const { currency, dataSource, symbol } of transactionPoints[ + firstIndex - 1 + ].items) { + dataGatheringItems.push({ + dataSource, + symbol + }); + + currencies[symbol] = currency; + } + + for (let i = 0; i < transactionPoints.length; i++) { + if ( + !isBefore(parseDate(transactionPoints[i].date), start) && + firstTransactionPoint === null + ) { + firstTransactionPoint = transactionPoints[i]; + firstIndex = i; + } + + if (firstTransactionPoint !== null) { + dates.push(resetHours(parseDate(transactionPoints[i].date))); + } + } + + dates.push(resetHours(endDate)); + + // Add dates of last week for fallback + dates.push(subDays(resetHours(new Date()), 7)); + dates.push(subDays(resetHours(new Date()), 6)); + dates.push(subDays(resetHours(new Date()), 5)); + dates.push(subDays(resetHours(new Date()), 4)); + dates.push(subDays(resetHours(new Date()), 3)); + dates.push(subDays(resetHours(new Date()), 2)); + dates.push(subDays(resetHours(new Date()), 1)); + dates.push(resetHours(new Date())); + + dates = uniq( + dates.map((date) => { + return date.getTime(); + }) + ) + .map((timestamp) => { + return new Date(timestamp); + }) + .sort((a, b) => { + return a.getTime() - b.getTime(); + }); + + let exchangeRatesByCurrency = + await this.exchangeRateDataService.getExchangeRatesByCurrency({ + currencies: uniq(Object.values(currencies)), + endDate: endOfDay(endDate), + startDate: this.getStartDate(), + targetCurrency: this.currency + }); + + const { + dataProviderInfos, + errors: currentRateErrors, + values: marketSymbols + } = await this.currentRateService.getValues({ + dataGatheringItems, + dateQuery: { + in: dates + } + }); + + this.dataProviderInfos = dataProviderInfos; + + const marketSymbolMap: { + [date: string]: { [symbol: string]: Big }; + } = {}; + + for (const marketSymbol of marketSymbols) { + const date = format(marketSymbol.date, DATE_FORMAT); + + if (!marketSymbolMap[date]) { + marketSymbolMap[date] = {}; + } + + if (marketSymbol.marketPrice) { + marketSymbolMap[date][marketSymbol.symbol] = new Big( + marketSymbol.marketPrice + ); + } + } + + const endDateString = format(endDate, DATE_FORMAT); + + if (firstIndex > 0) { + firstIndex--; + } + + const positions: TimelinePosition[] = []; + let hasAnySymbolMetricsErrors = false; + + const errors: ResponseError['errors'] = []; + + for (const item of lastTransactionPoint.items) { + const marketPriceInBaseCurrency = ( + marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice + ).mul( + exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ + endDateString + ] + ); + + const { + grossPerformance, + grossPerformancePercentage, + grossPerformancePercentageWithCurrencyEffect, + grossPerformanceWithCurrencyEffect, + hasErrors, + netPerformance, + netPerformancePercentage, + netPerformancePercentageWithCurrencyEffect, + netPerformanceWithCurrencyEffect, + timeWeightedInvestment, + timeWeightedInvestmentWithCurrencyEffect, + totalDividend, + totalDividendInBaseCurrency, + totalInvestment, + totalInvestmentWithCurrencyEffect + } = this.getSymbolMetrics({ + marketSymbolMap, + start, + dataSource: item.dataSource, + end: endDate, + exchangeRates: + exchangeRatesByCurrency[`${item.currency}${this.currency}`], + symbol: item.symbol + }); + + hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; + + positions.push({ + dividend: totalDividend, + dividendInBaseCurrency: totalDividendInBaseCurrency, + timeWeightedInvestment, + timeWeightedInvestmentWithCurrencyEffect, + averagePrice: item.averagePrice, + currency: item.currency, + dataSource: item.dataSource, + fee: item.fee, + firstBuyDate: item.firstBuyDate, + grossPerformance: !hasErrors ? grossPerformance ?? null : null, + grossPerformancePercentage: !hasErrors + ? grossPerformancePercentage ?? null + : null, + grossPerformancePercentageWithCurrencyEffect: !hasErrors + ? grossPerformancePercentageWithCurrencyEffect ?? null + : null, + grossPerformanceWithCurrencyEffect: !hasErrors + ? grossPerformanceWithCurrencyEffect ?? null + : null, + investment: totalInvestment, + investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect, + marketPrice: + marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null, + marketPriceInBaseCurrency: + marketPriceInBaseCurrency?.toNumber() ?? null, + netPerformance: !hasErrors ? netPerformance ?? null : null, + netPerformancePercentage: !hasErrors + ? netPerformancePercentage ?? null + : null, + netPerformancePercentageWithCurrencyEffect: !hasErrors + ? netPerformancePercentageWithCurrencyEffect ?? null + : null, + netPerformanceWithCurrencyEffect: !hasErrors + ? netPerformanceWithCurrencyEffect ?? null + : null, + quantity: item.quantity, + symbol: item.symbol, + tags: item.tags, + transactionCount: item.transactionCount, + valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul( + item.quantity + ) + }); + + if ( + (hasErrors || + currentRateErrors.find(({ dataSource, symbol }) => { + return dataSource === item.dataSource && symbol === item.symbol; + })) && + item.investment.gt(0) + ) { + errors.push({ dataSource: item.dataSource, symbol: item.symbol }); + } + } + + const overall = this.calculateOverallPerformance(positions); + + return { + ...overall, + errors, + positions, + hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors + }; + } + + public getDataProviderInfos() { + return this.dataProviderInfos; + } + + public getInvestments(): { date: string; investment: Big }[] { + if (this.transactionPoints.length === 0) { + return []; + } + + return this.transactionPoints.map((transactionPoint) => { + return { + date: transactionPoint.date, + investment: transactionPoint.items.reduce( + (investment, transactionPointSymbol) => + investment.plus(transactionPointSymbol.investment), + new Big(0) + ) + }; + }); + } + + public getInvestmentsByGroup({ + data, + groupBy + }: { + data: HistoricalDataItem[]; + groupBy: GroupBy; + }): InvestmentItem[] { + const groupedData: { [dateGroup: string]: Big } = {}; + + for (const { date, investmentValueWithCurrencyEffect } of data) { + const dateGroup = + groupBy === 'month' ? date.substring(0, 7) : date.substring(0, 4); + groupedData[dateGroup] = (groupedData[dateGroup] ?? new Big(0)).plus( + investmentValueWithCurrencyEffect + ); + } + + return Object.keys(groupedData).map((dateGroup) => ({ + date: groupBy === 'month' ? `${dateGroup}-01` : `${dateGroup}-01-01`, + investment: groupedData[dateGroup].toNumber() + })); + } + + public getStartDate() { + return this.transactionPoints.length > 0 + ? parseDate(this.transactionPoints[0].date) + : new Date(); + } + + protected abstract getSymbolMetrics({ + dataSource, + end, + exchangeRates, + isChartMode, + marketSymbolMap, + start, + step, + symbol + }: { + end: Date; + exchangeRates: { [dateString: string]: number }; + isChartMode?: boolean; + marketSymbolMap: { + [date: string]: { [symbol: string]: Big }; + }; + start: Date; + step?: number; + } & UniqueAsset): SymbolMetrics; + + public getTransactionPoints() { + return this.transactionPoints; + } + + private computeTransactionPoints() { + this.transactionPoints = []; + const symbols: { [symbol: string]: TransactionPointSymbol } = {}; + + let lastDate: string = null; + let lastTransactionPoint: TransactionPoint = null; + + for (const { + fee, + date, + quantity, + SymbolProfile, + tags, + type, + unitPrice + } of this.orders) { + let currentTransactionPointItem: TransactionPointSymbol; + const oldAccumulatedSymbol = symbols[SymbolProfile.symbol]; + + const factor = getFactor(type); + + if (oldAccumulatedSymbol) { + let investment = oldAccumulatedSymbol.investment; + + const newQuantity = quantity + .mul(factor) + .plus(oldAccumulatedSymbol.quantity); + + if (type === 'BUY') { + investment = oldAccumulatedSymbol.investment.plus( + quantity.mul(unitPrice) + ); + } else if (type === 'SELL') { + investment = oldAccumulatedSymbol.investment.minus( + quantity.mul(oldAccumulatedSymbol.averagePrice) + ); + } + + currentTransactionPointItem = { + investment, + tags, + averagePrice: newQuantity.gt(0) + ? investment.div(newQuantity) + : new Big(0), + currency: SymbolProfile.currency, + dataSource: SymbolProfile.dataSource, + dividend: new Big(0), + fee: fee.plus(oldAccumulatedSymbol.fee), + firstBuyDate: oldAccumulatedSymbol.firstBuyDate, + quantity: newQuantity, + symbol: SymbolProfile.symbol, + transactionCount: oldAccumulatedSymbol.transactionCount + 1 + }; + } else { + currentTransactionPointItem = { + fee, + tags, + averagePrice: unitPrice, + currency: SymbolProfile.currency, + dataSource: SymbolProfile.dataSource, + dividend: new Big(0), + firstBuyDate: date, + investment: unitPrice.mul(quantity).mul(factor), + quantity: quantity.mul(factor), + symbol: SymbolProfile.symbol, + transactionCount: 1 + }; + } + + symbols[SymbolProfile.symbol] = currentTransactionPointItem; + + const items = lastTransactionPoint?.items ?? []; + + const newItems = items.filter(({ symbol }) => { + return symbol !== SymbolProfile.symbol; + }); + + newItems.push(currentTransactionPointItem); + + newItems.sort((a, b) => { + return a.symbol?.localeCompare(b.symbol); + }); + + if (lastDate !== date || lastTransactionPoint === null) { + lastTransactionPoint = { + date, + items: newItems + }; + + this.transactionPoints.push(lastTransactionPoint); + } else { + lastTransactionPoint.items = newItems; + } + + lastDate = date; + } + } +} diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index e08de8e22..ee71a1fb3 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PortfolioCalculatorFactory, + PerformanceCalculationType +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +14,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +26,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,54 +37,66 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with BALN.SW buy and sell in two activities', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2021-11-22'), - fee: 1.55, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'BUY', - unitPrice: 142.9 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-11-22'), + fee: 1.55, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' }, - { - date: new Date('2021-11-30'), - fee: 1.65, - quantity: 1, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'SELL', - unitPrice: 136.6 + type: 'BUY', + unitPrice: 142.9 + }, + { + ...activityDummyData, + date: new Date('2021-11-30'), + fee: 1.65, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' }, - { - date: new Date('2021-11-30'), - fee: 0, - quantity: 1, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'SELL', - unitPrice: 136.6 - } - ], + type: 'SELL', + unitPrice: 136.6 + }, + { + ...activityDummyData, + date: new Date('2021-11-30'), + fee: 0, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + type: 'SELL', + unitPrice: 136.6 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts index 411c5e4db..69078be7c 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +14,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +26,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,41 +37,51 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with BALN.SW buy and sell', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2021-11-22'), - fee: 1.55, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'BUY', - unitPrice: 142.9 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-11-22'), + fee: 1.55, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' }, - { - date: new Date('2021-11-30'), - fee: 1.65, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'SELL', - unitPrice: 136.6 - } - ], + type: 'BUY', + unitPrice: 142.9 + }, + { + ...activityDummyData, + date: new Date('2021-11-30'), + fee: 1.65, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + type: 'SELL', + unitPrice: 136.6 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts index 32f582647..b52aac68d 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PortfolioCalculatorFactory, + PerformanceCalculationType +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +14,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +26,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,28 +37,36 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with BALN.SW buy', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2021-11-30'), - fee: 1.55, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Bâloise Holding AG', - symbol: 'BALN.SW' - }, - type: 'BUY', - unitPrice: 136.6 - } - ], + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-11-30'), + fee: 1.55, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + type: 'BUY', + unitPrice: 136.6 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index f5687f810..420ba48f1 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PortfolioCalculatorFactory, + PerformanceCalculationType +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -7,8 +15,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -33,6 +39,7 @@ jest.mock( describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -43,41 +50,51 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with BTCUSD buy and sell partially', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2015-01-01'), - fee: 0, - quantity: 2, - SymbolProfile: { - currency: 'USD', - dataSource: 'YAHOO', - name: 'Bitcoin USD', - symbol: 'BTCUSD' - }, - type: 'BUY', - unitPrice: 320.43 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2015-01-01'), + fee: 0, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: 'YAHOO', + name: 'Bitcoin USD', + symbol: 'BTCUSD' }, - { - date: new Date('2017-12-31'), - fee: 0, - quantity: 1, - SymbolProfile: { - currency: 'USD', - dataSource: 'YAHOO', - name: 'Bitcoin USD', - symbol: 'BTCUSD' - }, - type: 'SELL', - unitPrice: 14156.4 - } - ], + type: 'BUY', + unitPrice: 320.43 + }, + { + ...activityDummyData, + date: new Date('2017-12-31'), + fee: 0, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: 'YAHOO', + name: 'Bitcoin USD', + symbol: 'BTCUSD' + }, + type: 'SELL', + unitPrice: 14156.4 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts index 743733733..5f33d771b 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PortfolioCalculatorFactory, + PerformanceCalculationType +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -7,8 +15,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -33,6 +39,7 @@ jest.mock( describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -43,28 +50,36 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with GOOGL buy', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2023-01-03'), - fee: 1, - quantity: 1, - SymbolProfile: { - currency: 'USD', - dataSource: 'YAHOO', - name: 'Alphabet Inc.', - symbol: 'GOOGL' - }, - type: 'BUY', - unitPrice: 89.12 - } - ], + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2023-01-03'), + fee: 1, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: 'YAHOO', + name: 'Alphabet Inc.', + symbol: 'GOOGL' + }, + type: 'BUY', + unitPrice: 89.12 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts index afd5e9ff2..a2c106784 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -7,8 +15,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -33,6 +39,7 @@ jest.mock( describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -43,41 +50,51 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with MSFT buy', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2021-09-16'), - fee: 19, - quantity: 1, - SymbolProfile: { - currency: 'USD', - dataSource: 'YAHOO', - name: 'Microsoft Inc.', - symbol: 'MSFT' - }, - type: 'BUY', - unitPrice: 298.58 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-09-16'), + fee: 19, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: 'YAHOO', + name: 'Microsoft Inc.', + symbol: 'MSFT' }, - { - date: new Date('2021-11-16'), - fee: 0, - quantity: 1, - SymbolProfile: { - currency: 'USD', - dataSource: 'YAHOO', - name: 'Microsoft Inc.', - symbol: 'MSFT' - }, - type: 'DIVIDEND', - unitPrice: 0.62 - } - ], + type: 'BUY', + unitPrice: 298.58 + }, + { + ...activityDummyData, + date: new Date('2021-11-16'), + fee: 0, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: 'YAHOO', + name: 'Microsoft Inc.', + symbol: 'MSFT' + }, + type: 'DIVIDEND', + unitPrice: 0.62 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'USD' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts index 39a563b85..905747519 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts @@ -1,3 +1,7 @@ +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +10,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; import { subDays } from 'date-fns'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +22,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,14 +33,18 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it('with no orders', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, + const portfolioCalculator = factory.createCalculator({ activities: [], + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); @@ -73,7 +80,8 @@ describe('PortfolioCalculator', () => { netPerformancePercentageWithCurrencyEffect: new Big(0), netPerformanceWithCurrencyEffect: new Big(0), positions: [], - totalInvestment: new Big(0) + totalInvestment: new Big(0), + totalInvestmentWithCurrencyEffect: new Big(0) }); expect(investments).toEqual([]); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index d7e7c6eab..21e0bb499 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +14,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +26,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,44 +37,53 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with NOVN.SW buy and sell partially', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2022-03-07'), - fee: 1.3, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Novartis AG', - symbol: 'NOVN.SW' - }, - type: 'BUY', - unitPrice: 75.8 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2022-03-07'), + fee: 1.3, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' }, - { - date: new Date('2022-04-08'), - fee: 2.95, - quantity: 1, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Novartis AG', - symbol: 'NOVN.SW' - }, - type: 'SELL', - unitPrice: 85.73 - } - ], + type: 'BUY', + unitPrice: 75.8 + }, + { + ...activityDummyData, + date: new Date('2022-04-08'), + fee: 2.95, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' + }, + type: 'SELL', + unitPrice: 85.73 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); - const spy = jest .spyOn(Date, 'now') .mockImplementation(() => parseDate('2022-04-11').getTime()); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts index 68eecea22..28920ece7 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -1,4 +1,12 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + symbolProfileDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -6,8 +14,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; -import { PortfolioCalculator } from './portfolio-calculator'; - jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -20,6 +26,7 @@ jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -30,41 +37,51 @@ describe('PortfolioCalculator', () => { null, null ); + + factory = new PortfolioCalculatorFactory( + currentRateService, + exchangeRateDataService + ); }); describe('get current positions', () => { it.only('with NOVN.SW buy and sell', async () => { - const portfolioCalculator = new PortfolioCalculator({ - currentRateService, - exchangeRateDataService, - activities: [ - { - date: new Date('2022-03-07'), - fee: 0, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Novartis AG', - symbol: 'NOVN.SW' - }, - type: 'BUY', - unitPrice: 75.8 + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2022-03-07'), + fee: 0, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' }, - { - date: new Date('2022-04-08'), - fee: 0, - quantity: 2, - SymbolProfile: { - currency: 'CHF', - dataSource: 'YAHOO', - name: 'Novartis AG', - symbol: 'NOVN.SW' - }, - type: 'SELL', - unitPrice: 85.73 - } - ], + type: 'BUY', + unitPrice: 75.8 + }, + { + ...activityDummyData, + date: new Date('2022-04-08'), + fee: 0, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' + }, + type: 'SELL', + unitPrice: 85.73 + } + ]; + + const portfolioCalculator = factory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.TWR, currency: 'CHF' }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts index de011d813..365593846 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts @@ -1,13 +1,11 @@ +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; -import { Big } from 'big.js'; - -import { PortfolioCalculator } from './portfolio-calculator'; - describe('PortfolioCalculator', () => { let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; + let factory: PortfolioCalculatorFactory; beforeEach(() => { currentRateService = new CurrentRateService(null, null, null, null); @@ -18,67 +16,12 @@ describe('PortfolioCalculator', () => { null, null ); - }); - describe('annualized performance percentage', () => { - const portfolioCalculator = new PortfolioCalculator({ - activities: [], + factory = new PortfolioCalculatorFactory( currentRateService, - exchangeRateDataService, - currency: 'USD' - }); - - it('Get annualized performance', async () => { - expect( - portfolioCalculator - .getAnnualizedPerformancePercent({ - daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day - netPerformancePercent: new Big(0) - }) - .toNumber() - ).toEqual(0); - - expect( - portfolioCalculator - .getAnnualizedPerformancePercent({ - daysInMarket: 0, - netPerformancePercent: new Big(0) - }) - .toNumber() - ).toEqual(0); - - /** - * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html - */ - expect( - portfolioCalculator - .getAnnualizedPerformancePercent({ - daysInMarket: 65, // < 1 year - netPerformancePercent: new Big(0.1025) - }) - .toNumber() - ).toBeCloseTo(0.729705); - - expect( - portfolioCalculator - .getAnnualizedPerformancePercent({ - daysInMarket: 365, // 1 year - netPerformancePercent: new Big(0.05) - }) - .toNumber() - ).toBeCloseTo(0.05); - - /** - * Source: https://www.investopedia.com/terms/a/annualized-total-return.asp#annualized-return-formula-and-calculation - */ - expect( - portfolioCalculator - .getAnnualizedPerformancePercent({ - daysInMarket: 575, // > 1 year - netPerformancePercent: new Big(0.2374) - }) - .toNumber() - ).toBeCloseTo(0.145); - }); + exchangeRateDataService + ); }); + + test.skip('Skip empty test', () => 1); }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 6ea93a670..0fee9c5c7 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -1,24 +1,13 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; -import { PortfolioOrderItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator.interface'; -import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; -import { TransactionPointSymbol } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point-symbol.interface'; -import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; +import { PortfolioOrderItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order-item.interface'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; -import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { - DataProviderInfo, - HistoricalDataItem, - InvestmentItem, - ResponseError, SymbolMetrics, TimelinePosition, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { GroupBy } from '@ghostfolio/common/types'; import { Logger } from '@nestjs/common'; import { Big } from 'big.js'; @@ -26,638 +15,15 @@ import { addDays, addMilliseconds, differenceInDays, - eachDayOfInterval, - endOfDay, format, - isBefore, - isSameDay, - max, - subDays + isBefore } from 'date-fns'; -import { cloneDeep, first, isNumber, last, sortBy, uniq } from 'lodash'; - -export class PortfolioCalculator { - private static readonly ENABLE_LOGGING = false; - - private currency: string; - private currentRateService: CurrentRateService; - private dataProviderInfos: DataProviderInfo[]; - private exchangeRateDataService: ExchangeRateDataService; - private orders: PortfolioOrder[]; - private transactionPoints: TransactionPoint[]; - - public constructor({ - activities, - currency, - currentRateService, - exchangeRateDataService - }: { - activities: Activity[]; - currency: string; - currentRateService: CurrentRateService; - exchangeRateDataService: ExchangeRateDataService; - }) { - this.currency = currency; - this.currentRateService = currentRateService; - this.exchangeRateDataService = exchangeRateDataService; - this.orders = activities.map( - ({ date, fee, quantity, SymbolProfile, type, unitPrice }) => { - return { - SymbolProfile, - type, - date: format(date, DATE_FORMAT), - fee: new Big(fee), - quantity: new Big(quantity), - unitPrice: new Big(unitPrice) - }; - } - ); - - this.orders.sort((a, b) => { - return a.date?.localeCompare(b.date); - }); - - this.computeTransactionPoints(); - } - - public getAnnualizedPerformancePercent({ - daysInMarket, - netPerformancePercent - }: { - daysInMarket: number; - netPerformancePercent: Big; - }): Big { - if (isNumber(daysInMarket) && daysInMarket > 0) { - const exponent = new Big(365).div(daysInMarket).toNumber(); - return new Big( - Math.pow(netPerformancePercent.plus(1).toNumber(), exponent) - ).minus(1); - } - - return new Big(0); - } - - public async getChartData({ - end = new Date(Date.now()), - start, - step = 1 - }: { - end?: Date; - start: Date; - step?: number; - }): Promise { - const symbols: { [symbol: string]: boolean } = {}; - - const transactionPointsBeforeEndDate = - this.transactionPoints?.filter((transactionPoint) => { - return isBefore(parseDate(transactionPoint.date), end); - }) ?? []; - - const currencies: { [symbol: string]: string } = {}; - const dataGatheringItems: IDataGatheringItem[] = []; - const firstIndex = transactionPointsBeforeEndDate.length; - - let dates = eachDayOfInterval({ start, end }, { step }).map((date) => { - return resetHours(date); - }); - - const includesEndDate = isSameDay(last(dates), end); - - if (!includesEndDate) { - dates.push(resetHours(end)); - } - - if (transactionPointsBeforeEndDate.length > 0) { - for (const { - currency, - dataSource, - symbol - } of transactionPointsBeforeEndDate[firstIndex - 1].items) { - dataGatheringItems.push({ - dataSource, - symbol - }); - currencies[symbol] = currency; - symbols[symbol] = true; - } - } - - const { dataProviderInfos, values: marketSymbols } = - await this.currentRateService.getValues({ - dataGatheringItems, - dateQuery: { - in: dates - } - }); - - this.dataProviderInfos = dataProviderInfos; - - const marketSymbolMap: { - [date: string]: { [symbol: string]: Big }; - } = {}; - - let exchangeRatesByCurrency = - await this.exchangeRateDataService.getExchangeRatesByCurrency({ - currencies: uniq(Object.values(currencies)), - endDate: endOfDay(end), - startDate: this.getStartDate(), - targetCurrency: this.currency - }); - - for (const marketSymbol of marketSymbols) { - const dateString = format(marketSymbol.date, DATE_FORMAT); - if (!marketSymbolMap[dateString]) { - marketSymbolMap[dateString] = {}; - } - if (marketSymbol.marketPrice) { - marketSymbolMap[dateString][marketSymbol.symbol] = new Big( - marketSymbol.marketPrice - ); - } - } - - const accumulatedValuesByDate: { - [date: string]: { - investmentValueWithCurrencyEffect: Big; - totalCurrentValue: Big; - totalCurrentValueWithCurrencyEffect: Big; - totalInvestmentValue: Big; - totalInvestmentValueWithCurrencyEffect: Big; - totalNetPerformanceValue: Big; - totalNetPerformanceValueWithCurrencyEffect: Big; - totalTimeWeightedInvestmentValue: Big; - totalTimeWeightedInvestmentValueWithCurrencyEffect: Big; - }; - } = {}; - - const valuesBySymbol: { - [symbol: string]: { - currentValues: { [date: string]: Big }; - currentValuesWithCurrencyEffect: { [date: string]: Big }; - investmentValuesAccumulated: { [date: string]: Big }; - investmentValuesAccumulatedWithCurrencyEffect: { [date: string]: Big }; - investmentValuesWithCurrencyEffect: { [date: string]: Big }; - netPerformanceValues: { [date: string]: Big }; - netPerformanceValuesWithCurrencyEffect: { [date: string]: Big }; - timeWeightedInvestmentValues: { [date: string]: Big }; - timeWeightedInvestmentValuesWithCurrencyEffect: { [date: string]: Big }; - }; - } = {}; - - for (const symbol of Object.keys(symbols)) { - const { - currentValues, - currentValuesWithCurrencyEffect, - investmentValuesAccumulated, - investmentValuesAccumulatedWithCurrencyEffect, - investmentValuesWithCurrencyEffect, - netPerformanceValues, - netPerformanceValuesWithCurrencyEffect, - timeWeightedInvestmentValues, - timeWeightedInvestmentValuesWithCurrencyEffect - } = this.getSymbolMetrics({ - end, - marketSymbolMap, - start, - step, - symbol, - dataSource: null, - exchangeRates: - exchangeRatesByCurrency[`${currencies[symbol]}${this.currency}`], - isChartMode: true - }); - - valuesBySymbol[symbol] = { - currentValues, - currentValuesWithCurrencyEffect, - investmentValuesAccumulated, - investmentValuesAccumulatedWithCurrencyEffect, - investmentValuesWithCurrencyEffect, - netPerformanceValues, - netPerformanceValuesWithCurrencyEffect, - timeWeightedInvestmentValues, - timeWeightedInvestmentValuesWithCurrencyEffect - }; - } - - for (const currentDate of dates) { - const dateString = format(currentDate, DATE_FORMAT); - - for (const symbol of Object.keys(valuesBySymbol)) { - const symbolValues = valuesBySymbol[symbol]; - - const currentValue = - symbolValues.currentValues?.[dateString] ?? new Big(0); - - const currentValueWithCurrencyEffect = - symbolValues.currentValuesWithCurrencyEffect?.[dateString] ?? - new Big(0); - - const investmentValueAccumulated = - symbolValues.investmentValuesAccumulated?.[dateString] ?? new Big(0); - - const investmentValueAccumulatedWithCurrencyEffect = - symbolValues.investmentValuesAccumulatedWithCurrencyEffect?.[ - dateString - ] ?? new Big(0); - - const investmentValueWithCurrencyEffect = - symbolValues.investmentValuesWithCurrencyEffect?.[dateString] ?? - new Big(0); - - const netPerformanceValue = - symbolValues.netPerformanceValues?.[dateString] ?? new Big(0); - - const netPerformanceValueWithCurrencyEffect = - symbolValues.netPerformanceValuesWithCurrencyEffect?.[dateString] ?? - new Big(0); - - const timeWeightedInvestmentValue = - symbolValues.timeWeightedInvestmentValues?.[dateString] ?? new Big(0); - - const timeWeightedInvestmentValueWithCurrencyEffect = - symbolValues.timeWeightedInvestmentValuesWithCurrencyEffect?.[ - dateString - ] ?? new Big(0); - - accumulatedValuesByDate[dateString] = { - investmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.investmentValueWithCurrencyEffect ?? new Big(0) - ).add(investmentValueWithCurrencyEffect), - totalCurrentValue: ( - accumulatedValuesByDate[dateString]?.totalCurrentValue ?? new Big(0) - ).add(currentValue), - totalCurrentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalCurrentValueWithCurrencyEffect ?? new Big(0) - ).add(currentValueWithCurrencyEffect), - totalInvestmentValue: ( - accumulatedValuesByDate[dateString]?.totalInvestmentValue ?? - new Big(0) - ).add(investmentValueAccumulated), - totalInvestmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalInvestmentValueWithCurrencyEffect ?? new Big(0) - ).add(investmentValueAccumulatedWithCurrencyEffect), - totalNetPerformanceValue: ( - accumulatedValuesByDate[dateString]?.totalNetPerformanceValue ?? - new Big(0) - ).add(netPerformanceValue), - totalNetPerformanceValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalNetPerformanceValueWithCurrencyEffect ?? new Big(0) - ).add(netPerformanceValueWithCurrencyEffect), - totalTimeWeightedInvestmentValue: ( - accumulatedValuesByDate[dateString] - ?.totalTimeWeightedInvestmentValue ?? new Big(0) - ).add(timeWeightedInvestmentValue), - totalTimeWeightedInvestmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalTimeWeightedInvestmentValueWithCurrencyEffect ?? new Big(0) - ).add(timeWeightedInvestmentValueWithCurrencyEffect) - }; - } - } - - return Object.entries(accumulatedValuesByDate).map(([date, values]) => { - const { - investmentValueWithCurrencyEffect, - totalCurrentValue, - totalCurrentValueWithCurrencyEffect, - totalInvestmentValue, - totalInvestmentValueWithCurrencyEffect, - totalNetPerformanceValue, - totalNetPerformanceValueWithCurrencyEffect, - totalTimeWeightedInvestmentValue, - totalTimeWeightedInvestmentValueWithCurrencyEffect - } = values; - - const netPerformanceInPercentage = totalTimeWeightedInvestmentValue.eq(0) - ? 0 - : totalNetPerformanceValue - .div(totalTimeWeightedInvestmentValue) - .mul(100) - .toNumber(); - - const netPerformanceInPercentageWithCurrencyEffect = - totalTimeWeightedInvestmentValueWithCurrencyEffect.eq(0) - ? 0 - : totalNetPerformanceValueWithCurrencyEffect - .div(totalTimeWeightedInvestmentValueWithCurrencyEffect) - .mul(100) - .toNumber(); - - return { - date, - netPerformanceInPercentage, - netPerformanceInPercentageWithCurrencyEffect, - investmentValueWithCurrencyEffect: - investmentValueWithCurrencyEffect.toNumber(), - netPerformance: totalNetPerformanceValue.toNumber(), - netPerformanceWithCurrencyEffect: - totalNetPerformanceValueWithCurrencyEffect.toNumber(), - totalInvestment: totalInvestmentValue.toNumber(), - totalInvestmentValueWithCurrencyEffect: - totalInvestmentValueWithCurrencyEffect.toNumber(), - value: totalCurrentValue.toNumber(), - valueWithCurrencyEffect: totalCurrentValueWithCurrencyEffect.toNumber() - }; - }); - } - - public async getCurrentPositions( - start: Date, - end?: Date - ): Promise { - const lastTransactionPoint = last(this.transactionPoints); - - let endDate = end; - - if (!endDate) { - endDate = new Date(Date.now()); - - if (lastTransactionPoint) { - endDate = max([endDate, parseDate(lastTransactionPoint.date)]); - } - } - - const transactionPoints = this.transactionPoints?.filter(({ date }) => { - return isBefore(parseDate(date), endDate); - }); - - if (!transactionPoints.length) { - return { - currentValueInBaseCurrency: new Big(0), - grossPerformance: new Big(0), - grossPerformancePercentage: new Big(0), - grossPerformancePercentageWithCurrencyEffect: new Big(0), - grossPerformanceWithCurrencyEffect: new Big(0), - hasErrors: false, - netPerformance: new Big(0), - netPerformancePercentage: new Big(0), - netPerformancePercentageWithCurrencyEffect: new Big(0), - netPerformanceWithCurrencyEffect: new Big(0), - positions: [], - totalInvestment: new Big(0) - }; - } - - const currencies: { [symbol: string]: string } = {}; - const dataGatheringItems: IDataGatheringItem[] = []; - let dates: Date[] = []; - let firstIndex = transactionPoints.length; - let firstTransactionPoint: TransactionPoint = null; +import { cloneDeep, first, last, sortBy } from 'lodash'; - dates.push(resetHours(start)); - - for (const { currency, dataSource, symbol } of transactionPoints[ - firstIndex - 1 - ].items) { - dataGatheringItems.push({ - dataSource, - symbol - }); - - currencies[symbol] = currency; - } - - for (let i = 0; i < transactionPoints.length; i++) { - if ( - !isBefore(parseDate(transactionPoints[i].date), start) && - firstTransactionPoint === null - ) { - firstTransactionPoint = transactionPoints[i]; - firstIndex = i; - } - - if (firstTransactionPoint !== null) { - dates.push(resetHours(parseDate(transactionPoints[i].date))); - } - } - - dates.push(resetHours(endDate)); - - // Add dates of last week for fallback - dates.push(subDays(resetHours(new Date()), 7)); - dates.push(subDays(resetHours(new Date()), 6)); - dates.push(subDays(resetHours(new Date()), 5)); - dates.push(subDays(resetHours(new Date()), 4)); - dates.push(subDays(resetHours(new Date()), 3)); - dates.push(subDays(resetHours(new Date()), 2)); - dates.push(subDays(resetHours(new Date()), 1)); - dates.push(resetHours(new Date())); - - dates = uniq( - dates.map((date) => { - return date.getTime(); - }) - ) - .map((timestamp) => { - return new Date(timestamp); - }) - .sort((a, b) => { - return a.getTime() - b.getTime(); - }); - - let exchangeRatesByCurrency = - await this.exchangeRateDataService.getExchangeRatesByCurrency({ - currencies: uniq(Object.values(currencies)), - endDate: endOfDay(endDate), - startDate: this.getStartDate(), - targetCurrency: this.currency - }); - - const { - dataProviderInfos, - errors: currentRateErrors, - values: marketSymbols - } = await this.currentRateService.getValues({ - dataGatheringItems, - dateQuery: { - in: dates - } - }); - - this.dataProviderInfos = dataProviderInfos; - - const marketSymbolMap: { - [date: string]: { [symbol: string]: Big }; - } = {}; - - for (const marketSymbol of marketSymbols) { - const date = format(marketSymbol.date, DATE_FORMAT); - - if (!marketSymbolMap[date]) { - marketSymbolMap[date] = {}; - } - - if (marketSymbol.marketPrice) { - marketSymbolMap[date][marketSymbol.symbol] = new Big( - marketSymbol.marketPrice - ); - } - } - - const endDateString = format(endDate, DATE_FORMAT); - - if (firstIndex > 0) { - firstIndex--; - } - - const positions: TimelinePosition[] = []; - let hasAnySymbolMetricsErrors = false; - - const errors: ResponseError['errors'] = []; - - for (const item of lastTransactionPoint.items) { - const marketPriceInBaseCurrency = ( - marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice - ).mul( - exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ - endDateString - ] - ); - - const { - grossPerformance, - grossPerformancePercentage, - grossPerformancePercentageWithCurrencyEffect, - grossPerformanceWithCurrencyEffect, - hasErrors, - netPerformance, - netPerformancePercentage, - netPerformancePercentageWithCurrencyEffect, - netPerformanceWithCurrencyEffect, - timeWeightedInvestment, - timeWeightedInvestmentWithCurrencyEffect, - totalDividend, - totalDividendInBaseCurrency, - totalInvestment, - totalInvestmentWithCurrencyEffect - } = this.getSymbolMetrics({ - marketSymbolMap, - start, - dataSource: item.dataSource, - end: endDate, - exchangeRates: - exchangeRatesByCurrency[`${item.currency}${this.currency}`], - symbol: item.symbol - }); - - hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; - - positions.push({ - dividend: totalDividend, - dividendInBaseCurrency: totalDividendInBaseCurrency, - timeWeightedInvestment, - timeWeightedInvestmentWithCurrencyEffect, - averagePrice: item.averagePrice, - currency: item.currency, - dataSource: item.dataSource, - fee: item.fee, - firstBuyDate: item.firstBuyDate, - grossPerformance: !hasErrors ? grossPerformance ?? null : null, - grossPerformancePercentage: !hasErrors - ? grossPerformancePercentage ?? null - : null, - grossPerformancePercentageWithCurrencyEffect: !hasErrors - ? grossPerformancePercentageWithCurrencyEffect ?? null - : null, - grossPerformanceWithCurrencyEffect: !hasErrors - ? grossPerformanceWithCurrencyEffect ?? null - : null, - investment: totalInvestment, - investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect, - marketPrice: - marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null, - marketPriceInBaseCurrency: - marketPriceInBaseCurrency?.toNumber() ?? null, - netPerformance: !hasErrors ? netPerformance ?? null : null, - netPerformancePercentage: !hasErrors - ? netPerformancePercentage ?? null - : null, - netPerformancePercentageWithCurrencyEffect: !hasErrors - ? netPerformancePercentageWithCurrencyEffect ?? null - : null, - netPerformanceWithCurrencyEffect: !hasErrors - ? netPerformanceWithCurrencyEffect ?? null - : null, - quantity: item.quantity, - symbol: item.symbol, - tags: item.tags, - transactionCount: item.transactionCount, - valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul( - item.quantity - ) - }); - - if ( - (hasErrors || - currentRateErrors.find(({ dataSource, symbol }) => { - return dataSource === item.dataSource && symbol === item.symbol; - })) && - item.investment.gt(0) - ) { - errors.push({ dataSource: item.dataSource, symbol: item.symbol }); - } - } - - const overall = this.calculateOverallPerformance(positions); - - return { - ...overall, - errors, - positions, - hasErrors: hasAnySymbolMetricsErrors || overall.hasErrors - }; - } - - public getDataProviderInfos() { - return this.dataProviderInfos; - } - - public getInvestments(): { date: string; investment: Big }[] { - if (this.transactionPoints.length === 0) { - return []; - } - - return this.transactionPoints.map((transactionPoint) => { - return { - date: transactionPoint.date, - investment: transactionPoint.items.reduce( - (investment, transactionPointSymbol) => - investment.plus(transactionPointSymbol.investment), - new Big(0) - ) - }; - }); - } - - public getInvestmentsByGroup({ - data, - groupBy - }: { - data: HistoricalDataItem[]; - groupBy: GroupBy; - }): InvestmentItem[] { - const groupedData: { [dateGroup: string]: Big } = {}; - - for (const { date, investmentValueWithCurrencyEffect } of data) { - const dateGroup = - groupBy === 'month' ? date.substring(0, 7) : date.substring(0, 4); - groupedData[dateGroup] = (groupedData[dateGroup] ?? new Big(0)).plus( - investmentValueWithCurrencyEffect - ); - } - - return Object.keys(groupedData).map((dateGroup) => ({ - date: groupBy === 'month' ? `${dateGroup}-01` : `${dateGroup}-01-01`, - investment: groupedData[dateGroup].toNumber() - })); - } - - private calculateOverallPerformance(positions: TimelinePosition[]) { +export class TWRPortfolioCalculator extends PortfolioCalculator { + protected calculateOverallPerformance( + positions: TimelinePosition[] + ): CurrentPositions { let currentValueInBaseCurrency = new Big(0); let grossPerformance = new Big(0); let grossPerformanceWithCurrencyEffect = new Big(0); @@ -754,119 +120,12 @@ export class PortfolioCalculator { ? new Big(0) : grossPerformanceWithCurrencyEffect.div( totalTimeWeightedInvestmentWithCurrencyEffect - ) + ), + positions }; } - public getStartDate() { - return this.transactionPoints.length > 0 - ? parseDate(this.transactionPoints[0].date) - : new Date(); - } - - public getTransactionPoints() { - return this.transactionPoints; - } - - private computeTransactionPoints() { - this.transactionPoints = []; - const symbols: { [symbol: string]: TransactionPointSymbol } = {}; - - let lastDate: string = null; - let lastTransactionPoint: TransactionPoint = null; - - for (const { - fee, - date, - quantity, - SymbolProfile, - tags, - type, - unitPrice - } of this.orders) { - let currentTransactionPointItem: TransactionPointSymbol; - const oldAccumulatedSymbol = symbols[SymbolProfile.symbol]; - - const factor = getFactor(type); - - if (oldAccumulatedSymbol) { - let investment = oldAccumulatedSymbol.investment; - - const newQuantity = quantity - .mul(factor) - .plus(oldAccumulatedSymbol.quantity); - - if (type === 'BUY') { - investment = oldAccumulatedSymbol.investment.plus( - quantity.mul(unitPrice) - ); - } else if (type === 'SELL') { - investment = oldAccumulatedSymbol.investment.minus( - quantity.mul(oldAccumulatedSymbol.averagePrice) - ); - } - - currentTransactionPointItem = { - investment, - tags, - averagePrice: newQuantity.gt(0) - ? investment.div(newQuantity) - : new Big(0), - currency: SymbolProfile.currency, - dataSource: SymbolProfile.dataSource, - dividend: new Big(0), - fee: fee.plus(oldAccumulatedSymbol.fee), - firstBuyDate: oldAccumulatedSymbol.firstBuyDate, - quantity: newQuantity, - symbol: SymbolProfile.symbol, - transactionCount: oldAccumulatedSymbol.transactionCount + 1 - }; - } else { - currentTransactionPointItem = { - fee, - tags, - averagePrice: unitPrice, - currency: SymbolProfile.currency, - dataSource: SymbolProfile.dataSource, - dividend: new Big(0), - firstBuyDate: date, - investment: unitPrice.mul(quantity).mul(factor), - quantity: quantity.mul(factor), - symbol: SymbolProfile.symbol, - transactionCount: 1 - }; - } - - symbols[SymbolProfile.symbol] = currentTransactionPointItem; - - const items = lastTransactionPoint?.items ?? []; - - const newItems = items.filter(({ symbol }) => { - return symbol !== SymbolProfile.symbol; - }); - - newItems.push(currentTransactionPointItem); - - newItems.sort((a, b) => { - return a.symbol?.localeCompare(b.symbol); - }); - - if (lastDate !== date || lastTransactionPoint === null) { - lastTransactionPoint = { - date, - items: newItems - }; - - this.transactionPoints.push(lastTransactionPoint); - } else { - lastTransactionPoint.items = newItems; - } - - lastDate = date; - } - } - - private getSymbolMetrics({ + protected getSymbolMetrics({ dataSource, end, exchangeRates, diff --git a/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts b/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts index cf759b7ac..308cc4037 100644 --- a/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts @@ -16,4 +16,5 @@ export interface CurrentPositions extends ResponseError { netPerformancePercentageWithCurrencyEffect: Big; positions: TimelinePosition[]; totalInvestment: Big; + totalInvestmentWithCurrencyEffect: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts similarity index 100% rename from apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts rename to apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts index 2925ca9bc..c058a0249 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts @@ -12,6 +12,8 @@ export interface PortfolioPositionDetail { averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; + dividendYieldPercent: number; + dividendYieldPercentWithCurrencyEffect: number; feeInBaseCurrency: number; firstBuyDate: string; grossPerformance: number; diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index 4b5034979..6b06bf02d 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -15,6 +15,7 @@ import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/sym import { Module } from '@nestjs/common'; +import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; import { CurrentRateService } from './current-rate.service'; import { PortfolioController } from './portfolio.controller'; import { PortfolioService } from './portfolio.service'; @@ -41,6 +42,7 @@ import { RulesService } from './rules.service'; AccountBalanceService, AccountService, CurrentRateService, + PortfolioCalculatorFactory, PortfolioService, RulesService ] diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts new file mode 100644 index 000000000..7654b7df3 --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -0,0 +1,78 @@ +import { Big } from 'big.js'; + +import { PortfolioService } from './portfolio.service'; + +describe('PortfolioService', () => { + let portfolioService: PortfolioService; + + beforeAll(async () => { + portfolioService = new PortfolioService( + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ); + }); + + describe('annualized performance percentage', () => { + it('Get annualized performance', async () => { + expect( + portfolioService + .getAnnualizedPerformancePercent({ + daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day + netPerformancePercent: new Big(0) + }) + .toNumber() + ).toEqual(0); + + expect( + portfolioService + .getAnnualizedPerformancePercent({ + daysInMarket: 0, + netPerformancePercent: new Big(0) + }) + .toNumber() + ).toEqual(0); + + /** + * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html + */ + expect( + portfolioService + .getAnnualizedPerformancePercent({ + daysInMarket: 65, // < 1 year + netPerformancePercent: new Big(0.1025) + }) + .toNumber() + ).toBeCloseTo(0.729705); + + expect( + portfolioService + .getAnnualizedPerformancePercent({ + daysInMarket: 365, // 1 year + netPerformancePercent: new Big(0.05) + }) + .toNumber() + ).toBeCloseTo(0.05); + + /** + * Source: https://www.investopedia.com/terms/a/annualized-total-return.asp#annualized-return-formula-and-calculation + */ + expect( + portfolioService + .getAnnualizedPerformancePercent({ + daysInMarket: 575, // > 1 year + netPerformancePercent: new Big(0.2374) + }) + .toNumber() + ).toBeCloseTo(0.145); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 8384427c3..3b8a42d89 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -3,7 +3,6 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; -import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { getFactor, @@ -79,9 +78,13 @@ import { parseISO, set } from 'date-fns'; -import { isEmpty, last, uniq, uniqBy } from 'lodash'; +import { isEmpty, isNumber, last, uniq, uniqBy } from 'lodash'; -import { PortfolioCalculator } from './calculator/twr/portfolio-calculator'; +import { PortfolioCalculator } from './calculator/portfolio-calculator'; +import { + PerformanceCalculationType, + PortfolioCalculatorFactory +} from './calculator/portfolio-calculator.factory'; import { HistoricalDataContainer, PortfolioPositionDetail @@ -98,7 +101,7 @@ export class PortfolioService { public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, - private readonly currentRateService: CurrentRateService, + private readonly calculatorFactory: PortfolioCalculatorFactory, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly impersonationService: ImpersonationService, @@ -214,6 +217,24 @@ export class PortfolioService { }; } + public getAnnualizedPerformancePercent({ + daysInMarket, + netPerformancePercent + }: { + daysInMarket: number; + netPerformancePercent: Big; + }): Big { + if (isNumber(daysInMarket) && daysInMarket > 0) { + const exponent = new Big(365).div(daysInMarket).toNumber(); + + return new Big( + Math.pow(netPerformancePercent.plus(1).toNumber(), exponent) + ).minus(1); + } + + return new Big(0); + } + public async getDividends({ activities, groupBy @@ -265,11 +286,10 @@ export class PortfolioService { }; } - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - currency: this.request.user.Settings.settings.baseCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: this.request.user.Settings.settings.baseCurrency }); const { items } = await this.getChart({ @@ -354,11 +374,10 @@ export class PortfolioService { withExcludedAccounts }); - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: userCurrency }); const { startDate } = getInterval( @@ -691,6 +710,8 @@ export class PortfolioService { averagePrice: undefined, dataProviderInfo: undefined, dividendInBaseCurrency: undefined, + dividendYieldPercent: undefined, + dividendYieldPercentWithCurrencyEffect: undefined, feeInBaseCurrency: undefined, firstBuyDate: undefined, grossPerformance: undefined, @@ -718,19 +739,18 @@ export class PortfolioService { { dataSource: aDataSource, symbol: aSymbol } ]); - tags = uniqBy(tags, 'id'); - - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities: orders.filter((order) => { tags = tags.concat(order.tags); return ['BUY', 'DIVIDEND', 'ITEM', 'SELL'].includes(order.type); }), - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: userCurrency }); + tags = uniqBy(tags, 'id'); + const portfolioStart = portfolioCalculator.getStartDate(); const transactionPoints = portfolioCalculator.getTransactionPoints(); @@ -751,6 +771,8 @@ export class PortfolioService { firstBuyDate, marketPrice, quantity, + timeWeightedInvestment, + timeWeightedInvestmentWithCurrencyEffect, transactionCount } = position; @@ -763,6 +785,21 @@ export class PortfolioService { return Account; }); + const dividendYieldPercent = this.getAnnualizedPerformancePercent({ + daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + netPerformancePercent: dividendInBaseCurrency.div( + timeWeightedInvestment + ) + }); + + const dividendYieldPercentWithCurrencyEffect = + this.getAnnualizedPerformancePercent({ + daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + netPerformancePercent: dividendInBaseCurrency.div( + timeWeightedInvestmentWithCurrencyEffect + ) + }); + const historicalData = await this.dataProviderService.getHistorical( [{ dataSource, symbol: aSymbol }], 'day', @@ -836,6 +873,9 @@ export class PortfolioService { averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), + dividendYieldPercent: dividendYieldPercent.toNumber(), + dividendYieldPercentWithCurrencyEffect: + dividendYieldPercentWithCurrencyEffect.toNumber(), feeInBaseCurrency: this.exchangeRateDataService.toCurrency( fee.toNumber(), SymbolProfile.currency, @@ -912,6 +952,8 @@ export class PortfolioService { averagePrice: 0, dataProviderInfo: undefined, dividendInBaseCurrency: 0, + dividendYieldPercent: 0, + dividendYieldPercentWithCurrencyEffect: 0, feeInBaseCurrency: 0, firstBuyDate: undefined, grossPerformance: undefined, @@ -963,11 +1005,10 @@ export class PortfolioService { }; } - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - currency: this.request.user.Settings.settings.baseCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: this.request.user.Settings.settings.baseCurrency }); const currentPositions = await portfolioCalculator.getCurrentPositions( @@ -1152,11 +1193,10 @@ export class PortfolioService { }; } - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: userCurrency }); const { @@ -1270,11 +1310,10 @@ export class PortfolioService { types: ['BUY', 'SELL'] }); - const portfolioCalculator = new PortfolioCalculator({ + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService + calculationType: PerformanceCalculationType.TWR, + currency: this.request.user.Settings.settings.baseCurrency }); const currentPositions = await portfolioCalculator.getCurrentPositions( @@ -1772,34 +1811,20 @@ export class PortfolioService { const daysInMarket = differenceInDays(new Date(), firstOrderDate); - const annualizedPerformancePercent = new PortfolioCalculator({ - activities: [], - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService - }) - .getAnnualizedPerformancePercent({ + const annualizedPerformancePercent = this.getAnnualizedPerformancePercent({ + daysInMarket, + netPerformancePercent: new Big( + performanceInformation.performance.currentNetPerformancePercent + ) + })?.toNumber(); + + const annualizedPerformancePercentWithCurrencyEffect = + this.getAnnualizedPerformancePercent({ daysInMarket, netPerformancePercent: new Big( - performanceInformation.performance.currentNetPerformancePercent + performanceInformation.performance.currentNetPerformancePercentWithCurrencyEffect ) - }) - ?.toNumber(); - - const annualizedPerformancePercentWithCurrencyEffect = - new PortfolioCalculator({ - activities: [], - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService - }) - .getAnnualizedPerformancePercent({ - daysInMarket, - netPerformancePercent: new Big( - performanceInformation.performance.currentNetPerformancePercentWithCurrencyEffect - ) - }) - ?.toNumber(); + })?.toNumber(); return { ...performanceInformation.performance, diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index 3aeadc035..e527df8d0 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -1232,10 +1232,12 @@ https://ghostfol.io/nl/veelgestelde-vragen ${currentDate}T00:00:00+00:00 + https://ghostfol.io/pt ${currentDate}T00:00:00+00:00 @@ -1296,4 +1298,10 @@ https://ghostfol.io/tr ${currentDate}T00:00:00+00:00 + diff --git a/apps/client/project.json b/apps/client/project.json index 8d778bef4..0cd576e16 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -72,6 +72,10 @@ "baseHref": "/tr/", "localize": ["tr"] }, + "development-zh": { + "baseHref": "/zh/", + "localize": ["zh"] + }, "production": { "fileReplacements": [ { @@ -190,6 +194,9 @@ "development-tr": { "buildTarget": "client:build:development-tr" }, + "development-zh": { + "buildTarget": "client:build:development-zh" + }, "production": { "buildTarget": "client:build:production" } @@ -209,7 +216,8 @@ "messages.nl.xlf", "messages.pl.xlf", "messages.pt.xlf", - "messages.tr.xlf" + "messages.tr.xlf", + "messages.zh.xlf" ] } }, @@ -260,6 +268,10 @@ "tr": { "baseHref": "/tr/", "translation": "apps/client/src/locales/messages.tr.xlf" + }, + "zh": { + "baseHref": "/zh/", + "translation": "apps/client/src/locales/messages.zh.xlf" } }, "sourceLocale": "en" diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index 713eb1a94..29541962b 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -163,6 +163,11 @@ Türkçe --> + diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index 21d33e3c9..a23e94fbb 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; min-height: 100svh; diff --git a/apps/client/src/app/components/access-table/access-table.component.scss b/apps/client/src/app/components/access-table/access-table.component.scss index f506edfc6..22a5d6732 100644 --- a/apps/client/src/app/components/access-table/access-table.component.scss +++ b/apps/client/src/app/components/access-table/access-table.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.scss b/apps/client/src/app/components/accounts-table/accounts-table.component.scss index 39e455dca..e934483db 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.scss +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.scss b/apps/client/src/app/components/admin-jobs/admin-jobs.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.scss +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss index 8121fc119..a03533589 100644 --- a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss +++ b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; font-size: 0.9rem; diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.scss b/apps/client/src/app/components/admin-market-data/admin-market-data.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.scss +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/admin-overview/admin-overview.scss b/apps/client/src/app/components/admin-overview/admin-overview.scss index 25209ac97..a4ae1edd2 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.scss +++ b/apps/client/src/app/components/admin-overview/admin-overview.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.scss b/apps/client/src/app/components/admin-platform/admin-platform.component.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.scss +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.scss b/apps/client/src/app/components/admin-settings/admin-settings.component.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.scss +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.scss b/apps/client/src/app/components/admin-tag/admin-tag.component.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.scss +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/admin-users/admin-users.scss b/apps/client/src/app/components/admin-users/admin-users.scss index f06a9d825..e4990bf59 100644 --- a/apps/client/src/app/components/admin-users/admin-users.scss +++ b/apps/client/src/app/components/admin-users/admin-users.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/apps/client/src/app/components/header/header.component.scss b/apps/client/src/app/components/header/header.component.scss index 0c6557ddd..04d634d3b 100644 --- a/apps/client/src/app/components/header/header.component.scss +++ b/apps/client/src/app/components/header/header.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; z-index: 999; diff --git a/apps/client/src/app/components/home-holdings/home-holdings.scss b/apps/client/src/app/components/home-holdings/home-holdings.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.scss +++ b/apps/client/src/app/components/home-holdings/home-holdings.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/home-market/home-market.scss b/apps/client/src/app/components/home-market/home-market.scss index f9e5e6275..5b523160d 100644 --- a/apps/client/src/app/components/home-market/home-market.scss +++ b/apps/client/src/app/components/home-market/home-market.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/apps/client/src/app/components/home-overview/home-overview.scss b/apps/client/src/app/components/home-overview/home-overview.scss index 9f8a1ce49..3a692b28d 100644 --- a/apps/client/src/app/components/home-overview/home-overview.scss +++ b/apps/client/src/app/components/home-overview/home-overview.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; height: 100%; diff --git a/apps/client/src/app/components/home-summary/home-summary.scss b/apps/client/src/app/components/home-summary/home-summary.scss index b5b58f67e..5d4e87f30 100644 --- a/apps/client/src/app/components/home-summary/home-summary.scss +++ b/apps/client/src/app/components/home-summary/home-summary.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts index 6ada2eeb1..bb37b9ed5 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts @@ -48,6 +48,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { public dataProviderInfo: DataProviderInfo; public dataSource: MatTableDataSource; public dividendInBaseCurrency: number; + public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; public firstBuyDate: string; public historicalDataItems: LineChartItem[]; @@ -95,6 +96,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { averagePrice, dataProviderInfo, dividendInBaseCurrency, + dividendYieldPercentWithCurrencyEffect, feeInBaseCurrency, firstBuyDate, historicalData, @@ -119,6 +121,8 @@ export class PositionDetailDialog implements OnDestroy, OnInit { this.dataProviderInfo = dataProviderInfo; this.dataSource = new MatTableDataSource(orders.reverse()); this.dividendInBaseCurrency = dividendInBaseCurrency; + this.dividendYieldPercentWithCurrencyEffect = + dividendYieldPercentWithCurrencyEffect; this.feeInBaseCurrency = feeInBaseCurrency; this.firstBuyDate = firstBuyDate; this.historicalDataItems = historicalData.map( diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html index 3a8694c83..3680f5701 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -134,17 +134,29 @@ >Investment -
- Dividend -
+ @if (dividendInBaseCurrency && user?.settings?.isExperimentalFeatures) { +
+ Dividend +
+
+ Dividend Yield +
+ }
+ @if (user?.settings?.isExperimentalFeatures) { +
+ }
Asset Class Deutsch English + @if (user?.settings?.isExperimentalFeatures) { + Chinese (Community) + } Español (Community)Nederlands (Community) - Polski (Community) + @if (user?.settings?.isExperimentalFeatures) { + Polski (Community) + } Português (Community)

Multi-Language

- Use Ghostfolio in multiple languages: English, Dutch, French, - German, Italian, + Use Ghostfolio in multiple languages: English, + Dutch, French, German, Italian, Portuguese, Spanish and Turkish are currently supported.

diff --git a/apps/client/src/app/pages/home/home-page.scss b/apps/client/src/app/pages/home/home-page.scss index 6a0b74854..e87d9a05b 100644 --- a/apps/client/src/app/pages/home/home-page.scss +++ b/apps/client/src/app/pages/home/home-page.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { color: rgb(var(--dark-primary-text)); } diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index e48b5e6ed..579b35702 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -152,10 +152,10 @@
diff --git a/apps/client/src/app/pages/landing/landing-page.scss b/apps/client/src/app/pages/landing/landing-page.scss index 6d5578ffb..0b8736819 100644 --- a/apps/client/src/app/pages/landing/landing-page.scss +++ b/apps/client/src/app/pages/landing/landing-page.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; @@ -57,12 +55,8 @@ mask-image: url('/assets/images/logo-hacker-news.svg'); } - &.logo-openstartup { - background-image: url('/assets/images/logo-openstartup.png'); - background-position: center; - background-repeat: no-repeat; - background-size: contain; - filter: grayscale(1); + &.logo-openalternative { + mask-image: url('/assets/images/logo-openalternative.svg'); } &.logo-privacy-tools { @@ -133,6 +127,7 @@ &.logo-alternative-to, &.logo-dev-community, &.logo-hacker-news, + &.logo-openalternative, &.logo-privacy-tools, &.logo-reddit, &.logo-sackgeld, diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index b628aba46..4fb8e9d81 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -275,6 +275,17 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { } ); + this.activityForm.controls['date'].valueChanges.subscribe(() => { + if (isToday(this.activityForm.controls['date'].value)) { + this.activityForm.controls['updateAccountBalance'].enable(); + } else { + this.activityForm.controls['updateAccountBalance'].disable(); + this.activityForm.controls['updateAccountBalance'].setValue(false); + } + + this.changeDetectorRef.markForCheck(); + }); + this.activityForm.controls['searchSymbol'].valueChanges.subscribe(() => { if (this.activityForm.controls['searchSymbol'].invalid) { this.data.activity.SymbolProfile = null; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.scss b/apps/client/src/app/pages/portfolio/portfolio-page.scss index 6a0b74854..e87d9a05b 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.scss +++ b/apps/client/src/app/pages/portfolio/portfolio-page.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { color: rgb(var(--dark-primary-text)); } diff --git a/apps/client/src/app/pages/user-account/user-account-page.scss b/apps/client/src/app/pages/user-account/user-account-page.scss index 6a0b74854..e87d9a05b 100644 --- a/apps/client/src/app/pages/user-account/user-account-page.scss +++ b/apps/client/src/app/pages/user-account/user-account-page.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { color: rgb(var(--dark-primary-text)); } diff --git a/apps/client/src/app/pages/zen/zen-page.scss b/apps/client/src/app/pages/zen/zen-page.scss index 6a0b74854..e87d9a05b 100644 --- a/apps/client/src/app/pages/zen/zen-page.scss +++ b/apps/client/src/app/pages/zen/zen-page.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { color: rgb(var(--dark-primary-text)); } diff --git a/apps/client/src/assets/images/logo-openalternative.svg b/apps/client/src/assets/images/logo-openalternative.svg new file mode 100644 index 000000000..b8488e9ac --- /dev/null +++ b/apps/client/src/assets/images/logo-openalternative.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/client/src/assets/images/logo-openstartup.png b/apps/client/src/assets/images/logo-openstartup.png deleted file mode 100644 index 1eaa2c430..000000000 Binary files a/apps/client/src/assets/images/logo-openstartup.png and /dev/null differ diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index bbe0d1edd..58b55bc01 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -22,7 +22,7 @@ Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst. apps/client/src/app/app.component.html - 179 + 184 @@ -94,7 +94,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -130,7 +130,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -270,7 +270,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -326,7 +330,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -474,7 +478,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -490,7 +494,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -518,7 +522,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -534,7 +538,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -554,7 +558,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -582,7 +586,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -1492,11 +1496,11 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1512,11 +1516,11 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1592,7 +1596,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1604,7 +1608,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1616,7 +1620,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1628,7 +1632,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1640,7 +1644,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -1876,7 +1880,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -1948,7 +1952,7 @@ Lokalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -1956,7 +1960,7 @@ Datums- und Zahlenformat apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -1964,7 +1968,7 @@ Zen Modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -1976,7 +1980,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -1984,11 +1988,11 @@ Benutzer ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2056,11 +2060,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2496,7 +2500,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2516,11 +2520,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2572,7 +2576,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2880,11 +2884,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2900,7 +2904,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2912,7 +2916,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2972,7 +2976,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3048,7 +3052,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -3076,7 +3080,7 @@ Experimentelle Funktionen apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -3092,7 +3096,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3124,7 +3128,7 @@ Aussehen apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -3132,7 +3136,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -3140,7 +3144,7 @@ Hell apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -3148,7 +3152,7 @@ Dunkel apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -3156,7 +3160,7 @@ Gesamtbetrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3172,7 +3176,7 @@ Sparrate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3412,31 +3416,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -3464,7 +3472,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -3480,7 +3488,7 @@ Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -3516,7 +3524,7 @@ Importieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -3584,7 +3592,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3664,7 +3672,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3672,7 +3680,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4100,7 +4108,7 @@ Möchtest du wirklich alle Aktivitäten löschen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4524,7 +4532,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9868,7 +9876,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9876,7 +9884,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10008,7 +10016,7 @@ Biometrische Authentifizierung apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10092,7 +10100,7 @@ Daten exportieren apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10100,7 +10108,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10480,7 +10488,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10512,7 +10520,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10772,19 +10780,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11052,7 +11060,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11068,7 +11076,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11084,7 +11092,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11116,7 +11124,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11188,7 +11196,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11224,7 +11232,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13344,7 +13352,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13424,7 +13432,7 @@ Finde Position... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13451,8 +13459,8 @@ Do you really want to delete this asset profile? Möchtest du dieses Anlageprofil wirklich löschen? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13776,7 +13784,7 @@ Ups! Die historischen Daten konnten nicht geparsed werden. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14648,7 +14656,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14656,7 +14664,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14732,11 +14740,11 @@ Einlage apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14792,7 +14800,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14800,7 +14808,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14808,7 +14816,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14816,7 +14824,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14824,7 +14832,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14836,7 +14844,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14868,7 +14876,7 @@ Jahr libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14876,7 +14884,7 @@ Jahre libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 6535d4034..6f4bd17fc 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -23,7 +23,7 @@ El riesgo de pérdida en trading puede ser importante. No es aconsejable invertir dinero que puedas necesitar a corto plazo. apps/client/src/app/app.component.html - 179 + 184 @@ -95,7 +95,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -131,7 +131,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -271,7 +271,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -327,7 +331,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -475,7 +479,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -491,7 +495,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -519,7 +523,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -535,7 +539,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -555,7 +559,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -583,7 +587,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -1490,11 +1494,11 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1510,11 +1514,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1590,7 +1594,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1602,7 +1606,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1614,7 +1618,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1626,7 +1630,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1638,7 +1642,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -1874,7 +1878,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -1946,7 +1950,7 @@ Ubicación apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -1954,7 +1958,7 @@ Formato de fecha y número apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -1962,7 +1966,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -1974,7 +1978,7 @@ Accede con huella digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -1982,11 +1986,11 @@ ID usuario apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2054,11 +2058,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2494,7 +2498,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2514,11 +2518,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2570,7 +2574,7 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2866,11 +2870,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2926,7 +2930,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2938,7 +2942,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2998,7 +3002,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3046,7 +3050,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -3074,7 +3078,7 @@ Funcionalidades experimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -3082,7 +3086,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3122,7 +3126,7 @@ Apariencia apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -3130,7 +3134,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -3138,7 +3142,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -3146,7 +3150,7 @@ Oscuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -3154,7 +3158,7 @@ Importe total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3170,7 +3174,7 @@ Tasa de ahorro apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3410,31 +3414,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -3462,7 +3470,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -3470,7 +3478,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -3514,7 +3522,7 @@ Import apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -3582,7 +3590,7 @@ Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3662,7 +3670,7 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3670,7 +3678,7 @@ Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4098,7 +4106,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4522,7 +4530,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9866,7 +9874,7 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9874,7 +9882,7 @@ ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10006,7 +10014,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10090,7 +10098,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10098,7 +10106,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10478,7 +10486,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10510,7 +10518,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10770,19 +10778,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11050,7 +11058,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11066,7 +11074,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11082,7 +11090,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11114,7 +11122,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11186,7 +11194,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11222,7 +11230,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13342,7 +13350,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13422,7 +13430,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13449,8 +13457,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13774,7 +13782,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14646,7 +14654,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14654,7 +14662,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14730,11 +14738,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14790,7 +14798,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14798,7 +14806,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14806,7 +14814,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14814,7 +14822,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14822,7 +14830,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14834,7 +14842,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14866,7 +14874,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14874,7 +14882,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 9faea802b..fd2fdae57 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -6,7 +6,7 @@ Le risque de perte en investissant peut être important. Il est déconseillé d'investir de l'argent dont vous pourriez avoir besoin à court terme. apps/client/src/app/app.component.html - 179 + 184 @@ -106,7 +106,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -142,7 +142,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -194,11 +194,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -326,7 +326,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -374,7 +378,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -530,7 +534,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -546,7 +550,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -574,7 +578,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -590,7 +594,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -606,7 +610,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -618,11 +622,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -642,11 +646,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -666,7 +670,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -694,7 +698,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -754,7 +758,7 @@ Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -766,7 +770,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -782,11 +786,11 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -802,11 +806,11 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -818,7 +822,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -826,7 +830,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1102,7 +1106,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -1114,7 +1118,7 @@ Référence apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -1602,7 +1606,7 @@ Montant Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -1610,7 +1614,7 @@ Taux d'Épargne apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -1921,7 +1925,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1933,7 +1937,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1945,7 +1949,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1957,7 +1961,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1969,7 +1973,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -2137,7 +2141,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -2221,31 +2225,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -2257,7 +2265,7 @@ Paramètres régionaux apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -2265,7 +2273,7 @@ Format de date et d'heure apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -2273,7 +2281,7 @@ Apparence apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -2281,7 +2289,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -2289,7 +2297,7 @@ Clair apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -2297,7 +2305,7 @@ Sombre apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -2305,7 +2313,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -2317,7 +2325,7 @@ Se connecter avec empreinte apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -2325,7 +2333,7 @@ Fonctionnalités expérimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -2333,11 +2341,11 @@ ID d'utilisateur apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2745,7 +2753,7 @@ Importer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -2905,7 +2913,7 @@ Dividende apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -2925,7 +2933,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3581,7 +3589,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3661,7 +3669,7 @@ Expérience sans distraction pour les périodes tumultueuses apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3669,7 +3677,7 @@ Avant-première de fonctionnalités futures apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4097,7 +4105,7 @@ Voulez-vous vraiment supprimer toutes vos activités ? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4521,7 +4529,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9865,7 +9873,7 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9873,7 +9881,7 @@ ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10005,7 +10013,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10089,7 +10097,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10097,7 +10105,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10477,7 +10485,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10509,7 +10517,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10769,19 +10777,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11049,7 +11057,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11065,7 +11073,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11081,7 +11089,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11113,7 +11121,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11185,7 +11193,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11221,7 +11229,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13341,7 +13349,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13421,7 +13429,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13448,8 +13456,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13773,7 +13781,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14645,7 +14653,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14653,7 +14661,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14729,11 +14737,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14789,7 +14797,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14797,7 +14805,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14805,7 +14813,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14813,7 +14821,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14821,7 +14829,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14833,7 +14841,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14865,7 +14873,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14873,7 +14881,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 581bdc55c..283dcd868 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -23,7 +23,7 @@ Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine. apps/client/src/app/app.component.html - 179 + 184 @@ -95,7 +95,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -131,7 +131,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -271,7 +271,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -327,7 +331,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -475,7 +479,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -491,7 +495,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -519,7 +523,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -535,7 +539,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -555,7 +559,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -583,7 +587,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -1490,11 +1494,11 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1510,11 +1514,11 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1590,7 +1594,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1602,7 +1606,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1614,7 +1618,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1626,7 +1630,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1638,7 +1642,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -1874,7 +1878,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -1946,7 +1950,7 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -1954,7 +1958,7 @@ Formato data e numero apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -1962,7 +1966,7 @@ Modalità Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -1974,7 +1978,7 @@ Accesso con impronta digitale apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -1982,11 +1986,11 @@ ID utente apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2054,11 +2058,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2494,7 +2498,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2514,11 +2518,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2570,7 +2574,7 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2866,11 +2870,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2926,7 +2930,7 @@ Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2938,7 +2942,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2998,7 +3002,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3046,7 +3050,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -3074,7 +3078,7 @@ Funzionalità sperimentali apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -3082,7 +3086,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3122,7 +3126,7 @@ Aspetto apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -3130,7 +3134,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -3138,7 +3142,7 @@ Chiaro apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -3146,7 +3150,7 @@ Scuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -3154,7 +3158,7 @@ Importo totale apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3170,7 +3174,7 @@ Tasso di risparmio apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3410,31 +3414,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -3462,7 +3470,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -3470,7 +3478,7 @@ Dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -3514,7 +3522,7 @@ Importa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -3582,7 +3590,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3662,7 +3670,7 @@ Esperienza priva di distrazioni per i periodi più turbolenti apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3670,7 +3678,7 @@ Un'anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4098,7 +4106,7 @@ Vuoi davvero eliminare tutte le tue attività? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4522,7 +4530,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9866,7 +9874,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9874,7 +9882,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10006,7 +10014,7 @@ Autenticazione biometrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10090,7 +10098,7 @@ Esporta dati apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10098,7 +10106,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10478,7 +10486,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10510,7 +10518,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10770,19 +10778,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11050,7 +11058,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11066,7 +11074,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11082,7 +11090,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11114,7 +11122,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11186,7 +11194,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11222,7 +11230,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13342,7 +13350,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13422,7 +13430,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13449,8 +13457,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13774,7 +13782,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14646,7 +14654,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14654,7 +14662,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14730,11 +14738,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14790,7 +14798,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14798,7 +14806,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14806,7 +14814,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14814,7 +14822,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14822,7 +14830,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14834,7 +14842,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14866,7 +14874,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14874,7 +14882,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 39d0d9532..4a2874300 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -22,7 +22,7 @@ Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft. apps/client/src/app/app.component.html - 179 + 184 @@ -94,7 +94,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -130,7 +130,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -270,7 +270,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -326,7 +330,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -474,7 +478,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -490,7 +494,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -518,7 +522,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -534,7 +538,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -554,7 +558,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -582,7 +586,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -1489,11 +1493,11 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1509,11 +1513,11 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1589,7 +1593,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1601,7 +1605,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1613,7 +1617,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1625,7 +1629,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1637,7 +1641,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -1873,7 +1877,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -1945,7 +1949,7 @@ Locatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -1953,7 +1957,7 @@ Datum- en getalnotatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -1961,7 +1965,7 @@ Zen-modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -1973,7 +1977,7 @@ Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -1981,11 +1985,11 @@ Gebruikers-ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2053,11 +2057,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2493,7 +2497,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2513,11 +2517,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2569,7 +2573,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2865,11 +2869,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2925,7 +2929,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2937,7 +2941,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2997,7 +3001,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3045,7 +3049,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -3073,7 +3077,7 @@ Experimentele functies apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -3081,7 +3085,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3121,7 +3125,7 @@ Weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -3129,7 +3133,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -3137,7 +3141,7 @@ Licht apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -3145,7 +3149,7 @@ Donker apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -3153,7 +3157,7 @@ Totaalbedrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3169,7 +3173,7 @@ Spaarrente apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3409,31 +3413,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -3461,7 +3469,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -3469,7 +3477,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -3513,7 +3521,7 @@ Importeren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -3581,7 +3589,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3661,7 +3669,7 @@ Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3669,7 +3677,7 @@ Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4097,7 +4105,7 @@ Wil je echt al je activiteiten verwijderen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4521,7 +4529,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9865,7 +9873,7 @@ ETF's zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9873,7 +9881,7 @@ ETF's zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10005,7 +10013,7 @@ Biometrische authenticatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10089,7 +10097,7 @@ Exporteer Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10097,7 +10105,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10477,7 +10485,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10509,7 +10517,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10769,19 +10777,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11049,7 +11057,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11065,7 +11073,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11081,7 +11089,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11113,7 +11121,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11185,7 +11193,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11221,7 +11229,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13341,7 +13349,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13421,7 +13429,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13448,8 +13456,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13773,7 +13781,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14645,7 +14653,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14653,7 +14661,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14729,11 +14737,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14789,7 +14797,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14797,7 +14805,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14805,7 +14813,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14813,7 +14821,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14821,7 +14829,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14833,7 +14841,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14865,7 +14873,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14873,7 +14881,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index f59f2652a..5a1611384 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -10,19 +10,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -290,7 +290,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -322,7 +322,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -582,7 +582,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -598,7 +598,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -630,7 +630,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -702,7 +702,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -718,7 +718,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -754,7 +754,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -1462,31 +1462,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -1498,7 +1502,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. apps/client/src/app/app.component.html - 179 + 184 @@ -1606,7 +1610,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1670,7 +1674,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1722,11 +1726,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1838,7 +1842,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1902,7 +1910,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2042,7 +2050,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2058,7 +2066,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2086,7 +2094,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2102,7 +2110,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2118,7 +2126,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -2126,7 +2134,7 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -2134,15 +2142,15 @@ ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -2150,7 +2158,7 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -2162,11 +2170,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2186,11 +2194,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2210,7 +2218,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2238,7 +2246,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -2290,7 +2298,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -2314,7 +2322,7 @@ Import apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -2330,7 +2338,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2342,7 +2350,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2358,11 +2366,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2378,11 +2386,11 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2394,7 +2402,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -2402,7 +2410,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -2410,7 +2418,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -2418,7 +2426,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2854,7 +2862,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2866,7 +2874,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3154,7 +3162,7 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3162,7 +3170,7 @@ Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3676,7 +3684,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -3688,7 +3696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -3700,7 +3708,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -3712,7 +3720,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -3724,7 +3732,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -3824,7 +3832,7 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -3872,7 +3880,7 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -3880,7 +3888,7 @@ Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -3888,7 +3896,7 @@ Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -3896,7 +3904,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -3904,7 +3912,7 @@ Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -3912,7 +3920,7 @@ Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -3920,7 +3928,7 @@ Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -3932,7 +3940,7 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3940,7 +3948,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -3948,7 +3956,7 @@ Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -3956,7 +3964,7 @@ Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -3964,7 +3972,7 @@ Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -3972,11 +3980,11 @@ User ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -3984,7 +3992,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -4940,7 +4948,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -5372,7 +5380,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -5392,7 +5400,7 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -5400,7 +5408,7 @@ Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -13216,7 +13224,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -14648,7 +14656,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14656,7 +14664,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14732,11 +14740,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14792,7 +14800,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14800,7 +14808,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14808,7 +14816,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14816,7 +14824,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14824,7 +14832,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14836,7 +14844,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14868,7 +14876,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14876,7 +14884,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 60d8a37cf..3970b11aa 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -6,7 +6,7 @@ O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. apps/client/src/app/app.component.html - 179 + 184 @@ -106,7 +106,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -142,7 +142,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -194,11 +194,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -326,7 +326,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -374,7 +378,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -530,7 +534,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -546,7 +550,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -574,7 +578,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -590,7 +594,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -606,7 +610,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -618,11 +622,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -642,11 +646,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -666,7 +670,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -694,7 +698,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -970,7 +974,7 @@ Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -982,7 +986,7 @@ Referência apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -1478,7 +1482,7 @@ Valor Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -1486,7 +1490,7 @@ Taxa de Poupança apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -1785,7 +1789,7 @@ Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1797,7 +1801,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -1813,11 +1817,11 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1833,11 +1837,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1897,7 +1901,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -1909,7 +1913,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -1921,7 +1925,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -1933,7 +1937,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -1945,7 +1949,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -2113,7 +2117,7 @@ Deseja realmente remover este método de início de sessão? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -2205,7 +2209,7 @@ Localidade apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -2213,7 +2217,7 @@ Formato de números e datas apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -2221,7 +2225,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -2233,7 +2237,7 @@ Aparência apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -2241,7 +2245,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -2249,7 +2253,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -2257,7 +2261,7 @@ Escuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -2265,7 +2269,7 @@ Iniciar sessão com impressão digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -2273,7 +2277,7 @@ Funcionalidades Experimentais apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -2281,11 +2285,11 @@ ID do Utilizador apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -2609,7 +2613,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2805,7 +2809,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3433,7 +3437,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -3453,31 +3457,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -3521,7 +3529,7 @@ Importar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -3537,7 +3545,7 @@ Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -3581,7 +3589,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -3661,7 +3669,7 @@ Experiência sem distrações para tempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -3669,7 +3677,7 @@ Acesso antecipado a funcionalidades futuras apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -4097,7 +4105,7 @@ Deseja mesmo eliminar todas as suas atividades? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4521,7 +4529,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -9865,7 +9873,7 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -9873,7 +9881,7 @@ ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -10005,7 +10013,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -10089,7 +10097,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -10097,7 +10105,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -10477,7 +10485,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10509,7 +10517,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -10769,19 +10777,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -11049,7 +11057,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -11065,7 +11073,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -11081,7 +11089,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -11113,7 +11121,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -11185,7 +11193,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -11221,7 +11229,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -13341,7 +13349,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13421,7 +13429,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13448,8 +13456,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13773,7 +13781,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14645,7 +14653,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14653,7 +14661,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14729,11 +14737,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14789,7 +14797,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14797,7 +14805,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14805,7 +14813,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14813,7 +14821,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14821,7 +14829,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14833,7 +14841,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14865,7 +14873,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14873,7 +14881,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index ae9ae985c..2052e6667 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -10,19 +10,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -290,7 +290,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -322,7 +322,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -582,7 +582,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -598,7 +598,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -630,7 +630,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -702,7 +702,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -718,7 +718,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -754,7 +754,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -1438,31 +1438,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -1474,7 +1478,7 @@ Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez. apps/client/src/app/app.component.html - 179 + 184 @@ -1598,7 +1602,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1634,7 +1638,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1686,11 +1690,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1802,7 +1806,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1850,7 +1858,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2006,7 +2014,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2022,7 +2030,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2050,7 +2058,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2066,7 +2074,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2082,7 +2090,7 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 @@ -2090,7 +2098,7 @@ Ülkesi Olmayan ETF'ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 @@ -2098,7 +2106,7 @@ Sektörü Olmayan ETF'ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 @@ -2106,7 +2114,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -2118,11 +2126,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2142,11 +2150,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2166,7 +2174,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2194,7 +2202,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -2262,7 +2270,7 @@ Sektör apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2274,7 +2282,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2290,11 +2298,11 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2310,11 +2318,11 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2326,7 +2334,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 @@ -2334,7 +2342,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 @@ -2342,7 +2350,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2714,7 +2722,7 @@ Portföy apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2726,7 +2734,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3006,7 +3014,7 @@ Toplam Tutar apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 @@ -3014,7 +3022,7 @@ Tasarruf Oranı apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3517,7 +3525,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -3529,7 +3537,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -3541,7 +3549,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -3553,7 +3561,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -3565,7 +3573,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -3941,7 +3949,7 @@ Zen Modu apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -4441,7 +4449,7 @@ Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4653,7 +4661,7 @@ İçe Aktar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -4849,7 +4857,7 @@ Temettü apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -4869,7 +4877,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -4877,7 +4885,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -12353,7 +12361,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -12437,7 +12445,7 @@ Yerel Ayarlar apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 @@ -12445,7 +12453,7 @@ Tarih ve Sayı Formatları apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 @@ -12453,7 +12461,7 @@ Görünüm apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 @@ -12461,7 +12469,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 @@ -12469,7 +12477,7 @@ Açık apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 @@ -12477,7 +12485,7 @@ Koyu apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 @@ -12485,7 +12493,7 @@ Çalkantılı zamanlar için dikkat dağıtmayan bir deneyim apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 @@ -12493,7 +12501,7 @@ Biyometrik Kimlik Doğrulama apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 @@ -12501,7 +12509,7 @@ Parmak iziyle oturum aç apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 @@ -12509,7 +12517,7 @@ Deneysel Özellikler apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 @@ -12517,7 +12525,7 @@ Gelecek özelliklere göz atın apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 @@ -12525,11 +12533,11 @@ Kullanıcı Kimliği apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 @@ -12537,7 +12545,7 @@ Verileri Dışa Aktar apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -13341,7 +13349,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 @@ -13421,7 +13429,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -13448,8 +13456,8 @@ Do you really want to delete this asset profile? Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 @@ -13773,7 +13781,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -14645,7 +14653,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 @@ -14653,7 +14661,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14729,11 +14737,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14789,7 +14797,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14797,7 +14805,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14805,7 +14813,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14813,7 +14821,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 @@ -14821,7 +14829,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -14833,7 +14841,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14865,7 +14873,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -14873,7 +14881,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index b5fca055a..1cb9af6dd 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -10,19 +10,19 @@ apps/client/src/app/app.component.ts - 47 + 48 apps/client/src/app/app.component.ts - 48 + 49 apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/app.component.ts - 51 + 52 apps/client/src/app/components/header/header.component.ts @@ -289,7 +289,7 @@ apps/client/src/app/app.component.ts - 54 + 55 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -320,7 +320,7 @@ apps/client/src/app/app.component.ts - 55 + 56 apps/client/src/app/components/header/header.component.ts @@ -579,7 +579,7 @@ apps/client/src/app/app.component.ts - 49 + 50 apps/client/src/app/pages/about/about-page.component.ts @@ -594,7 +594,7 @@ apps/client/src/app/app.component.ts - 56 + 57 apps/client/src/app/components/header/header.component.ts @@ -625,7 +625,7 @@ apps/client/src/app/app.component.ts - 57 + 58 apps/client/src/app/components/header/header.component.ts @@ -696,7 +696,7 @@ apps/client/src/app/app.component.ts - 52 + 53 apps/client/src/app/pages/about/about-page.component.ts @@ -711,7 +711,7 @@ apps/client/src/app/app.component.ts - 58 + 59 apps/client/src/app/components/header/header.component.ts @@ -746,7 +746,7 @@ apps/client/src/app/app.component.ts - 59 + 60 apps/client/src/app/components/header/header.component.ts @@ -1440,31 +1440,35 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 80 + 81 apps/client/src/app/components/user-account-settings/user-account-settings.html - 84 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 88 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 92 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 apps/client/src/app/pages/features/features-page.html @@ -1475,7 +1479,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. apps/client/src/app/app.component.html - 179 + 184 @@ -1574,7 +1578,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 122 + 139 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1642,7 +1646,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 214 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1692,11 +1696,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 103 + 120 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 220 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1805,7 +1809,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 190 + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1865,7 +1873,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 98 + 115 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1992,7 +2000,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 330 + 347 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2008,7 +2016,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 60 + 58 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2035,7 +2043,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 337 + 354 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2051,7 +2059,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 67 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2066,35 +2074,35 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 67 + 72 ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 72 + 77 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 77 + 82 Do you really want to delete this asset profile? - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 185 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 282 + 281 @@ -2105,11 +2113,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 131 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 229 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2128,11 +2136,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 140 + 157 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 242 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2151,7 +2159,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 130 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2177,7 +2185,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 65 + 82 @@ -2223,7 +2231,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 223 + 233 @@ -2244,7 +2252,7 @@ Import apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 91 + 108 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -2259,7 +2267,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 159 + 176 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2270,7 +2278,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 185 apps/client/src/app/components/admin-users/admin-users.html @@ -2285,11 +2293,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 190 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 312 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2304,11 +2312,11 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 200 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 306 + 323 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2319,28 +2327,28 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 270 Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 259 + 276 Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 270 + 287 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 334 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2736,7 +2744,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 110 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2747,7 +2755,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 119 + 128 @@ -3005,14 +3013,14 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 191 + 142 Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 263 + 214 @@ -3476,7 +3484,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 99 + 188 @@ -3487,7 +3495,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 @@ -3498,7 +3506,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 @@ -3509,7 +3517,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 @@ -3520,7 +3528,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 117 + 209 @@ -3608,7 +3616,7 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 188 + 189 @@ -3650,49 +3658,49 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 113 + 121 Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 115 + 123 Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 138 + 146 Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 152 + 160 Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 153 + 161 Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 154 + 162 Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 163 + 171 apps/client/src/app/pages/features/features-page.html @@ -3703,53 +3711,53 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 164 + 172 Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 180 + 188 Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 181 + 189 Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 198 + 206 Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 207 User ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 47 + 45 apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 223 Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 223 + 231 @@ -4603,7 +4611,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 168 + 171 @@ -4988,7 +4996,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 42 + 43 libs/ui/src/lib/i18n.ts @@ -5006,14 +5014,14 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -13533,7 +13541,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 126 + 111 @@ -14067,14 +14075,14 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 317 + 327 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 305 @@ -14156,11 +14164,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 @@ -14188,35 +14196,35 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 109 + 198 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 MTD libs/ui/src/lib/assistant/assistant.component.ts - 105 + 194 WTD libs/ui/src/lib/assistant/assistant.component.ts - 101 + 190 @@ -14234,7 +14242,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 39 + 38 @@ -14255,14 +14263,14 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 112 + 202 years libs/ui/src/lib/assistant/assistant.component.ts - 114 + 206 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf new file mode 100644 index 000000000..7ff1ce5bb --- /dev/null +++ b/apps/client/src/locales/messages.zh.xlf @@ -0,0 +1,15009 @@ + + + + + + about + 关于 + + apps/client/src/app/app-routing.module.ts + 9 + + + apps/client/src/app/app.component.ts + 48 + + + apps/client/src/app/app.component.ts + 49 + + + apps/client/src/app/app.component.ts + 50 + + + apps/client/src/app/app.component.ts + 52 + + + apps/client/src/app/components/header/header.component.ts + 76 + + + apps/client/src/app/components/header/header.component.ts + 81 + + + apps/client/src/app/pages/about/about-page.component.ts + 45 + + + apps/client/src/app/pages/about/about-page.component.ts + 50 + + + apps/client/src/app/pages/about/about-page.component.ts + 55 + + + apps/client/src/app/pages/about/about-page.component.ts + 63 + + + apps/client/src/app/pages/about/about-page.component.ts + 74 + + + apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts + 14 + + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts + 13 + + + apps/client/src/app/pages/landing/landing-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts + 22 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allinvestview-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allvue-systems-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/basil-finance-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/beanvest-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capitally-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capmon-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/compound-planning-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/de.fi-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/eightfigures-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/empower-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/fina-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finary-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finwise-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/intuit-mint-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/magnifi-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/markets.sh-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monarch-money-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/rocket-money-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockle-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockmarketeye-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/tiller-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/vyzer-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthfolio-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthica-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/whal-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts + 26 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/ynab-page.component.ts + 26 + + + + faq + 常见问题 + + apps/client/src/app/app-routing.module.ts + 10 + + + apps/client/src/app/app.component.ts + 55 + + + apps/client/src/app/pages/about/overview/about-overview-page.component.ts + 19 + + + apps/client/src/app/pages/faq/faq-page.component.ts + 37 + + + apps/client/src/app/pages/faq/faq-page.component.ts + 42 + + + apps/client/src/app/pages/faq/faq-page.component.ts + 48 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 17 + + + + features + 功能 + + apps/client/src/app/app-routing.module.ts + 11 + + + apps/client/src/app/app.component.ts + 56 + + + apps/client/src/app/components/header/header.component.ts + 77 + + + apps/client/src/app/components/header/header.component.ts + 82 + + + apps/client/src/app/pages/about/overview/about-overview-page.component.ts + 20 + + + apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts + 15 + + + apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts + 15 + + + apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts + 15 + + + apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts + 14 + + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 14 + + + apps/client/src/app/pages/pricing/pricing-page.component.ts + 35 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allinvestview-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allvue-systems-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/basil-finance-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/beanvest-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capitally-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capmon-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/compound-planning-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/de.fi-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/eightfigures-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/empower-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/fina-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finary-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finwise-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/intuit-mint-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/magnifi-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/markets.sh-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monarch-money-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/rocket-money-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockle-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockmarketeye-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/tiller-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/vyzer-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthfolio-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthica-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/whal-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/ynab-page.component.ts + 27 + + + + license + 许可 + + apps/client/src/app/app-routing.module.ts + 12 + + + apps/client/src/app/app.component.ts + 50 + + + apps/client/src/app/pages/about/about-page.component.ts + 55 + + + + markets + 市场 + + apps/client/src/app/app-routing.module.ts + 13 + + + apps/client/src/app/app.component.ts + 57 + + + apps/client/src/app/components/header/header.component.ts + 78 + + + apps/client/src/app/components/header/header.component.ts + 83 + + + apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts + 16 + + + apps/client/src/app/pages/faq/saas/saas-page.component.ts + 14 + + + + pricing + 价钱 + + apps/client/src/app/app-routing.module.ts + 14 + + + apps/client/src/app/app.component.ts + 58 + + + apps/client/src/app/components/header/header.component.ts + 79 + + + apps/client/src/app/components/header/header.component.ts + 84 + + + apps/client/src/app/components/home-summary/home-summary.component.ts + 125 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts + 14 + + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 38 + + + apps/client/src/app/core/http-response.interceptor.ts + 81 + + + apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts + 14 + + + apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts + 16 + + + apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts + 14 + + + apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts + 16 + + + apps/client/src/app/pages/faq/saas/saas-page.component.ts + 15 + + + libs/ui/src/lib/membership-card/membership-card.component.ts + 13 + + + + privacy-policy + 隐私政策 + + apps/client/src/app/app-routing.module.ts + 15 + + + apps/client/src/app/app.component.ts + 53 + + + apps/client/src/app/pages/about/about-page.component.ts + 63 + + + + register + 注册 + + apps/client/src/app/app-routing.module.ts + 16 + + + apps/client/src/app/app.component.ts + 59 + + + apps/client/src/app/components/header/header.component.ts + 85 + + + apps/client/src/app/core/auth.guard.ts + 54 + + + apps/client/src/app/pages/faq/saas/saas-page.component.ts + 16 + + + apps/client/src/app/pages/features/features-page.component.ts + 18 + + + apps/client/src/app/pages/landing/landing-page.component.ts + 27 + + + apps/client/src/app/pages/pricing/pricing-page.component.ts + 36 + + + + resources + 资源 + + apps/client/src/app/app-routing.module.ts + 17 + + + apps/client/src/app/app.component.ts + 60 + + + apps/client/src/app/components/header/header.component.ts + 80 + + + apps/client/src/app/components/header/header.component.ts + 86 + + + apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts + 14 + + + apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts + 14 + + + apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts + 13 + + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts + 14 + + + apps/client/src/app/pages/features/features-page.component.ts + 19 + + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts + 14 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allinvestview-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/allvue-systems-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/basil-finance-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/beanvest-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capitally-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/capmon-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/compound-planning-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/de.fi-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/eightfigures-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/empower-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/fina-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finary-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/finwise-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/intuit-mint-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/magnifi-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/markets.sh-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monarch-money-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/rocket-money-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockle-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/stockmarketeye-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/tiller-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/vyzer-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthfolio-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/wealthica-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/whal-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts + 29 + + + apps/client/src/app/pages/resources/personal-finance-tools/products/ynab-page.component.ts + 29 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 19 + + + + You are using the Live Demo. + 您正在使用现场演示。 + + apps/client/src/app/app.component.html + 17 + + + + Create Account + 创建账户 + + apps/client/src/app/app.component.html + 18 + + + apps/client/src/app/pages/register/register-page.html + 26 + + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 2 + + + + Personal Finance + 个人财务 + + apps/client/src/app/app.component.html + 55 + + + + Markets + 市场 + + apps/client/src/app/app.component.html + 58 + + + apps/client/src/app/components/header/header.component.html + 381 + + + apps/client/src/app/components/home-market/home-market.html + 2 + + + apps/client/src/app/pages/resources/resources-page.html + 56 + + + + Resources + 资源 + + apps/client/src/app/app.component.html + 60 + + + apps/client/src/app/components/header/header.component.html + 80 + + + apps/client/src/app/components/header/header.component.html + 284 + + + apps/client/src/app/pages/resources/resources-page.html + 4 + + + + About + 关于 + + apps/client/src/app/app.component.html + 66 + + + apps/client/src/app/components/header/header.component.html + 111 + + + apps/client/src/app/components/header/header.component.html + 352 + + + + Blog + 博客 + + apps/client/src/app/app.component.html + 68 + + + apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html + 204 + + + apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html + 183 + + + apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html + 183 + + + apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html + 183 + + + apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html + 209 + + + apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html + 195 + + + apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html + 181 + + + apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html + 141 + + + apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html + 168 + + + apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html + 178 + + + apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html + 202 + + + apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html + 252 + + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 233 + + + apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html + 243 + + + apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html + 154 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html + 273 + + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 181 + + + apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.html + 148 + + + apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html + 270 + + + apps/client/src/app/pages/blog/blog-page.html + 5 + + + + Changelog + 变更日志 + + apps/client/src/app/app.component.html + 71 + + + apps/client/src/app/pages/about/changelog/changelog-page.html + 4 + + + + Features + 功能 + + apps/client/src/app/app.component.html + 73 + + + apps/client/src/app/components/header/header.component.html + 339 + + + apps/client/src/app/pages/features/features-page.html + 5 + + + + Frequently Asked Questions (FAQ) + 常见问题 (FAQ) + + apps/client/src/app/app.component.html + 76 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 146 + + + + License + 许可 + + apps/client/src/app/app.component.html + 80 + + + apps/client/src/app/pages/about/license/license-page.html + 4 + + + + Pricing + 价钱 + + apps/client/src/app/app.component.html + 86 + + + apps/client/src/app/components/header/header.component.html + 98 + + + apps/client/src/app/components/header/header.component.html + 296 + + + apps/client/src/app/components/header/header.component.html + 365 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 188 + + + + Privacy Policy + 隐私政策 + + apps/client/src/app/app.component.html + 90 + + + apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html + 4 + + + + Community + 社区 + + apps/client/src/app/app.component.html + 105 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 81 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 86 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 90 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 94 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 98 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 103 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 108 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 112 + + + apps/client/src/app/pages/features/features-page.html + 256 + + + + The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. + 交易损失的风险可能很大。不建议将短期内可能需要的资金进行投资。 + + apps/client/src/app/app.component.html + 184 + + + + Alias + 别名 + + apps/client/src/app/components/access-table/access-table.component.html + 3 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 11 + + + + Grantee + 受赠者 + + apps/client/src/app/components/access-table/access-table.component.html + 10 + + + + Type + 类型 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 28 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 22 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 12 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 159 + + + + Details + 细节 + + apps/client/src/app/components/access-table/access-table.component.html + 32 + + + + Revoke + 撤销 + + apps/client/src/app/components/access-table/access-table.component.html + 59 + + + + Do you really want to revoke this granted access? + 您真的要撤销此授予的访问权限吗? + + apps/client/src/app/components/access-table/access-table.component.ts + 50 + + + + Cash Balance + 现金余额 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 45 + + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 117 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 34 + + + + Equity + 公平 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 56 + + + + Activities + 活动 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 61 + + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 90 + + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 100 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 139 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 44 + + + apps/client/src/app/components/admin-users/admin-users.html + 134 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 178 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 287 + + + apps/client/src/app/pages/portfolio/activities/activities-page.html + 4 + + + + Platform + 平台 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 65 + + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 72 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 48 + + + + Cash Balances + 现金余额 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 114 + + + + Transfer Cash Balance + 转移现金余额 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 9 + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 7 + + + + Name + 名称 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 34 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 38 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 214 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 30 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 7 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 30 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 7 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 15 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 138 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 136 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 28 + + + + Total + 全部的 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 45 + + + + Currency + 货币 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 55 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 120 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 220 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 25 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 144 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 274 + + + + Value + 价值 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 152 + + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 187 + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 45 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 198 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 199 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 201 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 263 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 264 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 265 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 266 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 20 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 255 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 291 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 74 + + + + Edit + 编辑 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 254 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 175 + + + apps/client/src/app/components/admin-overview/admin-overview.html + 80 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 91 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 71 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 428 + + + + Delete + 删除 + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 264 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 194 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 62 + + + apps/client/src/app/components/admin-overview/admin-overview.html + 90 + + + apps/client/src/app/components/admin-overview/admin-overview.html + 199 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 101 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 81 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 51 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 450 + + + + Do you really want to delete this account? + 您真的要删除该帐户吗? + + apps/client/src/app/components/accounts-table/accounts-table.component.ts + 101 + + + + Asset Profile + 资产概况 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 31 + + + + Historical Market Data + 历史市场数据 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 37 + + + + Symbol + 符号 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 45 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 24 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 115 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 34 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 257 + + + + Data Source + 数据源 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 54 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 51 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 154 + + + + Attempts + 尝试 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + Created + 创建 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 72 + + + + Finished + 完成的 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 81 + + + + Status + 状况 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 90 + + + + Delete Jobs + 删除作业 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 126 + + + + View Data + 查看数据 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 141 + + + + View Stacktrace + 查看堆栈跟踪 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 148 + + + + Delete Job + 删除作业 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 151 + + + + Details for + 详细信息 + + apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html + 2 + + + + Date + 日期 + + apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html + 6 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 160 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 11 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 168 + + + + Market Price + 市场价 + + apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html + 26 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 81 + + + + Cancel + 取消 + + apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html + 46 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 347 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 40 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 19 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 13 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 58 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 103 + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 57 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 412 + + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 38 + + + + Save + 保存 + + apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html + 48 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 354 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 47 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 26 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 20 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 65 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 110 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 419 + + + + Currencies + 货币 + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 72 + + + + ETFs without Countries + 没有国家的 ETF + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 77 + + + + ETFs without Sectors + 无行业类别的 ETF + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 82 + + + + Do you really want to delete this asset profile? + 您确实要删除此资产配置文件吗? + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 13 + + + + Filter by... + 过滤... + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 281 + + + + Asset Class + 资产类别 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 60 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 148 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 229 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 184 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 338 + + + + Asset Sub Class + 资产子类别 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 69 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 157 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 242 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 193 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 354 + + + + First Activity + 第一个活动 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 78 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 130 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 166 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 50 + + + + Activities Count + 活动计数 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 87 + + + + Historical Data + 历史数据 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 96 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 82 + + + + Sectors Count + 行业数 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 105 + + + + Countries Count + 国家数 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 114 + + + + Gather Recent Data + 收集最近的数据 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 144 + + + + Gather All Data + 收集所有数据 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 147 + + + + Gather Profile Data + 收集个人资料数据 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 150 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Oops! Could not parse historical data. + 哎呀!无法解析历史数据。 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 233 + + + + Refresh + 刷新 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 22 + + + + Gather Historical Data + 收集历史数据 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 32 + + + + Import + 导入 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 108 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 154 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 189 + + + + Sector + 行业 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 176 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 210 + + + + Country + 国家 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 185 + + + apps/client/src/app/components/admin-users/admin-users.html + 77 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 220 + + + + Sectors + 行业 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 190 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 312 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 226 + + + apps/client/src/app/pages/public/public-page.html + 45 + + + + Countries + 国家 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 200 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 323 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 238 + + + + Benchmark + 基准 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 270 + + + + Symbol Mapping + 符号映射 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 276 + + + + Scraper Configuration + 刮削配置 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 287 + + + + Note + 笔记 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 334 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 78 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 323 + + + + Add Asset Profile + 添加资产概况 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 7 + + + + Search + 搜索 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 16 + + + + Add Manually + 手动添加 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 19 + + + + Name, symbol or ISIN + 名称、符号或 ISIN + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 25 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 122 + + + + Please add a currency: + 请添加货币: + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 122 + + + + is an invalid currency! + 是无效的货币! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 129 + + + + Do you really want to delete this coupon? + 您确实要删除此优惠券吗? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 140 + + + + Do you really want to delete this currency? + 您真的要删除该货币吗? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 153 + + + + Do you really want to delete this system message? + 您真的要删除这条系统消息吗? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 166 + + + + Do you really want to flush the cache? + 您真的要刷新缓存吗? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 183 + + + + Please set your system message: + 请设置您的系统消息: + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 214 + + + + Version + 版本 + + apps/client/src/app/components/admin-overview/admin-overview.html + 7 + + + + User Count + 用户数 + + apps/client/src/app/components/admin-overview/admin-overview.html + 13 + + + + Activity Count + 活动计数 + + apps/client/src/app/components/admin-overview/admin-overview.html + 23 + + + + per User + 每位用户 + + apps/client/src/app/components/admin-overview/admin-overview.html + 32 + + + + Exchange Rates + 汇率 + + apps/client/src/app/components/admin-overview/admin-overview.html + 37 + + + + Add Currency + 添加货币 + + apps/client/src/app/components/admin-overview/admin-overview.html + 104 + + + + User Signup + 用户注册 + + apps/client/src/app/components/admin-overview/admin-overview.html + 110 + + + + Read-only Mode + 只读模式 + + apps/client/src/app/components/admin-overview/admin-overview.html + 123 + + + + System Message + 系统信息 + + apps/client/src/app/components/admin-overview/admin-overview.html + 145 + + + + Set Message + 设置留言 + + apps/client/src/app/components/admin-overview/admin-overview.html + 165 + + + + Coupons + 优惠券 + + apps/client/src/app/components/admin-overview/admin-overview.html + 173 + + + + Add + 添加 + + apps/client/src/app/components/admin-overview/admin-overview.html + 231 + + + + Housekeeping + 家政 + + apps/client/src/app/components/admin-overview/admin-overview.html + 238 + + + + Flush Cache + 刷新缓存 + + apps/client/src/app/components/admin-overview/admin-overview.html + 242 + + + + Add Platform + 添加平台 + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 11 + + + + Url + 网址 + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 50 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 13 + + + + Accounts + 帐户 + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 64 + + + apps/client/src/app/components/admin-users/admin-users.html + 113 + + + apps/client/src/app/components/header/header.component.html + 54 + + + apps/client/src/app/components/header/header.component.html + 257 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 312 + + + apps/client/src/app/pages/accounts/accounts-page.html + 4 + + + libs/ui/src/lib/assistant/assistant.html + 107 + + + + Do you really want to delete this platform? + 您真的要删除这个平台吗? + + apps/client/src/app/components/admin-platform/admin-platform.component.ts + 79 + + + + Update platform + 更新平台 + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 2 + + + + Add platform + 添加平台 + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 3 + + + + Platforms + 平台 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 4 + + + + Tags + 标签 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 10 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 332 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 367 + + + libs/ui/src/lib/assistant/assistant.html + 127 + + + + Add Tag + 添加标签 + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 11 + + + + Do you really want to delete this tag? + 您真的要删除此标签吗? + + apps/client/src/app/components/admin-tag/admin-tag.component.ts + 79 + + + + Update tag + 更新标签 + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 2 + + + + Add tag + 添加标签 + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 3 + + + + Do you really want to delete this user? + 您真的要删除该用户吗? + + apps/client/src/app/components/admin-users/admin-users.component.ts + 113 + + + + User + 用户 + + apps/client/src/app/components/admin-users/admin-users.html + 29 + + + + Registration + 注册 + + apps/client/src/app/components/admin-users/admin-users.html + 96 + + + + Engagement per Day + 每天的参与度 + + apps/client/src/app/components/admin-users/admin-users.html + 158 + + + + Last Request + 最后请求 + + apps/client/src/app/components/admin-users/admin-users.html + 183 + + + + Impersonate User + 模拟用户 + + apps/client/src/app/components/admin-users/admin-users.html + 222 + + + + Delete User + 删除用户 + + apps/client/src/app/components/admin-users/admin-users.html + 232 + + + + Performance + 表现 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 6 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 59 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 119 + + + + Compare with... + 与之比较... + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 19 + + + + Manage Benchmarks + 管理基准 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 38 + + + + Portfolio + 文件夹 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts + 116 + + + apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts + 48 + + + + Benchmark + 基准 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts + 128 + + + + Current Market Mood + 当前市场情绪 + + apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html + 12 + + + + Overview + 概述 + + apps/client/src/app/components/header/header.component.html + 28 + + + apps/client/src/app/components/header/header.component.html + 239 + + + + Portfolio + 文件夹 + + apps/client/src/app/components/header/header.component.html + 41 + + + apps/client/src/app/components/header/header.component.html + 249 + + + + Admin Control + 管理控制 + + apps/client/src/app/components/header/header.component.html + 67 + + + apps/client/src/app/components/header/header.component.html + 273 + + + + Me + + + apps/client/src/app/components/header/header.component.html + 206 + + + + User + 用户 + + apps/client/src/app/components/header/header.component.html + 225 + + + + My Ghostfolio + 我的 Ghostfolio + + apps/client/src/app/components/header/header.component.html + 264 + + + + About Ghostfolio + 关于 Ghostfolio + + apps/client/src/app/components/header/header.component.html + 304 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 5 + + + + Sign in + 登入 + + apps/client/src/app/components/header/header.component.html + 394 + + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 71 + + + + Get started + 开始使用 + + apps/client/src/app/components/header/header.component.html + 406 + + + + Sign in + 登入 + + apps/client/src/app/components/header/header.component.ts + 226 + + + apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts + 7 + + + + Oops! Incorrect Security Token. + 哎呀!安全令牌不正确。 + + apps/client/src/app/components/header/header.component.ts + 240 + + + + Manage Activities + 管理活动 + + apps/client/src/app/components/home-holdings/home-holdings.html + 22 + + + apps/client/src/app/pages/portfolio/holdings/holdings-page.html + 32 + + + + Fear + 恐惧 + + apps/client/src/app/components/home-market/home-market.component.ts + 25 + + + libs/ui/src/lib/i18n.ts + 69 + + + + Greed + 贪婪 + + apps/client/src/app/components/home-market/home-market.component.ts + 26 + + + libs/ui/src/lib/i18n.ts + 70 + + + + Last Days + 最后的 + + apps/client/src/app/components/home-market/home-market.html + 6 + + + + Welcome to Ghostfolio + 欢迎来到Ghostfolio + + apps/client/src/app/components/home-overview/home-overview.html + 7 + + + + Ready to take control of your personal finances? + 准备好掌控您的个人财务了吗? + + apps/client/src/app/components/home-overview/home-overview.html + 8 + + + + Setup your accounts + 设置您的帐户 + + apps/client/src/app/components/home-overview/home-overview.html + 15 + + + + Get a comprehensive financial overview by adding your bank and brokerage accounts. + 通过添加您的银行和经纪账户来获取全面的财务概览。 + + apps/client/src/app/components/home-overview/home-overview.html + 17 + + + + Capture your activities + 记录你的活动 + + apps/client/src/app/components/home-overview/home-overview.html + 24 + + + + Record your investment activities to keep your portfolio up to date. + 记录您的投资活动以使您的投资组合保持最新状态。 + + apps/client/src/app/components/home-overview/home-overview.html + 26 + + + + Monitor and analyze your portfolio + 监控和分析您的投资组合 + + apps/client/src/app/components/home-overview/home-overview.html + 33 + + + + Track your progress in real-time with comprehensive analysis and insights. + 通过全面的分析和见解实时跟踪您的进度。 + + apps/client/src/app/components/home-overview/home-overview.html + 35 + + + + Setup accounts + 设置帐户 + + apps/client/src/app/components/home-overview/home-overview.html + 48 + + + + Add activity + 添加活动 + + apps/client/src/app/components/home-overview/home-overview.html + 56 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 8 + + + + This feature requires a subscription. + 此功能需要订阅。 + + apps/client/src/app/components/home-summary/home-summary.component.ts + 113 + + + apps/client/src/app/core/http-response.interceptor.ts + 68 + + + + Upgrade Plan + 升级计划 + + apps/client/src/app/components/home-summary/home-summary.component.ts + 115 + + + apps/client/src/app/core/http-response.interceptor.ts + 70 + + + + Summary + 概括 + + apps/client/src/app/components/home-summary/home-summary.html + 2 + + + + Total Amount + 总金额 + + apps/client/src/app/components/investment-chart/investment-chart.component.ts + 142 + + + + Savings Rate + 储蓄率 + + apps/client/src/app/components/investment-chart/investment-chart.component.ts + 214 + + + + Security Token + 安全令牌 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 11 + + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 10 + + + + or + + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 31 + + + apps/client/src/app/pages/landing/landing-page.html + 429 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 99 + + + apps/client/src/app/pages/register/register-page.html + 29 + + + apps/client/src/app/pages/webauthn/webauthn-page.html + 29 + + + + Sign in with Internet Identity + 使用互联网身份登录 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 42 + + + + Sign in with Google + 使用 Google 登录 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 52 + + + + Stay signed in + 保持登录 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 61 + + + + Time in Market + 上市时间 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 3 + + + + + + + + + + + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 12 + + + + {VAR_PLURAL, plural, =1 {transaction} other {transactions}} + {VAR_PLURAL,复数,=1 {交易} 其他{交易}} + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 14 + + + + Buy + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 21 + + + + Sell + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 33 + + + + Investment + 投资 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 48 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 134 + + + + Absolute Gross Performance + 绝对总业绩 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + + Gross Performance + 总表现 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 77 + + + + Fees + 费用 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 100 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 156 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 161 + + + + Absolute Net Performance + 绝对净绩效 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 116 + + + + Net Performance + 净绩效 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 133 + + + + Total Assets + 总资产 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 159 + + + + Valuables + 贵重物品 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 172 + + + + Emergency Fund + 应急基金 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 184 + + + apps/client/src/app/pages/features/features-page.html + 89 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 122 + + + + Cash + 现金 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 205 + + + + Assets + 资产 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 218 + + + + Buying Power + 购买力 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 231 + + + + Excluded from Analysis + 从分析中排除 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 243 + + + + Liabilities + 负债 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 258 + + + apps/client/src/app/pages/features/features-page.html + 102 + + + + Net Worth + 净值 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 278 + + + + Annualized Performance + 年化业绩 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 290 + + + + Interest + 利息 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 312 + + + + Dividend + 股息 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 324 + + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 145 + + + apps/client/src/app/pages/features/features-page.html + 63 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 196 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 261 + + + + Please enter the amount of your emergency fund: + 请输入您的应急基金金额: + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts + 53 + + + + Change + 修改 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 48 + + + + Average Unit Price + 平均单价 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 70 + + + + Minimum Price + 最低价格 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 97 + + + + Maximum Price + 最高价格 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 113 + + + + Quantity + 数量 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 123 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 183 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 184 + + + + Report Data Glitch + 报告数据故障 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 350 + + + + Are you an ambitious investor who needs the full picture? + 您是一位雄心勃勃、需要全面了解的投资者吗? + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 12 + + + + Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: + 立即升级至 Ghostfolio Premium 并获得独家功能,以增强您的投资体验: + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 15 + + + + Portfolio Summary + 投资组合摘要 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 22 + + + apps/client/src/app/pages/pricing/pricing-page.html + 55 + + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + + + Portfolio Allocations + 投资组合分配 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 26 + + + apps/client/src/app/pages/features/features-page.html + 160 + + + apps/client/src/app/pages/pricing/pricing-page.html + 59 + + + apps/client/src/app/pages/pricing/pricing-page.html + 203 + + + + Performance Benchmarks + 性能基准 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 30 + + + apps/client/src/app/pages/pricing/pricing-page.html + 63 + + + apps/client/src/app/pages/pricing/pricing-page.html + 207 + + + + FIRE Calculator + 财务自由计算器 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 34 + + + apps/client/src/app/pages/pricing/pricing-page.html + 67 + + + apps/client/src/app/pages/pricing/pricing-page.html + 211 + + + + Professional Data Provider + 专业数据提供商 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 38 + + + apps/client/src/app/pages/pricing/pricing-page.html + 226 + + + + and more Features... + 以及更多功能... + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 42 + + + apps/client/src/app/pages/pricing/pricing-page.html + 83 + + + apps/client/src/app/pages/pricing/pricing-page.html + 231 + + + + Get the tools to effectively manage your finances and refine your personal investment strategy. + 获取有效管理财务和完善个人投资策略的工具。 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 45 + + + + Skip + 跳过 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 52 + + + + Upgrade Plan + 升级计划 + + apps/client/src/app/components/header/header.component.html + 177 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 59 + + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 20 + + + apps/client/src/app/pages/pricing/pricing-page.html + 268 + + + + Today + 今天 + + apps/client/src/app/components/toggle/toggle.component.ts + 22 + + + libs/ui/src/lib/assistant/assistant.component.ts + 188 + + + + YTD + 年初至今 + + apps/client/src/app/components/toggle/toggle.component.ts + 23 + + + libs/ui/src/lib/assistant/assistant.component.ts + 198 + + + + 1Y + 1年 + + apps/client/src/app/components/toggle/toggle.component.ts + 24 + + + libs/ui/src/lib/assistant/assistant.component.ts + 202 + + + + 5Y + 5年 + + apps/client/src/app/components/toggle/toggle.component.ts + 25 + + + libs/ui/src/lib/assistant/assistant.component.ts + 206 + + + + Max + 最大限度 + + apps/client/src/app/components/toggle/toggle.component.ts + 26 + + + libs/ui/src/lib/assistant/assistant.component.ts + 209 + + + + Grant access + 授予访问权限 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 7 + + + + Public + 公开 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 25 + + + + Granted Access + 授予访问权限 + + apps/client/src/app/components/user-account-access/user-account-access.html + 5 + + + + Please enter your coupon code: + 请输入您的优惠券代码: + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 111 + + + + Could not redeem coupon code + 无法兑换优惠券代码 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 121 + + + + Coupon code has been redeemed + 优惠券代码已兑换 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 133 + + + + Reload + 重新加载 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 134 + + + + per year + 每年 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 41 + + + apps/client/src/app/pages/pricing/pricing-page.html + 254 + + + + Try Premium + 尝试高级版 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 50 + + + + Redeem Coupon + 兑换优惠券 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 63 + + + + Auto + 自动 + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 33 + + + + Do you really want to remove this sign in method? + 您确实要删除此登录方法吗? + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 189 + + + + Settings + 设置 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 2 + + + + Presenter View + 演示者视图 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 7 + + + + Protection for sensitive information like absolute performances and quantity values + 保护绝对性能和数量值等敏感信息 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 8 + + + + Base Currency + 基础货币 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 27 + + + + Language + 语言 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 50 + + + + Locale + 语言环境 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 121 + + + + Date and number format + 日期和数字格式 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 123 + + + + Appearance + 外貌 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 146 + + + + Auto + 自动 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 160 + + + + Light + 明亮 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 161 + + + + Dark + 黑暗 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 162 + + + + Zen Mode + 极简模式 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 171 + + + apps/client/src/app/pages/features/features-page.html + 190 + + + + Distraction-free experience for turbulent times + 动荡时期的无干扰体验 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 172 + + + + Biometric Authentication + 生物识别认证 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 188 + + + + Sign in with fingerprint + 使用指纹登录 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 189 + + + + Experimental Features + 实验性功能 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 206 + + + + Sneak peek at upcoming functionality + 预览即将推出的功能 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 207 + + + + User ID + 用户身份 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 45 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 223 + + + + Export Data + 导出数据 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 231 + + + + This feature is currently unavailable. + 此功能目前无法使用。 + + apps/client/src/app/core/http-response.interceptor.ts + 60 + + + + Please try again later. + 请稍后再试。 + + apps/client/src/app/core/http-response.interceptor.ts + 62 + + + apps/client/src/app/core/http-response.interceptor.ts + 89 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 138 + + + + Oops! Something went wrong. + 哎呀!出了些问题。 + + apps/client/src/app/core/http-response.interceptor.ts + 87 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 136 + + + + Okay + 好的 + + apps/client/src/app/core/http-response.interceptor.ts + 90 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 139 + + + + About + 关于 + + apps/client/src/app/pages/about/about-page-routing.module.ts + 51 + + + apps/client/src/app/pages/about/about-page.component.ts + 44 + + + apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts + 13 + + + + Changelog + 更新日志 + + apps/client/src/app/pages/about/about-page.component.ts + 49 + + + apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts + 13 + + + + License + 许可 + + apps/client/src/app/pages/about/about-page.component.ts + 54 + + + apps/client/src/app/pages/about/license/license-page-routing.module.ts + 13 + + + + Privacy Policy + 隐私政策 + + apps/client/src/app/pages/about/about-page.component.ts + 62 + + + apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts + 13 + + + + Our + 我们的 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 6 + + + + Discover other exciting Open Source Software projects + 发现其他令人兴奋的开源软件项目 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 9 + + + + Visit + 访问 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 28 + + + + Accounts + 账户 + + apps/client/src/app/pages/accounts/accounts-page-routing.module.ts + 13 + + + + Oops, cash balance transfer has failed. + 糟糕,现金余额转账失败。 + + apps/client/src/app/pages/accounts/accounts-page.component.ts + 306 + + + + Update account + 更新账户 + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 8 + + + + Add account + 新增帐户 + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 10 + + + + Account ID + 帐户ID + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 96 + + + + From + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 11 + + + + To + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 28 + + + + Transfer + 转移 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 64 + + + + Admin Control + 管理控制 + + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 20 + + + + Market Data + 市场数据 + + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 30 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 37 + + + + Settings + 设置 + + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 35 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 32 + + + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 18 + + + apps/client/src/app/pages/user-account/user-account-page.component.ts + 35 + + + + Users + 用户 + + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 40 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 47 + + + + Overview + 概述 + + apps/client/src/app/pages/admin/admin-page.component.ts + 27 + + + apps/client/src/app/pages/home/home-page.component.ts + 34 + + + apps/client/src/app/pages/zen/zen-page-routing.module.ts + 19 + + + apps/client/src/app/pages/zen/zen-page.component.ts + 34 + + + + Blog + 博客 + + apps/client/src/app/pages/blog/blog-page-routing.module.ts + 13 + + + + Discover the latest Ghostfolio updates and insights on personal finance + 了解最新的 Ghostfolio 更新和个人理财见解 + + apps/client/src/app/pages/blog/blog-page.html + 7 + + + + As you are already logged in, you cannot access the demo account. + 由于您已经登录,因此无法访问模拟帐户。 + + apps/client/src/app/pages/demo/demo-page.component.ts + 32 + + + + Frequently Asked Questions (FAQ) + 常见问题 (FAQ) + + apps/client/src/app/pages/faq/faq-page-routing.module.ts + 34 + + + apps/client/src/app/pages/faq/overview/faq-overview-page-routing.module.ts + 13 + + + + Frequently Asked Questions (FAQ) + 常见问题 (FAQ) + + apps/client/src/app/pages/faq/overview/faq-overview-page.html + 4 + + + apps/client/src/app/pages/faq/saas/saas-page.html + 4 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html + 4 + + + + Features + 功能 + + apps/client/src/app/pages/features/features-page-routing.module.ts + 13 + + + + Check out the numerous features of Ghostfolio to manage your wealth + 查看 Ghostfolio 的众多功能来管理您的财富 + + apps/client/src/app/pages/features/features-page.html + 6 + + + + Stocks + 股票 + + apps/client/src/app/pages/features/features-page.html + 15 + + + + ETFs + ETF + + apps/client/src/app/pages/features/features-page.html + 25 + + + + Bonds + 债券 + + apps/client/src/app/pages/features/features-page.html + 38 + + + + Cryptocurrencies + 加密货币 + + apps/client/src/app/pages/features/features-page.html + 51 + + + + Wealth Items + 财富项目 + + apps/client/src/app/pages/features/features-page.html + 76 + + + + Import and Export + 导入和导出 + + apps/client/src/app/pages/features/features-page.html + 115 + + + + Multi-Accounts + 多账户 + + apps/client/src/app/pages/features/features-page.html + 127 + + + + Portfolio Calculations + 投资组合计算 + + apps/client/src/app/pages/features/features-page.html + 141 + + + + Dark Mode + 深色模式 + + apps/client/src/app/pages/features/features-page.html + 177 + + + + Market Mood + 市场情绪 + + apps/client/src/app/pages/features/features-page.html + 205 + + + + Static Analysis + 静态分析 + + apps/client/src/app/pages/features/features-page.html + 224 + + + + Multi-Language + 多语言 + + apps/client/src/app/pages/features/features-page.html + 241 + + + + Open Source Software + 开源软件 + + apps/client/src/app/pages/features/features-page.html + 275 + + + + Get Started + 立即开始 + + apps/client/src/app/pages/features/features-page.html + 300 + + + apps/client/src/app/pages/public/public-page.html + 153 + + + + Holdings + 控股 + + apps/client/src/app/pages/home/home-page-routing.module.ts + 23 + + + apps/client/src/app/pages/home/home-page.component.ts + 39 + + + apps/client/src/app/pages/portfolio/holdings/holdings-page-routing.module.ts + 13 + + + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 39 + + + apps/client/src/app/pages/zen/zen-page.component.ts + 39 + + + + Summary + 概括 + + apps/client/src/app/pages/home/home-page-routing.module.ts + 28 + + + apps/client/src/app/pages/home/home-page.component.ts + 44 + + + + Markets + 市场 + + apps/client/src/app/pages/home/home-page-routing.module.ts + 33 + + + apps/client/src/app/pages/home/home-page.component.ts + 49 + + + apps/client/src/app/pages/markets/markets-page-routing.module.ts + 13 + + + + Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. + Ghostfolio 是一个个人财务仪表板,用于跨多个平台跟踪您的净资产,包括现金、股票、ETF 和加密货币。 + + apps/client/src/app/pages/i18n/i18n-page.html + 4 + + + + app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 + 应用程序、资产、加密货币、仪表板、etf、财务、管理、绩效、投资组合、软件、股票、交易、财富、web3 + + apps/client/src/app/pages/i18n/i18n-page.html + 9 + + + + Open Source Wealth Management Software + 开源财富管理软件 + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + New + 新的 + + apps/client/src/app/pages/landing/landing-page.html + 7 + + + + Manage your wealth like a boss + 像老板一样管理您的财富 + + apps/client/src/app/pages/landing/landing-page.html + 11 + + + + Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. + Ghostfolio 是一个隐私优先、开源的个人财务仪表板。分解您的资产配置,了解您的净资产并做出可靠的、数据驱动的投资决策。 + + apps/client/src/app/pages/landing/landing-page.html + 15 + + + + Get Started + 开始使用 + + apps/client/src/app/pages/landing/landing-page.html + 47 + + + apps/client/src/app/pages/landing/landing-page.html + 425 + + + + or + + + apps/client/src/app/pages/landing/landing-page.html + 52 + + + + Live Demo + 现场演示 + + apps/client/src/app/pages/landing/landing-page.html + 55 + + + apps/client/src/app/pages/landing/landing-page.html + 430 + + + + Monthly Active Users + 每月活跃用户数 + + apps/client/src/app/pages/landing/landing-page.html + 75 + + + + Stars on GitHub + GitHub 上的星星 + + apps/client/src/app/pages/landing/landing-page.html + 93 + + + apps/client/src/app/pages/open/open-page.html + 103 + + + + Pulls on Docker Hub + 拉动 Docker Hub + + apps/client/src/app/pages/landing/landing-page.html + 111 + + + apps/client/src/app/pages/open/open-page.html + 117 + + + + As seen in + 如图所示 + + apps/client/src/app/pages/landing/landing-page.html + 119 + + + + Protect your assets. Refine your personal investment strategy. + 保护你的资产。完善你的个人投资策略 + + apps/client/src/app/pages/landing/landing-page.html + 221 + + + + Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. + Ghostfolio 使忙碌的人们能够在不被追踪的情况下跟踪股票、ETF 或加密货币。 + + apps/client/src/app/pages/landing/landing-page.html + 225 + + + + 360° View + 360° 视角 + + apps/client/src/app/pages/landing/landing-page.html + 236 + + + + Get the full picture of your personal finances across multiple platforms. + 跨多个平台全面了解您的个人财务状况。 + + apps/client/src/app/pages/landing/landing-page.html + 238 + + + + Web3 Ready + Web3 就绪 + + apps/client/src/app/pages/landing/landing-page.html + 247 + + + + Use Ghostfolio anonymously and own your financial data. + 匿名使用 Ghostfolio 并拥有您的财务数据。 + + apps/client/src/app/pages/landing/landing-page.html + 249 + + + + Open Source + 开源 + + apps/client/src/app/pages/landing/landing-page.html + 257 + + + + Benefit from continuous improvements through a strong community. + 通过强大的社区不断改进,从中受益。 + + apps/client/src/app/pages/landing/landing-page.html + 259 + + + + Why Ghostfolio? + 为什么使用Ghostfolio + + apps/client/src/app/pages/landing/landing-page.html + 268 + + + + Ghostfolio is for you if you are... + 如果您符合以下条件,那么 Ghostfolio 适合您... + + apps/client/src/app/pages/landing/landing-page.html + 269 + + + + trading stocks, ETFs or cryptocurrencies on multiple platforms + 在多个平台上交易股票、ETF 或加密货币 + + apps/client/src/app/pages/landing/landing-page.html + 276 + + + + pursuing a buy & hold strategy + 采取买入并持有策略 + + apps/client/src/app/pages/landing/landing-page.html + 282 + + + + interested in getting insights of your portfolio composition + 有兴趣深入了解您的投资组合构成 + + apps/client/src/app/pages/landing/landing-page.html + 287 + + + + valuing privacy and data ownership + 重视隐私和数据所有权 + + apps/client/src/app/pages/landing/landing-page.html + 292 + + + + into minimalism + 进入极简主义 + + apps/client/src/app/pages/landing/landing-page.html + 295 + + + + caring about diversifying your financial resources + 关心您的财务资源多元化 + + apps/client/src/app/pages/landing/landing-page.html + 299 + + + + interested in financial independence + 对财务独立感兴趣 + + apps/client/src/app/pages/landing/landing-page.html + 303 + + + + saying no to spreadsheets in + 对电子表格说不 + + apps/client/src/app/pages/landing/landing-page.html + 307 + + + + still reading this list + 仍在阅读此列表 + + apps/client/src/app/pages/landing/landing-page.html + 310 + + + + Learn more about Ghostfolio + 了解有关 Ghostfolio 的更多信息 + + apps/client/src/app/pages/landing/landing-page.html + 315 + + + + What our users are saying + 我们的什么用户正在说 + + apps/client/src/app/pages/landing/landing-page.html + 323 + + + + Members from around the globe are using Ghostfolio Premium + 来自世界各地的会员正在使用Ghostfolio 高级版 + + apps/client/src/app/pages/landing/landing-page.html + 355 + + + + How does Ghostfolio work? + 如何幽灵作品集工作? + + apps/client/src/app/pages/landing/landing-page.html + 367 + + + + Get started in only 3 steps + 只需 3 步即可开始 + + apps/client/src/app/pages/landing/landing-page.html + 370 + + + + Sign up anonymously* + 匿名注册* + + apps/client/src/app/pages/landing/landing-page.html + 376 + + + + * no e-mail address nor credit card required + * 无需电子邮件地址或信用卡 + + apps/client/src/app/pages/landing/landing-page.html + 378 + + + + Add any of your historical transactions + 添加您的任何历史交易 + + apps/client/src/app/pages/landing/landing-page.html + 389 + + + + Get valuable insights of your portfolio composition + 获取有关您的投资组合构成的宝贵见解 + + apps/client/src/app/pages/landing/landing-page.html + 401 + + + + Are you ready? + 准备好? + + apps/client/src/app/pages/landing/landing-page.html + 413 + + + + Join now or check out the example account + 立即加入或查看示例帐户 + + apps/client/src/app/pages/landing/landing-page.html + 414 + + + + At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. + 在 Ghostfolio,透明度是我们价值观的核心。我们将源代码发布为开源软件(OSS)下AGPL-3.0许可证我们公开分享平台运营状态的汇总关键指标。 + + apps/client/src/app/pages/open/open-page.html + 6 + + + + (Last 24 hours) + (最近 24 小时) + + apps/client/src/app/pages/open/open-page.html + 37 + + + + Active Users + 活跃用户 + + apps/client/src/app/pages/open/open-page.html + 40 + + + apps/client/src/app/pages/open/open-page.html + 62 + + + + (Last 30 days) + (最近 30 天) + + apps/client/src/app/pages/open/open-page.html + 48 + + + apps/client/src/app/pages/open/open-page.html + 59 + + + + New Users + 新用户 + + apps/client/src/app/pages/open/open-page.html + 51 + + + + Users in Slack community + Slack 社区的用户 + + apps/client/src/app/pages/open/open-page.html + 75 + + + + Contributors on GitHub + GitHub 上的贡献者 + + apps/client/src/app/pages/open/open-page.html + 89 + + + + (Last 90 days) + (过去 90 天) + + apps/client/src/app/pages/open/open-page.html + 127 + + + + Uptime + 正常运行时间 + + apps/client/src/app/pages/open/open-page.html + 132 + + + + Activities + 活动 + + apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts + 13 + + + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 44 + + + + Do you really want to delete all your activities? + 您真的要删除所有活动吗? + + apps/client/src/app/pages/portfolio/activities/activities-page.component.ts + 171 + + + + Update activity + 更新活动 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 7 + + + + Stocks, ETFs, bonds, cryptocurrencies, commodities + 股票、ETF、债券、加密货币、大宗商品 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 22 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 62 + + + + One-time fee, annual account fees + 一次性费用、年度账户费用 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 30 + + + + Distribution of corporate earnings + 企业盈利分配 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 38 + + + + Revenue for lending out money + 放贷收入 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 46 + + + + Mortgages, personal loans, credit cards + 抵押贷款、个人贷款、信用卡 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 54 + + + + Luxury items, real estate, private companies + 奢侈品、房地产、私营公司 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 70 + + + + Account + 帐户 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 82 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 306 + + + + Update Cash Balance + 更新现金余额 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 110 + + + + Unit Price + 单价 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 203 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 267 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 208 + + + + Oops! Could not get the historical exchange rate from + 哎呀!无法从以下来源获取历史汇率 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 232 + + + + Fee + 费用 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 286 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 314 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 232 + + + + Oops! Could not get the historical exchange rate from + 哎呀!无法获取历史汇率 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 304 + + + + Import Activities + 导入活动 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 44 + + + + Import Dividends + 导入股息 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 86 + + + + Importing data... + 正在导入数据... + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 120 + + + + Import has been completed + 导入已完成 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 128 + + + + Validating data... + 验证数据... + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 233 + + + + Select Holding + 选择控股 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 20 + + + + Select File + 选择文件 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 23 + + + + Holding + 保持 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 33 + + + + Load Dividends + 加载股息 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 70 + + + + Choose or drop a file here + 在此处选择或放置文件 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 86 + + + + The following file formats are supported: + 支持以下文件格式: + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 92 + + + + Select Dividends + 选择股息 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 115 + + + + Select Activities + 选择活动 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 118 + + + + Back + 后退 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 145 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 181 + + + + Allocations + 分配 + + apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts + 13 + + + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 49 + + + + Allocations + 分配 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 4 + + + + Proportion of Net Worth + 占净资产的比例 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 12 + + + + By Platform + 按平台 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 44 + + + + By Currency + 按货币 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 63 + + + + By Asset Class + 按资产类别 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 86 + + + + By Holding + 通过持有 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 109 + + + + By Sector + 按部门 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 132 + + + + By Continent + 按大陆 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 156 + + + + By Market + 按市场 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 179 + + + + Regions + 区域 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 203 + + + apps/client/src/app/pages/public/public-page.html + 76 + + + + Developed Markets + 发达市场 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 228 + + + apps/client/src/app/pages/public/public-page.html + 93 + + + + Emerging Markets + 新兴市场 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 237 + + + apps/client/src/app/pages/public/public-page.html + 102 + + + + Other Markets + 其他市场 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 246 + + + apps/client/src/app/pages/public/public-page.html + 111 + + + + No data available + 无可用数据 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 258 + + + apps/client/src/app/pages/public/public-page.html + 123 + + + + By Account + 按帐户 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 270 + + + + By ETF Provider + 按 ETF 提供商 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 290 + + + + By Country + 按国家/地区 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 313 + + + + Analysis + 分析 + + apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts + 13 + + + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 34 + + + + Dividend + 股息 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 43 + + + libs/ui/src/lib/i18n.ts + 31 + + + + Deposit + 订金 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 332 + + + + Monthly + 每月 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 55 + + + + Yearly + 每年 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 56 + + + + Analysis + 分析 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 2 + + + + Top + 顶部 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 168 + + + + Bottom + 底部 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 216 + + + + Portfolio Evolution + 投资组合演变 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 268 + + + + Investment Timeline + 投资时间表 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 298 + + + + Current Streak + 当前连胜 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 319 + + + + Longest Streak + 最长连续纪录 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 328 + + + + Dividend Timeline + 股息时间表 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 356 + + + + FIRE + 财务独立 + + apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts + 13 + + + + FIRE + 财务独立 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 4 + + + + Calculator + 计算器 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 7 + + + + 4% Rule + 4%规则 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 41 + + + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. + Ghostfolio X-ray 使用静态分析来识别您的投资组合中的潜在问题和风险。 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 111 + + + + Currency Cluster Risks + 货币集群风险 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 135 + + + + Account Cluster Risks + 账户集群风险 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 148 + + + + Holdings + 控股 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 77 + + + apps/client/src/app/pages/portfolio/holdings/holdings-page.html + 4 + + + apps/client/src/app/pages/public/public-page.html + 14 + + + libs/ui/src/lib/assistant/assistant.html + 46 + + + + Pricing + 价钱 + + apps/client/src/app/pages/pricing/pricing-page-routing.module.ts + 13 + + + + Pricing Plans + 定价计划 + + apps/client/src/app/pages/pricing/pricing-page.html + 4 + + + + Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. + 我们的官方 Ghostfolio Premium 云产品是最简单的入门方法。由于它节省了时间,这对于大多数人来说将是最佳选择。收入用于支付托管基础设施的成本和资助持续开发。 + + apps/client/src/app/pages/pricing/pricing-page.html + 6 + + + + If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. + 如果你希望在自己的基础设施上运行 Ghostfolio,请查看源代码和进一步的说明GitHub + + apps/client/src/app/pages/pricing/pricing-page.html + 24 + + + + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. + 适合喜欢在自己的基础设施上运行 Ghostfolio 的精通技术的投资者。 + + apps/client/src/app/pages/pricing/pricing-page.html + 36 + + + + Unlimited Transactions + 无限交易 + + apps/client/src/app/pages/pricing/pricing-page.html + 43 + + + apps/client/src/app/pages/pricing/pricing-page.html + 126 + + + apps/client/src/app/pages/pricing/pricing-page.html + 187 + + + + Unlimited Accounts + 无限账户 + + apps/client/src/app/pages/pricing/pricing-page.html + 47 + + + apps/client/src/app/pages/pricing/pricing-page.html + 130 + + + apps/client/src/app/pages/pricing/pricing-page.html + 191 + + + + Portfolio Performance + 投资组合表现 + + apps/client/src/app/pages/pricing/pricing-page.html + 51 + + + apps/client/src/app/pages/pricing/pricing-page.html + 134 + + + apps/client/src/app/pages/pricing/pricing-page.html + 195 + + + + Data Import and Export + 数据导入与导出 + + apps/client/src/app/pages/pricing/pricing-page.html + 71 + + + apps/client/src/app/pages/pricing/pricing-page.html + 138 + + + apps/client/src/app/pages/pricing/pricing-page.html + 215 + + + + Community Support + 社区支持 + + apps/client/src/app/pages/pricing/pricing-page.html + 88 + + + + Self-hosted, update manually. + 自托管,手动更新。 + + apps/client/src/app/pages/pricing/pricing-page.html + 92 + + + + Free + 自由的 + + apps/client/src/app/pages/pricing/pricing-page.html + 93 + + + apps/client/src/app/pages/pricing/pricing-page.html + 150 + + + + For new investors who are just getting started with trading. + 适合刚开始交易的新投资者。 + + apps/client/src/app/pages/pricing/pricing-page.html + 120 + + + + Fully managed Ghostfolio cloud offering. + 完全托管的 Ghostfolio 云产品。 + + apps/client/src/app/pages/pricing/pricing-page.html + 149 + + + apps/client/src/app/pages/pricing/pricing-page.html + 240 + + + + For ambitious investors who need the full picture of their financial assets. + 适合需要全面了解其金融资产的雄心勃勃的投资者。 + + apps/client/src/app/pages/pricing/pricing-page.html + 180 + + + + Email and Chat Support + 电子邮件和聊天支持 + + apps/client/src/app/pages/pricing/pricing-page.html + 236 + + + + Renew Plan + 更新计划 + + apps/client/src/app/components/header/header.component.html + 185 + + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 28 + + + apps/client/src/app/pages/pricing/pricing-page.html + 276 + + + + One-time payment, no auto-renewal. + 一次性付款,无自动续订。 + + apps/client/src/app/pages/pricing/pricing-page.html + 280 + + + + Get Started + 开始使用 + + apps/client/src/app/pages/pricing/pricing-page.html + 291 + + + + It’s free. + 免费。 + + apps/client/src/app/pages/pricing/pricing-page.html + 294 + + + + Hello, has shared a Portfolio with you! + 你好,分享了一个文件夹与你! + + apps/client/src/app/pages/public/public-page.html + 4 + + + + Currencies + 货币 + + apps/client/src/app/pages/public/public-page.html + 30 + + + + Continents + 大陆 + + apps/client/src/app/pages/public/public-page.html + 60 + + + + Ghostfolio empowers you to keep track of your wealth. + Ghostfolio 使您能够跟踪您的财富。 + + apps/client/src/app/pages/public/public-page.html + 148 + + + + Registration + 注册 + + apps/client/src/app/pages/register/register-page-routing.module.ts + 13 + + + + Continue with Internet Identity + 继续互联网身份 + + apps/client/src/app/pages/register/register-page.html + 41 + + + + Continue with Google + 继续使用谷歌 + + apps/client/src/app/pages/register/register-page.html + 51 + + + + Copy to clipboard + 复制到剪贴板 + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 26 + + + + I agree to have stored my Security Token from above in a secure place. If I lose it, I cannot get my account back. + 我同意存储我的保安编码器从上面看,在一个安全的地方。如果我丢失了它,我将无法找回我的帐户。 + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 32 + + + + Agree and continue + 同意并继续 + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 45 + + + + Personal Finance Tools + 个人理财工具 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 14 + + + + open-source-alternative-to + 开源替代方案 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 23 + + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts + 13 + + + + Open Source Alternative to + 开源替代方案 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 26 + + + + Discover Open Source Alternatives for Personal Finance Tools + 发现个人理财工具的开源替代品 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 4 + + + + This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. + 此概述页面包含与开源替代方案相比的精选个人理财工具集合Ghostfolio。如果您重视透明度、数据隐私和社区协作,Ghostfolio 提供了一个绝佳的机会来控制您的财务管理。 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 8 + + + + Explore the links below to compare a variety of personal finance tools with Ghostfolio. + 浏览下面的链接,将各种个人理财工具与 Ghostfolio 进行比较。 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 16 + + + + Open Source Alternative to + 开源替代方案 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 38 + + + + The Open Source Alternative to + 开源替代方案 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + + Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. + 您是否正在寻找开源替代方案幽灵作品集是一个强大的投资组合管理工具,为个人提供一个全面的平台来跟踪、分析和优化他们的投资。无论您是经验丰富的投资者还是刚刚起步的投资者,Ghostfolio 都提供直观的用户界面和广泛的功能帮助您做出明智的决定并掌控您的财务未来。 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 13 + + + + Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. + Ghostfolio 是一款开源软件 (OSS),提供了一种经济高效的替代方案使其特别适合预算紧张的个人,例如追求财务独立,提前退休(FIRE) 。通过利用开发者社区和个人理财爱好者的集体努力,Ghostfolio 不断增强其功能、安全性和用户体验。 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 27 + + + + Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. + 让我们更深入地了解 Ghostfolio 与下面的比较表可帮助您全面了解 Ghostfolio 相对于其他产品的定位。我们将探讨功能、数据隐私、定价等各个方面,让您根据个人需求做出明智的选择。 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 38 + + + + Ghostfolio vs comparison table + Ghostfolio vs比较表 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 49 + + + + Founded + 成立 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 72 + + + + Origin + 来源 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 77 + + + + Region + 地区 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 82 + + + + Available in + 可用于 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 87 + + + + ✅ Yes + ✅ 是的 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 109 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 116 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 130 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 141 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 155 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 162 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 174 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 181 + + + + ❌ No + ❌ 没有 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 111 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 134 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 145 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 176 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 183 + + + + ❌ No + ❌ 没有 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 118 + + + + Self-Hosting + 自托管 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 123 + + + + Use anonymously + 匿名使用 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 150 + + + + Free Plan + 免费计划 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 169 + + + + Starting from + 从...开始 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 195 + + + + year + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 191 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 197 + + + + Notes + 笔记 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 202 + + + + Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. + 请注意,Ghostfolio 与 Ghostfolio 中提供的信息比较表基于我们的独立研究和分析。该网站不隶属于或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们维护准确的数据GitHub + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 210 + + + + Ready to take your investments to the next level? + 准备好带走你的投资下一级 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 223 + + + + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. + 使用 Ghostfolio 轻松跟踪、分析和可视化您的财富。 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 227 + + + + Get Started + 开始使用 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 232 + + + + Personal Finance Tools + 个人理财工具 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 308 + + + + Switzerland + 瑞士 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 72 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 102 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 530 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 580 + + + + Global + 全球的 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 73 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 341 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 462 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 581 + + + + United States + 美国 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 93 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 149 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 159 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 201 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 210 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 220 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 232 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 242 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 294 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 316 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 327 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 352 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 354 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 364 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 429 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 439 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 449 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 518 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 541 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 569 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 591 + + + + France + 法国 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 121 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 482 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 498 + + + + Poland + 波兰 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 131 + + + + Germany + 德国 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 140 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 190 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 274 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 284 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 305 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 339 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 385 + + + + Belgium + 比利时 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 179 + + + + South Africa + 南非 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 251 + + + + Austria + 奥地利 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 262 + + + + Italy + 意大利 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 396 + + + + Netherlands + 荷兰 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 406 + + + + Thailand + 泰国 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 418 + + + + New Zealand + 新西兰 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 460 + + + + Czech Republic + 捷克共和国 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 471 + + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 508 + + + + Finland + 芬兰 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 490 + + + + Canada + 加拿大 + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 561 + + + + Resources + 资源 + + apps/client/src/app/pages/resources/resources-page-routing.module.ts + 13 + + + + Guides + 指南 + + apps/client/src/app/pages/resources/resources-page.html + 22 + + + + Glossary + 词汇表 + + apps/client/src/app/pages/resources/resources-page.html + 92 + + + + Membership + 会员资格 + + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 23 + + + apps/client/src/app/pages/user-account/user-account-page.component.ts + 40 + + + + Access + 使用权 + + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 28 + + + apps/client/src/app/pages/user-account/user-account-page.component.ts + 46 + + + + My Ghostfolio + 我的 Ghostfolio + + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 33 + + + + Oops, authentication has failed. + 糟糕,身份验证失败。 + + apps/client/src/app/pages/webauthn/webauthn-page.html + 19 + + + + Try again + 再试一次 + + apps/client/src/app/pages/webauthn/webauthn-page.html + 27 + + + + Go back to Home Page + 返回首页 + + apps/client/src/app/pages/webauthn/webauthn-page.html + 31 + + + + Do you really want to delete this account balance? + 您确实要删除该帐户余额吗? + + libs/ui/src/lib/account-balances/account-balances.component.ts + 58 + + + + Import Activities + 进口活动 + + libs/ui/src/lib/activities-table/activities-table.component.html + 9 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 369 + + + + Import Dividends + 导入股息 + + libs/ui/src/lib/activities-table/activities-table.component.html + 29 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 381 + + + + Export Activities + 出口活动 + + libs/ui/src/lib/activities-table/activities-table.component.html + 41 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 394 + + + + Export Drafts as ICS + 将汇票导出为 ICS + + libs/ui/src/lib/activities-table/activities-table.component.html + 54 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 407 + + + + Delete all Activities + 删除所有活动 + + libs/ui/src/lib/activities-table/activities-table.component.html + 65 + + + + Draft + 草稿 + + libs/ui/src/lib/activities-table/activities-table.component.html + 143 + + + + Clone + 克隆 + + libs/ui/src/lib/activities-table/activities-table.component.html + 434 + + + + Export Draft as ICS + 将汇票导出为 ICS + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + + + Do you really want to delete this activity? + 您确实要删除此活动吗? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 175 + + + + Find holding... + 查找持有... + + libs/ui/src/lib/assistant/assistant.component.ts + 111 + + + + No entries... + 没有条目... + + libs/ui/src/lib/assistant/assistant.html + 63 + + + libs/ui/src/lib/assistant/assistant.html + 84 + + + + Asset Profiles + 资产概况 + + libs/ui/src/lib/assistant/assistant.html + 67 + + + + Index + 指数 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + + + + 50-Day Trend + 50 天趋势 + + libs/ui/src/lib/benchmark/benchmark.component.html + 15 + + + + 200-Day Trend + 200天趋势 + + libs/ui/src/lib/benchmark/benchmark.component.html + 40 + + + + Last All Time High + 上次历史最高纪录 + + libs/ui/src/lib/benchmark/benchmark.component.html + 65 + + + + Change from All Time High + 从历史最高点开始变化 + + libs/ui/src/lib/benchmark/benchmark.component.html + 81 + + + + from ATH + 来自 ATH + + libs/ui/src/lib/benchmark/benchmark.component.html + 83 + + + + Market data provided by + 市场数据提供者 + + libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html + 2 + + + + Savings Rate per Month + 每月储蓄率 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 10 + + + + Annual Interest Rate + 年利率 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 21 + + + + Retirement Date + 退休日期 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 32 + + + + Projected Total Amount + 预计总额 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 60 + + + + Interest + 利息 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 342 + + + libs/ui/src/lib/i18n.ts + 33 + + + + Savings + 储蓄 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 352 + + + + Allocation + 分配 + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 98 + + + + Show all + 显示所有 + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 174 + + + + Account + 帐户 + + libs/ui/src/lib/i18n.ts + 4 + + + + Asia-Pacific + 亚太 + + libs/ui/src/lib/i18n.ts + 5 + + + + Asset Class + 资产类别 + + libs/ui/src/lib/i18n.ts + 6 + + + + Asset Sub Class + 资产子类别 + + libs/ui/src/lib/i18n.ts + 7 + + + + Core + 核心 + + libs/ui/src/lib/i18n.ts + 8 + + + + Switch to Ghostfolio Premium or Ghostfolio Open Source easily + 轻松切换到 Ghostfolio Premium 或 Ghostfolio Open Source + + libs/ui/src/lib/i18n.ts + 9 + + + + Switch to Ghostfolio Premium easily + 轻松切换到 Ghostfolio Premium + + libs/ui/src/lib/i18n.ts + 10 + + + + Switch to Ghostfolio Open Source or Ghostfolio Basic easily + 轻松切换到 Ghostfolio Open Source 或 Ghostfolio Basic + + libs/ui/src/lib/i18n.ts + 11 + + + + Emergency Fund + 应急基金 + + libs/ui/src/lib/i18n.ts + 12 + + + + Grant + 授予 + + libs/ui/src/lib/i18n.ts + 13 + + + + Higher Risk + 风险较高 + + libs/ui/src/lib/i18n.ts + 14 + + + + This activity already exists. + 这项活动已经存在。 + + libs/ui/src/lib/i18n.ts + 15 + + + + Japan + 日本 + + libs/ui/src/lib/i18n.ts + 16 + + + + Lower Risk + 降低风险 + + libs/ui/src/lib/i18n.ts + 17 + + + + Month + + + libs/ui/src/lib/i18n.ts + 18 + + + + Months + 几个月 + + libs/ui/src/lib/i18n.ts + 19 + + + + Other + 其他 + + libs/ui/src/lib/i18n.ts + 20 + + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 385 + + + + Preset + 预设 + + libs/ui/src/lib/i18n.ts + 21 + + + + Retirement Provision + 退休金 + + libs/ui/src/lib/i18n.ts + 22 + + + + Satellite + 卫星 + + libs/ui/src/lib/i18n.ts + 23 + + + + Symbol + 符号 + + libs/ui/src/lib/i18n.ts + 24 + + + + Tag + 标签 + + libs/ui/src/lib/i18n.ts + 25 + + + + Year + + + libs/ui/src/lib/i18n.ts + 26 + + + + Years + + + libs/ui/src/lib/i18n.ts + 27 + + + + Buy + + + libs/ui/src/lib/i18n.ts + 30 + + + + Fee + 费用 + + libs/ui/src/lib/i18n.ts + 32 + + + + Valuable + 有价值的 + + libs/ui/src/lib/i18n.ts + 34 + + + + Liability + 责任 + + libs/ui/src/lib/i18n.ts + 35 + + + + Sell + + + libs/ui/src/lib/i18n.ts + 36 + + + + Cash + 现金 + + libs/ui/src/lib/i18n.ts + 39 + + + + Commodity + 商品 + + libs/ui/src/lib/i18n.ts + 40 + + + + Equity + 公平 + + libs/ui/src/lib/i18n.ts + 41 + + + + Fixed Income + 固定收入 + + libs/ui/src/lib/i18n.ts + 42 + + + + Real Estate + 房地产 + + libs/ui/src/lib/i18n.ts + 43 + + + + Bond + 纽带 + + libs/ui/src/lib/i18n.ts + 46 + + + + Cryptocurrency + 加密货币 + + libs/ui/src/lib/i18n.ts + 47 + + + + ETF + 交易所交易基金 + + libs/ui/src/lib/i18n.ts + 48 + + + + Mutual Fund + 共同基金 + + libs/ui/src/lib/i18n.ts + 49 + + + + Precious Metal + 贵金属 + + libs/ui/src/lib/i18n.ts + 50 + + + + Private Equity + 私人产权 + + libs/ui/src/lib/i18n.ts + 51 + + + + Stock + 库存 + + libs/ui/src/lib/i18n.ts + 52 + + + + Africa + 非洲 + + libs/ui/src/lib/i18n.ts + 59 + + + + Asia + 亚洲 + + libs/ui/src/lib/i18n.ts + 60 + + + + Europe + 欧洲 + + libs/ui/src/lib/i18n.ts + 61 + + + + North America + 北美 + + libs/ui/src/lib/i18n.ts + 62 + + + + Oceania + 大洋洲 + + libs/ui/src/lib/i18n.ts + 63 + + + + South America + 南美洲 + + libs/ui/src/lib/i18n.ts + 64 + + + + Extreme Fear + 极度恐惧 + + libs/ui/src/lib/i18n.ts + 67 + + + + Extreme Greed + 极度贪婪 + + libs/ui/src/lib/i18n.ts + 68 + + + + Neutral + 中性的 + + libs/ui/src/lib/i18n.ts + 71 + + + + Membership + 会员资格 + + libs/ui/src/lib/membership-card/membership-card.component.html + 18 + + + + Valid until + 有效期至 + + libs/ui/src/lib/membership-card/membership-card.component.html + 23 + + + + Time to add your first activity. + 是时候添加您的第一个活动了。 + + libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html + 12 + + + + No data available + 无可用数据 + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 387 + + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 400 + + + + If a translation is missing, kindly support us in extending it here. + 如果翻译缺失,请支持我们进行扩展这里 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 55 + + + + Date Range + 日期范围 + + libs/ui/src/lib/assistant/assistant.html + 93 + + + + The current market price is + 当前市场价格为 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 327 + + + + Test + 测试 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 305 + + + + Oops! Could not grant access. + 哎呀!无法授予访问权限。 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts + 80 + + + + Restricted view + 视野受限 + + apps/client/src/app/components/access-table/access-table.component.html + 25 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 36 + + + + Permission + 允许 + + apps/client/src/app/components/access-table/access-table.component.html + 17 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 33 + + + + Private + 私人的 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 24 + + + + Job Queue + 作业队列 + + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 25 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 42 + + + + Market data is delayed for + 市场数据延迟 + + apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts + 82 + + + + Absolute Currency Performance + 绝对货币表现 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 73 + + + + Absolute Net Performance + 绝对净性能 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 121 + + + + Absolute Asset Performance + 绝对资产绩效 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 29 + + + + Investment + 投资 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 47 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 61 + + + + Asset Performance + 资产绩效 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 51 + + + + Net Performance + 净绩效 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 140 + + + + Currency Performance + 货币表现 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 98 + + + + Year to date + 今年迄今为止 + + libs/ui/src/lib/assistant/assistant.component.ts + 198 + + + + Week to date + 本周至今 + + libs/ui/src/lib/assistant/assistant.component.ts + 190 + + + + Month to date + 本月至今 + + libs/ui/src/lib/assistant/assistant.component.ts + 194 + + + + MTD + 最大输运量 + + libs/ui/src/lib/assistant/assistant.component.ts + 194 + + + + WTD + 世界贸易组织 + + libs/ui/src/lib/assistant/assistant.component.ts + 190 + + + + Oops! A data provider is experiencing the hiccups. + 哎呀!数据提供商遇到了问题。 + + apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html + 8 + + + + View + 看法 + + apps/client/src/app/components/access-table/access-table.component.html + 22 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 38 + + + + Reset Filters + 重置过滤器 + + libs/ui/src/lib/assistant/assistant.html + 155 + + + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. + 如果你今天退休,你可以领取每年或者每月,根据您的总资产提款率为4%。 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 68 + + + + year + + + libs/ui/src/lib/assistant/assistant.component.ts + 202 + + + + years + + + libs/ui/src/lib/assistant/assistant.component.ts + 206 + + + + Apply Filters + 应用过滤器 + + libs/ui/src/lib/assistant/assistant.html + 165 + + + + Asset Classes + 资产类别 + + libs/ui/src/lib/assistant/assistant.html + 138 + + + + self-hosting + 自托管 + + apps/client/src/app/pages/faq/faq-page.component.ts + 48 + + + + FAQ + 常见问题 + + apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts + 13 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts + 13 + + + + Self-Hosting + 自托管 + + apps/client/src/app/pages/faq/faq-page.component.ts + 47 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts + 13 + + + + Data Gathering + 数据收集 + + apps/client/src/app/components/admin-overview/admin-overview.html + 134 + + + + General + 一般的 + + apps/client/src/app/pages/faq/faq-page.component.ts + 36 + + + + Cloud + + + apps/client/src/app/pages/faq/faq-page.component.ts + 41 + + + apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts + 13 + + + + Oops! It looks like you’re making too many requests. Please slow down a bit. + 哎呀!看来您提出了太多要求。请慢一点。 + + apps/client/src/app/core/http-response.interceptor.ts + 105 + + + + My Account + 我的账户 + + apps/client/src/app/pages/i18n/i18n-page.html + 13 + + + + Closed + 关闭 + + apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts + 31 + + + + Active + 积极的 + + apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts + 30 + + + + Activity + 活动 + + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 176 + + + + + diff --git a/apps/client/src/styles/ghostfolio-style.scss b/apps/client/src/styles/ghostfolio-style.scss deleted file mode 100644 index 103f4cf14..000000000 --- a/apps/client/src/styles/ghostfolio-style.scss +++ /dev/null @@ -1,4 +0,0 @@ -$mat-css-dark-theme-selector: '.is-dark-theme'; - -$alpha-disabled-text: 0.38; -$alpha-hover: 0.04; diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index 8114402d5..cc9b164e6 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -3,6 +3,8 @@ $dark-primary-text: rgba(black, 0.87); $light-primary-text: white; +$mat-css-dark-theme-selector: '.is-dark-theme'; + $gf-primary: ( 50: var(--gf-theme-primary-50), 100: var(--gf-theme-primary-100), @@ -106,6 +108,7 @@ $gf-theme-dark: mat.define-dark-theme( } :root { + --gf-theme-alpha-hover: 0.04; --gf-theme-primary-500: #36cfcc; --gf-theme-primary-500-rgb: 0, 187, 255; --gf-theme-secondary-500: #3686cf; diff --git a/docker/docker-compose.build.yml b/docker/docker-compose.build.yml index 2ac90b7c1..7ad52be7d 100644 --- a/docker/docker-compose.build.yml +++ b/docker/docker-compose.build.yml @@ -2,6 +2,7 @@ version: '3.9' services: ghostfolio: build: ../ + init: true env_file: - ../.env environment: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 007a46883..d2dbb8112 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,6 +2,7 @@ version: '3.9' services: ghostfolio: image: ghostfolio/ghostfolio:latest + init: true env_file: - ../.env environment: diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 3bbe0ff8c..293f77488 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -137,7 +137,8 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'nl', 'pl', 'pt', - 'tr' + 'tr', + 'zh' ]; export const UNKNOWN_KEY = 'UNKNOWN'; diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index b49589aab..e03ea1a1f 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -11,7 +11,7 @@ import { parseISO, subDays } from 'date-fns'; -import { de, es, fr, it, nl, pl, pt, tr } from 'date-fns/locale'; +import { de, es, fr, it, nl, pl, pt, tr, zhCN } from 'date-fns/locale'; import { ghostfolioScraperApiSymbolPrefix, locale } from './config'; import { Benchmark, UniqueAsset } from './interfaces'; @@ -178,6 +178,8 @@ export function getDateFnsLocale(aLanguageCode: string) { return pt; } else if (aLanguageCode === 'tr') { return tr; + } else if (aLanguageCode === 'zh') { + return zhCN; } return undefined; diff --git a/libs/ui/src/lib/account-balances/account-balances.component.scss b/libs/ui/src/lib/account-balances/account-balances.component.scss index b5b58f67e..5d4e87f30 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.scss +++ b/libs/ui/src/lib/account-balances/account-balances.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; } diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.scss b/libs/ui/src/lib/activities-filter/activities-filter.component.scss index 7d0649bfc..07964fdfa 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.scss +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.scss b/libs/ui/src/lib/activities-table/activities-table.component.scss index 003303f95..bb5e11691 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.scss +++ b/libs/ui/src/lib/activities-table/activities-table.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index bd8355125..310bede05 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -219,6 +219,7 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { return { label: format(date, 'yyyy'), value: format(date, 'yyyy') }; }) .slice(0, -1) + .reverse() ); } diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.scss b/libs/ui/src/lib/holdings-table/holdings-table.component.scss index a33b78aff..8e321bcf1 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.scss +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.scss @@ -1,5 +1,3 @@ -@import 'apps/client/src/styles/ghostfolio-style'; - :host { display: block; diff --git a/package.json b/package.json index aa9bf0fd0..5db51af5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.69.0", + "version": "2.70.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -13,6 +13,7 @@ "affected:libs": "nx affected:libs", "affected:lint": "nx affected:lint", "affected:test": "nx affected:test", + "analyze:client": "nx run client:build:production --stats-json && webpack-bundle-analyzer -p 1234 dist/apps/client/en/stats.json", "angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng", "build:production": "nx run api:copy-assets && nx run api:build:production && nx run client:copy-assets && nx run client:build:production && yarn replace-placeholders-in-build", "build:storybook": "nx run ui:build-storybook", @@ -197,7 +198,8 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "tslib": "2.6.0", - "typescript": "5.3.3" + "typescript": "5.3.3", + "webpack-bundle-analyzer": "4.10.1" }, "engines": { "node": ">=18" diff --git a/yarn.lock b/yarn.lock index 03e4cca81..ee83c3606 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5352,6 +5352,11 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + "@prisma/client@5.11.0": version "5.11.0" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.11.0.tgz#d8e55fab85163415b2245fb408b9106f83c8106d" @@ -8039,11 +8044,21 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.0.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn@^8.0.4: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^8.1.0, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -10474,6 +10489,11 @@ dayjs@^1.11.7: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -10849,7 +10869,7 @@ dotenv@^16.0.0, dotenv@~16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -12455,6 +12475,13 @@ gunzip-maybe@^1.4.2: pumpify "^1.3.3" through2 "^2.0.3" +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -12596,7 +12623,7 @@ html-entities@^2.1.0, html-entities@^2.3.2: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -13207,6 +13234,11 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -15122,7 +15154,7 @@ mri@^1.1.0, mri@^1.2.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@2.0.0: +mrmime@2.0.0, mrmime@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== @@ -15693,7 +15725,7 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" -opener@^1.5.1: +opener@^1.5.1, opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== @@ -17649,6 +17681,15 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -18377,6 +18418,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tough-cookie-file-store@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tough-cookie-file-store/-/tough-cookie-file-store-2.0.3.tgz#788f7a6fe5cd8f61a1afb71b2f0b964ebf914b80" @@ -19080,6 +19126,25 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +webpack-bundle-analyzer@4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + is-plain-object "^5.0.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + webpack-dev-middleware@6.1.1, webpack-dev-middleware@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz#6bbc257ec83ae15522de7a62f995630efde7cc3d" @@ -19409,6 +19474,11 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@^8.11.0, ws@^8.13.0, ws@^8.2.3: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f"