Browse Source

Merge pull request #25 from dandevaud/main

Main
pull/5027/head
dandevaud 2 years ago
committed by GitHub
parent
commit
bd3a1dab4a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      CHANGELOG.md
  2. 6
      README.md
  3. 17
      apps/api/src/app/admin/admin.service.ts
  4. 2
      apps/api/src/app/auth/auth.service.ts
  5. 2
      apps/api/src/app/import/import.service.ts
  6. 5
      apps/api/src/app/info/info.module.ts
  7. 30
      apps/api/src/app/info/info.service.ts
  8. 1
      apps/api/src/app/portfolio/current-rate.service.spec.ts
  9. 2
      apps/api/src/app/portfolio/portfolio-calculator.ts
  10. 14
      apps/api/src/app/portfolio/portfolio.controller.ts
  11. 13
      apps/api/src/app/portfolio/portfolio.service.ts
  12. 12
      apps/api/src/app/user/user.service.ts
  13. 116
      apps/api/src/assets/sitemap.xml
  14. 10
      apps/api/src/main.ts
  15. 4
      apps/api/src/middlewares/html-template.middleware.ts
  16. 6
      apps/api/src/services/configuration/configuration.service.ts
  17. 4
      apps/api/src/services/data-gathering/data-gathering.service.ts
  18. 21
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  19. 4
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts
  20. 38
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  21. 47
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  22. 5
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  23. 49
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
  24. 34
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts
  25. 1
      apps/api/src/services/interfaces/environment.interface.ts
  26. 17
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts
  27. 286
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html
  28. 9
      apps/client/src/app/pages/blog/blog-page-routing.module.ts
  29. 26
      apps/client/src/app/pages/blog/blog-page.html
  30. 10
      apps/client/src/app/pages/landing/landing-page.html
  31. 4
      apps/client/src/app/pages/open/open-page.html
  32. 2
      apps/client/src/app/pages/pricing/pricing-page.html
  33. 4
      apps/client/src/app/pages/register/register-page.component.ts
  34. 1
      apps/client/src/app/pages/register/register-page.html
  35. BIN
      apps/client/src/assets/images/blog/ghostfolio-2.jpg
  36. 198
      apps/client/src/locales/messages.de.xlf
  37. 198
      apps/client/src/locales/messages.es.xlf
  38. 198
      apps/client/src/locales/messages.fr.xlf
  39. 198
      apps/client/src/locales/messages.it.xlf
  40. 796
      apps/client/src/locales/messages.nl.xlf
  41. 198
      apps/client/src/locales/messages.pt.xlf
  42. 8708
      apps/client/src/locales/messages.xlf
  43. 8
      docker/docker-compose.build.yml
  44. 5
      docker/docker-compose.dev.yml
  45. 8
      docker/docker-compose.yml
  46. 4
      package.json
  47. 8
      yarn.lock

22
CHANGELOG.md

@ -7,13 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Changed
- Harmonized the logger output: <symbol> (<dataSource>)
- Improved the language localization for Dutch (`nl`)
### Fixed
- Fixed an issue with the portfolio summary caused by the language localization for Dutch (`nl`)
## 2.0.0 - 2023-09-09
### Added
- Added support for the cryptocurrency _CyberConnect_
- Added a blog post: _Announcing Ghostfolio 2.0_
### Changed
- **Breaking Change**: Removed the deprecated environment variable `BASE_CURRENCY`
- Improved the validation in the activities import
- Deactivated _Internet Identity_ as a social login provider for the account registration
- Improved the language localization for German (`de`)
- Refreshed the cryptocurrencies list
- Changed the version in the `docker-compose` files from `3.7` to `3.9`
- Upgraded `yahoo-finance2` from version `2.4.4` to `2.5.0`
### Fixed
- Fixed an issue in the _Yahoo Finance_ data enhancer where countries and sectors have been removed
## 1.305.0 - 2023-09-03

6
README.md

@ -13,6 +13,8 @@
[![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing)
[![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
New: [Ghostfolio 2.0](https://ghostfol.io/en/blog/2023/09/ghostfolio-2)
</div>
**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation.
@ -136,9 +138,9 @@ docker-compose --env-file ./.env -f docker/docker-compose.build.yml up -d
1. Run the following command to start the new Docker image: `docker-compose --env-file ./.env -f docker/docker-compose.yml up -d`
At each start, the container will automatically apply the database schema migrations if needed.
### Run with _Unraid_ (Community)
### Home Server Systems (Community)
Please follow the instructions of the Ghostfolio [Unraid Community App](https://unraid.net/community/apps?q=ghostfolio).
Ghostfolio is available for various home server systems, including [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio).
## Development

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

@ -6,7 +6,10 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config';
import {
DEFAULT_CURRENCY,
PROPERTY_CURRENCIES
} from '@ghostfolio/common/config';
import {
AdminData,
AdminMarketData,
@ -23,8 +26,6 @@ import { groupBy } from 'lodash';
@Injectable()
export class AdminService {
private baseCurrency: string;
public constructor(
private readonly configurationService: ConfigurationService,
private readonly dataProviderService: DataProviderService,
@ -34,9 +35,7 @@ export class AdminService {
private readonly propertyService: PropertyService,
private readonly subscriptionService: SubscriptionService,
private readonly symbolProfileService: SymbolProfileService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
) {}
public async addAssetProfile({
dataSource,
@ -80,15 +79,15 @@ export class AdminService {
exchangeRates: this.exchangeRateDataService
.getCurrencies()
.filter((currency) => {
return currency !== this.baseCurrency;
return currency !== DEFAULT_CURRENCY;
})
.map((currency) => {
return {
label1: this.baseCurrency,
label1: DEFAULT_CURRENCY,
label2: currency,
value: this.exchangeRateDataService.toCurrency(
1,
this.baseCurrency,
DEFAULT_CURRENCY,
currency
)
};

2
apps/api/src/app/auth/auth.service.ts

@ -55,7 +55,7 @@ export class AuthService {
const isUserSignupEnabled =
await this.propertyService.isUserSignupEnabled();
if (!isUserSignupEnabled) {
if (!isUserSignupEnabled || true) {
throw new Error('Sign up forbidden');
}

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

@ -566,7 +566,7 @@ export class ImportService {
])
)?.[symbol];
if (!assetProfile) {
if (!assetProfile?.name) {
throw new Error(
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")`
);

5
apps/api/src/app/info/info.module.ts

@ -1,6 +1,7 @@
import { BenchmarkModule } from '@ghostfolio/api/app/benchmark/benchmark.module';
import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module';
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { UserModule } from '@ghostfolio/api/app/user/user.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
@ -28,11 +29,11 @@ import { InfoService } from './info.service';
signOptions: { expiresIn: '30 days' }
}),
PlatformModule,
PrismaModule,
PropertyModule,
RedisCacheModule,
SymbolProfileModule,
TagModule
TagModule,
UserModule
],
providers: [InfoService]
})

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

@ -1,12 +1,13 @@
import { BenchmarkService } from '@ghostfolio/api/app/benchmark/benchmark.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { UserService } from '@ghostfolio/api/app/user/user.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import {
DEFAULT_CURRENCY,
PROPERTY_BETTER_UPTIME_MONITOR_ID,
PROPERTY_COUNTRIES_OF_SUBSCRIBERS,
PROPERTY_DEMO_USER_ID,
@ -44,10 +45,10 @@ export class InfoService {
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly jwtService: JwtService,
private readonly platformService: PlatformService,
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService,
private readonly redisCacheService: RedisCacheService,
private readonly tagService: TagService
private readonly tagService: TagService,
private readonly userService: UserService
) {}
public async get(): Promise<InfoItem> {
@ -139,18 +140,13 @@ export class InfoService {
subscriptions,
systemMessage,
tags,
baseCurrency: this.configurationService.get('BASE_CURRENCY'),
baseCurrency: DEFAULT_CURRENCY,
currencies: this.exchangeRateDataService.getCurrencies()
};
}
private async countActiveUsers(aDays: number) {
return await this.prismaService.user.count({
orderBy: {
Analytics: {
updatedAt: 'desc'
}
},
return this.userService.count({
where: {
AND: [
{
@ -223,10 +219,7 @@ export class InfoService {
}
private async countNewUsers(aDays: number) {
return await this.prismaService.user.count({
orderBy: {
createdAt: 'desc'
},
return this.userService.count({
where: {
AND: [
{
@ -317,11 +310,10 @@ export class InfoService {
return undefined;
}
const stripeConfig = (await this.prismaService.property.findUnique({
where: { key: PROPERTY_STRIPE_CONFIG }
})) ?? { value: '{}' };
return JSON.parse(stripeConfig.value);
return (
((await this.propertyService.getByKey(PROPERTY_STRIPE_CONFIG)) as any) ??
{}
);
}
private async getUptime(): Promise<number> {

1
apps/api/src/app/portfolio/current-rate.service.spec.ts

@ -105,7 +105,6 @@ describe('CurrentRateService', () => {
null,
null,
null,
null,
null
);
marketDataService = new MarketDataService(null);

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

@ -768,7 +768,7 @@ export class PortfolioCalculator {
);
} else if (!currentPosition.quantity.eq(0)) {
Logger.warn(
`Missing historical market data for symbol ${currentPosition.symbol}`,
`Missing historical market data for ${currentPosition.symbol} (${currentPosition.dataSource})`,
'PortfolioCalculator'
);
hasErrors = true;

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

@ -10,7 +10,10 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interc
import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config';
import {
DEFAULT_CURRENCY,
HEADER_KEY_IMPERSONATION
} from '@ghostfolio/common/config';
import {
PortfolioDetails,
PortfolioDividends,
@ -47,8 +50,6 @@ import { PortfolioService } from './portfolio.service';
@Controller('portfolio')
export class PortfolioController {
private baseCurrency: string;
public constructor(
private readonly accessService: AccessService,
private readonly apiService: ApiService,
@ -57,9 +58,7 @@ export class PortfolioController {
private readonly portfolioService: PortfolioService,
@Inject(REQUEST) private readonly request: RequestWithUser,
private readonly userService: UserService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
) {}
@Get('details')
@UseGuards(AuthGuard('jwt'))
@ -477,8 +476,7 @@ export class PortfolioController {
return this.exchangeRateDataService.toCurrency(
portfolioPosition.quantity * portfolioPosition.marketPrice,
portfolioPosition.currency,
this.request.user?.Settings?.settings.baseCurrency ??
this.baseCurrency
this.request.user?.Settings?.settings.baseCurrency ?? DEFAULT_CURRENCY
);
})
.reduce((a, b) => a + b, 0);

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

@ -11,12 +11,12 @@ import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/ac
import { CurrencyClusterRiskBaseCurrencyCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-current-investment';
import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/current-investment';
import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import {
DEFAULT_CURRENCY,
EMERGENCY_FUND_TAG_ID,
MAX_CHART_ITEMS,
UNKNOWN_KEY
@ -90,11 +90,8 @@ const europeMarkets = require('../../assets/countries/europe-markets.json');
@Injectable()
export class PortfolioService {
private baseCurrency: string;
public constructor(
private readonly accountService: AccountService,
private readonly configurationService: ConfigurationService,
private readonly currentRateService: CurrentRateService,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
@ -104,9 +101,7 @@ export class PortfolioService {
private readonly rulesService: RulesService,
private readonly symbolProfileService: SymbolProfileService,
private readonly userService: UserService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
) {}
public async getAccounts({
filters,
@ -1879,7 +1874,7 @@ export class PortfolioService {
portfolioOrders: PortfolioOrder[];
}> {
const userCurrency =
this.request.user?.Settings?.settings.baseCurrency ?? this.baseCurrency;
this.request.user?.Settings?.settings.baseCurrency ?? DEFAULT_CURRENCY;
const orders = await this.orderService.getOrders({
filters,
@ -2101,7 +2096,7 @@ export class PortfolioService {
return (
aUser.Settings?.settings.baseCurrency ??
this.request.user?.Settings?.settings.baseCurrency ??
this.baseCurrency
DEFAULT_CURRENCY
);
}

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

@ -25,16 +25,16 @@ const crypto = require('crypto');
@Injectable()
export class UserService {
private baseCurrency: string;
public constructor(
private readonly configurationService: ConfigurationService,
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService,
private readonly subscriptionService: SubscriptionService,
private readonly tagService: TagService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
) {}
public async count(args?: Prisma.UserCountArgs) {
return this.prismaService.user.count(args);
}
public async getUser(
@ -267,7 +267,7 @@ export class UserService {
...data,
Account: {
create: {
currency: this.baseCurrency,
currency: DEFAULT_CURRENCY,
isDefault: true,
name: 'Default Account'
}
@ -275,7 +275,7 @@ export class UserService {
Settings: {
create: {
settings: {
currency: this.baseCurrency
currency: DEFAULT_CURRENCY
}
}
}

116
apps/api/src/assets/sitemap.xml

@ -250,6 +250,10 @@
<loc>https://ghostfol.io/en/blog/2023/08/ghostfolio-joins-oss-friends</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/en/blog/2023/09/ghostfolio-2</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/en/faq</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -555,7 +559,111 @@
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/kenmerken</loc>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-copilot-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-delta</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-divvydiary</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-exirio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-folishare</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-getquin</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-gospatz</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-justetf</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-kubera</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-markets.sh</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-maybe-finance</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-monse</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-parqet</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-plannix</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-portfolio-dividend-tracker</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-portseido</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-sharesight</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-simple-portfolio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-snowball-analytics</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-sumio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-utluna</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-yeekatee</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/functionaliteiten</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
@ -597,7 +705,11 @@
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/nl/vaak-gestelde-vragen</loc>
<loc>https://ghostfol.io/nl/veelgestelde-vragen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/pt</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>

10
apps/api/src/main.ts

@ -55,7 +55,6 @@ async function bootstrap() {
app.use(HtmlTemplateMiddleware);
const BASE_CURRENCY = configService.get<string>('BASE_CURRENCY');
const HOST = configService.get<string>('HOST') || '0.0.0.0';
const PORT = configService.get<number>('PORT') || 3333;
@ -63,15 +62,6 @@ async function bootstrap() {
logLogo();
Logger.log(`Listening at http://${HOST}:${PORT}`);
Logger.log('');
if (BASE_CURRENCY) {
Logger.warn(
`The environment variable "BASE_CURRENCY" is deprecated and will be removed in Ghostfolio 2.0.`
);
Logger.warn(
'Please use the currency converter in the activity dialog instead.'
);
}
});
}

4
apps/api/src/middlewares/html-template.middleware.ts

@ -75,6 +75,10 @@ const locales = {
'/en/blog/2023/08/ghostfolio-joins-oss-friends': {
featureGraphicPath: 'assets/images/blog/ghostfolio-joins-oss-friends.png',
title: `Ghostfolio joins OSS Friends - ${titleShort}`
},
'/en/blog/2023/09/ghostfolio-2': {
featureGraphicPath: 'assets/images/blog/ghostfolio-2.jpg',
title: `Announcing Ghostfolio 2.0 - ${titleShort}`
}
};

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

@ -1,5 +1,5 @@
import { Environment } from '@ghostfolio/api/services/interfaces/environment.interface';
import { DEFAULT_CURRENCY, DEFAULT_ROOT_URL } from '@ghostfolio/common/config';
import { DEFAULT_ROOT_URL } from '@ghostfolio/common/config';
import { Injectable } from '@nestjs/common';
import { DataSource } from '@prisma/client';
import { bool, cleanEnv, host, json, num, port, str } from 'envalid';
@ -12,10 +12,6 @@ export class ConfigurationService {
this.environmentConfiguration = cleanEnv(process.env, {
ACCESS_TOKEN_SALT: str(),
ALPHA_VANTAGE_API_KEY: str({ default: '' }),
BASE_CURRENCY: str({
choices: ['AUD', 'CAD', 'CNY', 'EUR', 'GBP', 'JPY', 'RUB', 'USD'],
default: DEFAULT_CURRENCY
}),
BETTER_UPTIME_API_KEY: str({ default: '' }),
CACHE_QUOTES_TTL: num({ default: 1 }),
CACHE_TTL: num({ default: 1 }),

4
apps/api/src/services/data-gathering/data-gathering.service.ts

@ -145,7 +145,9 @@ export class DataGatheringService {
});
} catch (error) {
Logger.error(
`Failed to enhance data for symbol ${symbol} by ${dataEnhancer.getName()}`,
`Failed to enhance data for ${symbol} (${
assetProfile.dataSource
}) by ${dataEnhancer.getName()}`,
error,
'DataGatheringService'
);

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

@ -1,10 +1,10 @@
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
IDataProviderHistoricalResponse,
IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { DataProviderInfo } from '@ghostfolio/common/interfaces';
import { Granularity } from '@ghostfolio/common/types';
@ -20,14 +20,9 @@ import got from 'got';
@Injectable()
export class CoinGeckoService implements DataProviderInterface {
private baseCurrency: string;
private readonly URL = 'https://api.coingecko.com/api/v3';
public constructor(
private readonly configurationService: ConfigurationService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
public constructor() {}
public canHandle(symbol: string) {
return true;
@ -39,7 +34,7 @@ export class CoinGeckoService implements DataProviderInterface {
const response: Partial<SymbolProfile> = {
assetClass: AssetClass.CASH,
assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: this.baseCurrency,
currency: DEFAULT_CURRENCY,
dataSource: this.getName(),
symbol: aSymbol
};
@ -81,7 +76,7 @@ export class CoinGeckoService implements DataProviderInterface {
const { prices } = await got(
`${
this.URL
}/coins/${aSymbol}/market_chart/range?vs_currency=${this.baseCurrency.toLowerCase()}&from=${getUnixTime(
}/coins/${aSymbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime(
from
)}&to=${getUnixTime(to)}`
).json<any>();
@ -130,16 +125,16 @@ export class CoinGeckoService implements DataProviderInterface {
const response = await got(
`${this.URL}/simple/price?ids=${aSymbols.join(
','
)}&vs_currencies=${this.baseCurrency.toLowerCase()}`
)}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase()}`
).json<any>();
for (const symbol in response) {
if (Object.prototype.hasOwnProperty.call(response, symbol)) {
results[symbol] = {
currency: this.baseCurrency,
currency: DEFAULT_CURRENCY,
dataProviderInfo: this.getDataProviderInfo(),
dataSource: DataSource.COINGECKO,
marketPrice: response[symbol][this.baseCurrency.toLowerCase()],
marketPrice: response[symbol][DEFAULT_CURRENCY.toLowerCase()],
marketState: 'open'
};
}
@ -175,7 +170,7 @@ export class CoinGeckoService implements DataProviderInterface {
symbol,
assetClass: AssetClass.CASH,
assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: this.baseCurrency,
currency: DEFAULT_CURRENCY,
dataSource: this.getName()
};
});

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

@ -1,4 +1,3 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { YahooFinanceDataEnhancerService } from './yahoo-finance.service';
@ -26,16 +25,13 @@ jest.mock(
);
describe('YahooFinanceDataEnhancerService', () => {
let configurationService: ConfigurationService;
let cryptocurrencyService: CryptocurrencyService;
let yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService;
beforeAll(async () => {
configurationService = new ConfigurationService();
cryptocurrencyService = new CryptocurrencyService();
yahooFinanceDataEnhancerService = new YahooFinanceDataEnhancerService(
configurationService,
cryptocurrencyService
);
});

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

@ -1,13 +1,13 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import { UNKNOWN_KEY } from '@ghostfolio/common/config';
import { DEFAULT_CURRENCY, UNKNOWN_KEY } from '@ghostfolio/common/config';
import { isCurrency } from '@ghostfolio/common/helper';
import { Injectable, Logger } from '@nestjs/common';
import {
AssetClass,
AssetSubClass,
DataSource,
Prisma,
SymbolProfile
} from '@prisma/client';
import { countries } from 'countries-list';
@ -16,23 +16,18 @@ import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-ifa
@Injectable()
export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
private baseCurrency: string;
public constructor(
private readonly configurationService: ConfigurationService,
private readonly cryptocurrencyService: CryptocurrencyService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
) {}
public convertFromYahooFinanceSymbol(aYahooFinanceSymbol: string) {
let symbol = aYahooFinanceSymbol.replace(
new RegExp(`-${this.baseCurrency}$`),
this.baseCurrency
new RegExp(`-${DEFAULT_CURRENCY}$`),
DEFAULT_CURRENCY
);
if (symbol.includes('=X') && !symbol.includes(this.baseCurrency)) {
symbol = `${this.baseCurrency}${symbol}`;
if (symbol.includes('=X') && !symbol.includes(DEFAULT_CURRENCY)) {
symbol = `${DEFAULT_CURRENCY}${symbol}`;
}
return symbol.replace('=X', '');
@ -47,21 +42,18 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
*/
public convertToYahooFinanceSymbol(aSymbol: string) {
if (
aSymbol.includes(this.baseCurrency) &&
aSymbol.length > this.baseCurrency.length
aSymbol.includes(DEFAULT_CURRENCY) &&
aSymbol.length > DEFAULT_CURRENCY.length
) {
if (
isCurrency(
aSymbol.substring(0, aSymbol.length - this.baseCurrency.length)
aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length)
)
) {
return `${aSymbol}=X`;
} else if (
this.cryptocurrencyService.isCryptocurrency(
aSymbol.replace(
new RegExp(`-${this.baseCurrency}$`),
this.baseCurrency
)
aSymbol.replace(new RegExp(`-${DEFAULT_CURRENCY}$`), DEFAULT_CURRENCY)
)
) {
// Add a dash before the last three characters
@ -69,8 +61,8 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
// DOGEUSD -> DOGE-USD
// SOL1USD -> SOL1-USD
return aSymbol.replace(
new RegExp(`-?${this.baseCurrency}$`),
`-${this.baseCurrency}`
new RegExp(`-?${DEFAULT_CURRENCY}$`),
`-${DEFAULT_CURRENCY}`
);
}
}
@ -102,11 +94,11 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
const { countries, sectors, url } =
await this.getAssetProfile(yahooSymbol);
if (countries) {
if ((countries as unknown as Prisma.JsonArray)?.length > 0) {
response.countries = countries;
}
if (sectors) {
if ((sectors as unknown as Prisma.JsonArray)?.length > 0) {
response.sectors = sectors;
}

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

@ -5,7 +5,10 @@ import {
IDataProviderHistoricalResponse,
IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config';
import {
DEFAULT_CURRENCY,
DEFAULT_REQUEST_TIMEOUT
} from '@ghostfolio/common/config';
import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper';
import { Granularity } from '@ghostfolio/common/types';
import { Injectable, Logger } from '@nestjs/common';
@ -22,14 +25,12 @@ import got from 'got';
@Injectable()
export class EodHistoricalDataService implements DataProviderInterface {
private apiKey: string;
private baseCurrency: string;
private readonly URL = 'https://eodhistoricaldata.com/api';
public constructor(
private readonly configurationService: ConfigurationService
) {
this.apiKey = this.configurationService.get('EOD_HISTORICAL_DATA_API_KEY');
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
public canHandle(symbol: string) {
@ -175,7 +176,7 @@ export class EodHistoricalDataService implements DataProviderInterface {
})?.currency;
result[this.convertFromEodSymbol(code)] = {
currency: currency ?? this.baseCurrency,
currency: currency ?? DEFAULT_CURRENCY,
dataSource: DataSource.EOD_HISTORICAL_DATA,
marketPrice: close,
marketState: isToday(new Date(timestamp * 1000)) ? 'open' : 'closed'
@ -186,24 +187,24 @@ export class EodHistoricalDataService implements DataProviderInterface {
{}
);
if (response[`${this.baseCurrency}GBP`]) {
response[`${this.baseCurrency}GBp`] = {
...response[`${this.baseCurrency}GBP`],
currency: `${this.baseCurrency}GBp`,
if (response[`${DEFAULT_CURRENCY}GBP`]) {
response[`${DEFAULT_CURRENCY}GBp`] = {
...response[`${DEFAULT_CURRENCY}GBP`],
currency: `${DEFAULT_CURRENCY}GBp`,
marketPrice: this.getConvertedValue({
symbol: `${this.baseCurrency}GBp`,
value: response[`${this.baseCurrency}GBP`].marketPrice
symbol: `${DEFAULT_CURRENCY}GBp`,
value: response[`${DEFAULT_CURRENCY}GBP`].marketPrice
})
};
}
if (response[`${this.baseCurrency}ILS`]) {
response[`${this.baseCurrency}ILA`] = {
...response[`${this.baseCurrency}ILS`],
currency: `${this.baseCurrency}ILA`,
if (response[`${DEFAULT_CURRENCY}ILS`]) {
response[`${DEFAULT_CURRENCY}ILA`] = {
...response[`${DEFAULT_CURRENCY}ILS`],
currency: `${DEFAULT_CURRENCY}ILA`,
marketPrice: this.getConvertedValue({
symbol: `${this.baseCurrency}ILA`,
value: response[`${this.baseCurrency}ILS`].marketPrice
symbol: `${DEFAULT_CURRENCY}ILA`,
value: response[`${DEFAULT_CURRENCY}ILS`].marketPrice
})
};
}
@ -272,7 +273,7 @@ export class EodHistoricalDataService implements DataProviderInterface {
if (symbol.endsWith('.FOREX')) {
symbol = symbol.replace('GBX', 'GBp');
symbol = symbol.replace('.FOREX', '');
symbol = `${this.baseCurrency}${symbol}`;
symbol = `${DEFAULT_CURRENCY}${symbol}`;
}
return symbol;
@ -285,17 +286,17 @@ export class EodHistoricalDataService implements DataProviderInterface {
*/
private convertToEodSymbol(aSymbol: string) {
if (
aSymbol.startsWith(this.baseCurrency) &&
aSymbol.length > this.baseCurrency.length
aSymbol.startsWith(DEFAULT_CURRENCY) &&
aSymbol.length > DEFAULT_CURRENCY.length
) {
if (
isCurrency(
aSymbol.substring(0, aSymbol.length - this.baseCurrency.length)
aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length)
)
) {
return `${aSymbol
.replace('GBp', 'GBX')
.replace(this.baseCurrency, '')}.FOREX`;
.replace(DEFAULT_CURRENCY, '')}.FOREX`;
}
}
@ -309,10 +310,10 @@ export class EodHistoricalDataService implements DataProviderInterface {
symbol: string;
value: number;
}) {
if (symbol === `${this.baseCurrency}GBp`) {
if (symbol === `${DEFAULT_CURRENCY}GBp`) {
// Convert GPB to GBp (pence)
return new Big(value).mul(100).toNumber();
} else if (symbol === `${this.baseCurrency}ILA`) {
} else if (symbol === `${DEFAULT_CURRENCY}ILA`) {
// Convert ILS to ILA
return new Big(value).mul(100).toNumber();
}

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

@ -5,6 +5,7 @@ import {
IDataProviderHistoricalResponse,
IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper';
import { DataProviderInfo } from '@ghostfolio/common/interfaces';
import { Granularity } from '@ghostfolio/common/types';
@ -16,7 +17,6 @@ import got from 'got';
@Injectable()
export class FinancialModelingPrepService implements DataProviderInterface {
private apiKey: string;
private baseCurrency: string;
private readonly URL = 'https://financialmodelingprep.com/api/v3';
public constructor(
@ -25,7 +25,6 @@ export class FinancialModelingPrepService implements DataProviderInterface {
this.apiKey = this.configurationService.get(
'FINANCIAL_MODELING_PREP_API_KEY'
);
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
public canHandle(symbol: string) {
@ -117,7 +116,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
for (const { price, symbol } of response) {
results[symbol] = {
currency: this.baseCurrency,
currency: DEFAULT_CURRENCY,
dataProviderInfo: this.getDataProviderInfo(),
dataSource: DataSource.FINANCIAL_MODELING_PREP,
marketPrice: price,

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

@ -1,5 +1,4 @@
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
@ -7,6 +6,7 @@ import {
IDataProviderHistoricalResponse,
IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { Granularity } from '@ghostfolio/common/types';
import { Injectable, Logger } from '@nestjs/common';
@ -18,15 +18,10 @@ import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote';
@Injectable()
export class YahooFinanceService implements DataProviderInterface {
private baseCurrency: string;
public constructor(
private readonly configurationService: ConfigurationService,
private readonly cryptocurrencyService: CryptocurrencyService,
private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService
) {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
}
) {}
public canHandle(symbol: string) {
return true;
@ -212,50 +207,50 @@ export class YahooFinanceService implements DataProviderInterface {
};
if (
symbol === `${this.baseCurrency}GBP` &&
yahooFinanceSymbols.includes(`${this.baseCurrency}GBp=X`)
symbol === `${DEFAULT_CURRENCY}GBP` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}GBp=X`)
) {
// Convert GPB to GBp (pence)
response[`${this.baseCurrency}GBp`] = {
response[`${DEFAULT_CURRENCY}GBp`] = {
...response[symbol],
currency: 'GBp',
marketPrice: this.getConvertedValue({
symbol: `${this.baseCurrency}GBp`,
symbol: `${DEFAULT_CURRENCY}GBp`,
value: response[symbol].marketPrice
})
};
} else if (
symbol === `${this.baseCurrency}ILS` &&
yahooFinanceSymbols.includes(`${this.baseCurrency}ILA=X`)
symbol === `${DEFAULT_CURRENCY}ILS` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}ILA=X`)
) {
// Convert ILS to ILA
response[`${this.baseCurrency}ILA`] = {
response[`${DEFAULT_CURRENCY}ILA`] = {
...response[symbol],
currency: 'ILA',
marketPrice: this.getConvertedValue({
symbol: `${this.baseCurrency}ILA`,
symbol: `${DEFAULT_CURRENCY}ILA`,
value: response[symbol].marketPrice
})
};
} else if (
symbol === `${this.baseCurrency}ZAR` &&
yahooFinanceSymbols.includes(`${this.baseCurrency}ZAc=X`)
symbol === `${DEFAULT_CURRENCY}ZAR` &&
yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}ZAc=X`)
) {
// Convert ZAR to ZAc (cents)
response[`${this.baseCurrency}ZAc`] = {
response[`${DEFAULT_CURRENCY}ZAc`] = {
...response[symbol],
currency: 'ZAc',
marketPrice: this.getConvertedValue({
symbol: `${this.baseCurrency}ZAc`,
symbol: `${DEFAULT_CURRENCY}ZAc`,
value: response[symbol].marketPrice
})
};
}
}
if (yahooFinanceSymbols.includes(`${this.baseCurrency}USX=X`)) {
if (yahooFinanceSymbols.includes(`${DEFAULT_CURRENCY}USX=X`)) {
// Convert USD to USX (cent)
response[`${this.baseCurrency}USX`] = {
response[`${DEFAULT_CURRENCY}USX`] = {
currency: 'USX',
dataSource: this.getName(),
marketPrice: new Big(1).mul(100).toNumber(),
@ -303,8 +298,8 @@ export class YahooFinanceService implements DataProviderInterface {
(quoteType === 'CRYPTOCURRENCY' &&
this.cryptocurrencyService.isCryptocurrency(
symbol.replace(
new RegExp(`-${this.baseCurrency}$`),
this.baseCurrency
new RegExp(`-${DEFAULT_CURRENCY}$`),
DEFAULT_CURRENCY
)
)) ||
quoteTypes.includes(quoteType)
@ -314,7 +309,7 @@ export class YahooFinanceService implements DataProviderInterface {
if (quoteType === 'CRYPTOCURRENCY') {
// Only allow cryptocurrencies in base currency to avoid having redundancy in the database.
// Transactions need to be converted manually to the base currency before
return symbol.includes(this.baseCurrency);
return symbol.includes(DEFAULT_CURRENCY);
} else if (quoteType === 'FUTURE') {
// Allow GC=F, but not MGC=F
return symbol.length === 4;
@ -373,13 +368,13 @@ export class YahooFinanceService implements DataProviderInterface {
symbol: string;
value: number;
}) {
if (symbol === `${this.baseCurrency}GBp`) {
if (symbol === `${DEFAULT_CURRENCY}GBp`) {
// Convert GPB to GBp (pence)
return new Big(value).mul(100).toNumber();
} else if (symbol === `${this.baseCurrency}ILA`) {
} else if (symbol === `${DEFAULT_CURRENCY}ILA`) {
// Convert ILS to ILA
return new Big(value).mul(100).toNumber();
} else if (symbol === `${this.baseCurrency}ZAc`) {
} else if (symbol === `${DEFAULT_CURRENCY}ZAc`) {
// Convert ZAR to ZAc (cents)
return new Big(value).mul(100).toNumber();
}

34
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

@ -1,10 +1,12 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config';
import {
DEFAULT_CURRENCY,
PROPERTY_CURRENCIES
} from '@ghostfolio/common/config';
import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper';
import { Injectable, Logger } from '@nestjs/common';
import { format, isToday } from 'date-fns';
@ -12,13 +14,11 @@ import { isNumber, uniq } from 'lodash';
@Injectable()
export class ExchangeRateDataService {
private baseCurrency: string;
private currencies: string[] = [];
private currencyPairs: IDataGatheringItem[] = [];
private exchangeRates: { [currencyPair: string]: number } = {};
public constructor(
private readonly configurationService: ConfigurationService,
private readonly dataProviderService: DataProviderService,
private readonly marketDataService: MarketDataService,
private readonly prismaService: PrismaService,
@ -26,7 +26,7 @@ export class ExchangeRateDataService {
) {}
public getCurrencies() {
return this.currencies?.length > 0 ? this.currencies : [this.baseCurrency];
return this.currencies?.length > 0 ? this.currencies : [DEFAULT_CURRENCY];
}
public getCurrencyPairs() {
@ -43,7 +43,6 @@ export class ExchangeRateDataService {
}
public async initialize() {
this.baseCurrency = this.configurationService.get('BASE_CURRENCY');
this.currencies = await this.prepareCurrencies();
this.currencyPairs = [];
this.exchangeRates = {};
@ -113,9 +112,9 @@ export class ExchangeRateDataService {
if (!this.exchangeRates[symbol]) {
// Not found, calculate indirectly via base currency
this.exchangeRates[symbol] =
resultExtended[`${currency1}${this.baseCurrency}`]?.[date]
resultExtended[`${currency1}${DEFAULT_CURRENCY}`]?.[date]
?.marketPrice *
resultExtended[`${this.baseCurrency}${currency2}`]?.[date]
resultExtended[`${DEFAULT_CURRENCY}${currency2}`]?.[date]
?.marketPrice;
// Calculate the opposite direction
@ -144,9 +143,8 @@ export class ExchangeRateDataService {
} else {
// Calculate indirectly via base currency
const factor1 =
this.exchangeRates[`${aFromCurrency}${this.baseCurrency}`];
const factor2 =
this.exchangeRates[`${this.baseCurrency}${aToCurrency}`];
this.exchangeRates[`${aFromCurrency}${DEFAULT_CURRENCY}`];
const factor2 = this.exchangeRates[`${DEFAULT_CURRENCY}${aToCurrency}`];
factor = factor1 * factor2;
@ -204,28 +202,28 @@ export class ExchangeRateDataService {
let marketPriceBaseCurrencyToCurrency: number;
try {
if (this.baseCurrency === aFromCurrency) {
if (aFromCurrency === DEFAULT_CURRENCY) {
marketPriceBaseCurrencyFromCurrency = 1;
} else {
marketPriceBaseCurrencyFromCurrency = (
await this.marketDataService.get({
dataSource,
date: aDate,
symbol: `${this.baseCurrency}${aFromCurrency}`
symbol: `${DEFAULT_CURRENCY}${aFromCurrency}`
})
)?.marketPrice;
}
} catch {}
try {
if (this.baseCurrency === aToCurrency) {
if (aToCurrency === DEFAULT_CURRENCY) {
marketPriceBaseCurrencyToCurrency = 1;
} else {
marketPriceBaseCurrencyToCurrency = (
await this.marketDataService.get({
dataSource,
date: aDate,
symbol: `${this.baseCurrency}${aToCurrency}`
symbol: `${DEFAULT_CURRENCY}${aToCurrency}`
})
)?.marketPrice;
}
@ -295,14 +293,14 @@ export class ExchangeRateDataService {
private prepareCurrencyPairs(aCurrencies: string[]) {
return aCurrencies
.filter((currency) => {
return currency !== this.baseCurrency;
return currency !== DEFAULT_CURRENCY;
})
.map((currency) => {
return {
currency1: this.baseCurrency,
currency1: DEFAULT_CURRENCY,
currency2: currency,
dataSource: this.dataProviderService.getDataSourceForExchangeRates(),
symbol: `${this.baseCurrency}${currency}`
symbol: `${DEFAULT_CURRENCY}${currency}`
};
});
}

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

@ -3,7 +3,6 @@ import { CleanedEnvAccessors } from 'envalid';
export interface Environment extends CleanedEnvAccessors {
ACCESS_TOKEN_SALT: string;
ALPHA_VANTAGE_API_KEY: string;
BASE_CURRENCY: string;
BETTER_UPTIME_API_KEY: string;
CACHE_QUOTES_TTL: number;
CACHE_TTL: number;

17
apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts

@ -0,0 +1,17 @@
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
@Component({
host: { class: 'page' },
imports: [MatButtonModule, RouterModule],
selector: 'gf-ghostfolio-2-page',
standalone: true,
templateUrl: './ghostfolio-2-page.html'
})
export class Ghostfolio2PageComponent {
public routerLinkAbout = ['/' + $localize`about`];
public routerLinkAboutChangelog = ['/' + $localize`about`, 'changelog'];
public routerLinkFeatures = ['/' + $localize`features`];
public routerLinkMarkets = ['/' + $localize`markets`];
}

286
apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html

@ -0,0 +1,286 @@
<div class="blog container">
<div class="row">
<div class="col-md-8 offset-md-2">
<article>
<div class="mb-4 text-center">
<h1 class="mb-1">Ghostfolio 2.0</h1>
<div class="mb-3 text-muted"><small>2023-09-09</small></div>
<img
alt="Ghostfolio 2.0 Teaser"
class="border rounded w-100"
src="../assets/images/blog/ghostfolio-2.jpg"
title="Announcing Ghostfolio 2.0"
/>
</div>
<section class="mb-4">
<p>
Since late 2020, when
<a [routerLink]="routerLinkAbout">Ghostfolio</a> took shape, the
main goal has remained the same: to simplify investment tracking
while prioritizing user privacy and enable investors to make
informed decisions. Our journey so far has been incredible, with
over 300 releases since the
<a href="../en/blog/2021/07/hello-ghostfolio">first major release</a
>, close to 300’000 pulls on Docker Hub, and collaboration with 50+
contributors from around the globe. Ghostfolio was recently featured
on
<a
href="https://news.ycombinator.com/item?id=37337482"
target="_blank"
>Hacker News</a
>, where it ranked on the front page and briefly hit the #1 spot.
Shortly after, the project’s repository was trending on GitHub.
These achievements emphasize the growing recognition for our project
and the path we are on.
</p>
<p>
Now, we are thrilled to present Ghostfolio 2.0, another milestone in
our journey to empower investors.
</p>
</section>
<section class="mb-4">
<h2 class="h4">Introducing Ghostfolio 2.0</h2>
<p>
Ghostfolio 2.0 is the evolution of our
<a [routerLink]="routerLinkFeatures"
>open source wealth management software</a
>, elevating both user and developer experiences. We have extended
data import capabilities, added comprehensive analytics, increased
stability, and utilized the latest technology to deliver these
improvements. Here is a closer look at a selection of the
improvements you can expect from this
<a [routerLink]="routerLinkAboutChangelog">release</a>, alongside
uncounted smaller additions and enhancements.
</p>
<h3 class="h5">Extended Data Import Capabilities</h3>
<p>
Importing account activities is an important aspect of any portfolio
management software. With Ghostfolio 2.0, we have extended our data
import functionality, ensuring a seamless experience for users. Our
system supports multiple formats to make the experience more
seamless. Additionally, there is an API, providing you with even
greater flexibility and control over how you import transactions.
</p>
<h3 class="h5">Comprehensive Analytics</h3>
<p>
Understanding your wealth is key. The latest release offers more
comprehensive analytics to categorize your securities, providing
invaluable insights into your investment portfolio for making
informed decisions and optimizing diversification.
</p>
<h3 class="h5">Reliable Stability</h3>
<p>
Ensuring the stability of software is crucial, and a platform for
managing your wealth is no exception. The increased robustness of
our architecture means that you can count on Ghostfolio to be there
when you need it most, no matter the
<a [routerLink]="routerLinkMarkets">market conditions</a>.
</p>
<h3 class="h5">Cutting-Edge Technology Stack</h3>
<p>
Ghostfolio 2.0 leverages the latest tech stack to deliver a superior
user and developer experience. We have upgraded to
<a href="https://angular.io" target="_blank">Angular 16</a>,
<a href="https://nestjs.com" target="_blank">Nest.js 10</a>,
<a href="https://www.prisma.io" target="_blank">Prisma 5</a>, and
<a href="https://nx.dev" target="_blank">Nx 16</a>, ensuring that
the software is at the forefront of innovation. This upgrade allows
us to provide you with the best possible user experience, making
investment tracking more intuitive than ever before.
</p>
</section>
<section class="mb-4">
<h2 class="h4">Thriving Ghostfolio Community</h2>
<p>
In open source software (OSS) projects like Ghostfolio, the
community is the driving force behind its success. Without the
incredible support of our users and contributors, it would not have
been possible. As we celebrate the launch of Ghostfolio 2.0, we are
delighted to showcase the growth of the Ghostfolio community:
</p>
<ul>
<li>
Ghostfolio has accumulated <strong>2500+ stars</strong> on
<a
href="https://github.com/ghostfolio/ghostfolio"
target="_blank"
title="Find Ghostfolio on GitHub"
>GitHub</a
>, highlighting the appreciation and adoption of our platform by
the community.
</li>
<li>
Our
<a
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
target="_blank"
title="Join the Ghostfolio Slack community"
>Slack</a
>
community has expanded to over <strong>350 members</strong>,
creating a space for like-minded investors to connect, share
insights, and collaborate.
</li>
<li>
On
<a href="https://twitter.com/ghostfolio_" target="_blank">X</a>
(formerly Twitter), over
<strong>300 investors and personal finance enthusiasts</strong>
follow Ghostfolio, keen to stay updated on the latest
developments.
</li>
</ul>
<p>
This is just the beginning. Ghostfolio is dedicated to ongoing
improvement and helping grow a vibrant community of investors. We
invite you to join us on this exciting journey.
</p>
<p>
<strong>Join our Slack community</strong>: Connect with fellow
investors, share your insights, and stay updated on the latest news
by joining our
<a
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
target="_blank"
title="Join the Ghostfolio Slack community"
>Slack</a
>
community. It is a dynamic space where you can learn, collaborate,
and grow together with us.
</p>
<p>
<strong>Follow us on X</strong>: For release updates and market
insights, follow
<a href="https://twitter.com/ghostfolio_" target="_blank"
>Ghostfolio on X</a
>. It is the perfect place to stay informed and connect with our
team.
</p>
<p>
<strong>Give us a Star</strong>: If you have found value in
Ghostfolio or appreciate our commitment to simplifying investment
tracking, please consider giving us a star on
<a
href="https://github.com/ghostfolio/ghostfolio"
target="_blank"
title="Find Ghostfolio on GitHub"
>GitHub</a
>. Your support helps us reach a wider audience and make a
difference in the world of wealth management.
</p>
<p>
<strong>Become a contributor</strong>: If you are a developer
passionate about open source projects and personal finance, we
welcome your contributions.
<a href="https://github.com/ghostfolio/ghostfolio" target="_blank"
>Join our developer community</a
>, collaborate with like-minded people, and help shape the future of
Ghostfolio.
</p>
</section>
<section>
<p>
Ghostfolio 2.0 represents a major step forward in our mission to
empower investors, and we could not be more excited about the future
of the project. Together, we can build an outstanding tool that
makes our lives easier. Thank you for being a part of the Ghostfolio
community.
</p>
<p>Thomas from Ghostfolio</p>
</section>
<section class="mb-4">
<ul class="list-inline">
<li class="list-inline-item">
<span class="badge badge-light">Angular</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Announcement</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Collaboration</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Community</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Contribution</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Evolution</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Fintech</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio 2.0</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Investment</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Nest.js</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Nx</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Open Source</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">OSS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Personal Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Platform</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Prisma</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Privacy</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Release</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Software</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Stack</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Technology</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth Management</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Web3</span>
</li>
</ul>
</section>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
</li>
<li
aria-current="page"
class="active breadcrumb-item text-truncate"
>
Announcing Ghostfolio 2.0
</li>
</ol>
</nav>
</article>
</div>
</div>
</div>

9
apps/client/src/app/pages/blog/blog-page-routing.module.ts

@ -145,6 +145,15 @@ const routes: Routes = [
'./2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component'
).then((c) => c.GhostfolioJoinsOssFriendsPageComponent),
title: 'Ghostfolio joins OSS Friends'
},
{
canActivate: [AuthGuard],
path: '2023/09/ghostfolio-2',
loadComponent: () =>
import('./2023/09/ghostfolio-2/ghostfolio-2-page.component').then(
(c) => c.Ghostfolio2PageComponent
),
title: 'Ghostfolio 2.0'
}
];

26
apps/client/src/app/pages/blog/blog-page.html

@ -8,6 +8,32 @@
finance</small
>
</h1>
<mat-card appearance="outlined" class="mb-3">
<mat-card-content>
<div class="container p-0">
<div class="flex-nowrap no-gutters row">
<a
class="d-flex overflow-hidden w-100"
href="../en/blog/2023/09/ghostfolio-2"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate">
Announcing Ghostfolio 2.0
</div>
<div class="d-flex text-muted">2023-09-09</div>
</div>
<div class="align-items-center d-flex">
<ion-icon
class="chevron text-muted"
name="chevron-forward-outline"
size="small"
></ion-icon>
</div>
</a>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-content>
<div class="container p-0">

10
apps/client/src/app/pages/landing/landing-page.html

@ -1,9 +1,17 @@
<div class="container">
<div class="row">
<div class="col text-center">
<h1 class="font-weight-bold intro mt-5" i18n>
<div class="mt-5">
<div class="badge badge-light badge-pill border mb-3 px-3 py-2">
<a href="../en/blog/2023/09/ghostfolio-2"
><span class="mr-1 text-uppercase" i18n>New</span>
<span class="font-weight-normal">Ghostfolio 2.0</span></a
>
</div>
<h1 class="font-weight-bold intro" i18n>
Manage your wealth like a boss
</h1>
</div>
<p class="lead mb-4" i18n>
Ghostfolio is a privacy-first, open source dashboard for your personal
finances. Break down your asset allocation, know your net worth and make

4
apps/client/src/app/pages/open/open-page.html

@ -32,6 +32,7 @@
<div class="col-xs-12 col-md-4 my-2">
<gf-value
i18n
i18n-subLabel
size="large"
subLabel="(Last 24 hours)"
[locale]="user?.settings?.locale"
@ -42,6 +43,7 @@
<div class="col-xs-12 col-md-4 my-2">
<gf-value
i18n
i18n-subLabel
size="large"
subLabel="(Last 30 days)"
[locale]="user?.settings?.locale"
@ -52,6 +54,7 @@
<div class="col-xs-12 col-md-4 my-2">
<gf-value
i18n
i18n-subLabel
size="large"
subLabel="(Last 30 days)"
[locale]="user?.settings?.locale"
@ -119,6 +122,7 @@
<a class="d-block" href="https://status.ghostfol.io">
<gf-value
i18n
i18n-subLabel
size="large"
subLabel="(Last 90 days)"
[isPercent]="true"

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

@ -329,7 +329,7 @@
>{{ baseCurrency }}&nbsp;<strong
>{{ price }}</strong
></ng-container
>&nbsp;<span>per year</span></span
>&nbsp;<span i18n>per year</span></span
>
</p>
<div

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

@ -4,7 +4,6 @@ import { Router } from '@angular/router';
import { DataService } from '@ghostfolio/client/services/data.service';
import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Role } from '@prisma/client';
@ -36,8 +35,7 @@ export class RegisterPageComponent implements OnDestroy, OnInit {
private dialog: MatDialog,
private internetIdentityService: InternetIdentityService,
private router: Router,
private tokenStorageService: TokenStorageService,
private userService: UserService
private tokenStorageService: TokenStorageService
) {
this.info = this.dataService.fetchInfo();

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

@ -28,6 +28,7 @@
<ng-container *ngIf="hasPermissionForSocialLogin">
<div class="my-3 text-muted" i18n>or</div>
<button
*ngIf="false"
class="d-block mb-2 px-4 rounded-pill"
mat-stroked-button
(click)="onLoginWithInternetIdentity()"

BIN
apps/client/src/assets/images/blog/ghostfolio-2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

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

@ -658,7 +658,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">158</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit id="7d6573fb998f3a1cf1356623b85850d9d10edaa9" datatype="html">
@ -702,7 +702,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="323af13292ecc714ab3848b9dff48f923893be32" datatype="html">
@ -714,7 +714,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">185</context>
</context-group>
</trans-unit>
<trans-unit id="4fe84c1d0eef5726c017f64c691145db7a61f879" datatype="html">
@ -734,7 +734,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">189</context>
<context context-type="linenumber">193</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.html</context>
@ -750,7 +750,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">209</context>
</context-group>
</trans-unit>
<trans-unit id="452ef1b96854fe05618303ee601f8fed3b866c9f" datatype="html">
@ -766,7 +766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/resources-page.html</context>
@ -786,11 +786,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">228</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">292</context>
<context context-type="linenumber">297</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
@ -906,7 +906,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="28094f38aac43d3cb6edaf98a281fe443a930b5e" datatype="html">
@ -914,7 +914,7 @@
<target state="translated">Ich</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="90d136a4e1f551f5de5340d443e0c95e49e95e1c" datatype="html">
@ -922,7 +922,7 @@
<target state="translated">Mein Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">196</context>
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="6313384ccd7be95272bc2113ee9dada12af79b9b" datatype="html">
@ -930,7 +930,7 @@
<target state="translated">Über Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">236</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
@ -946,7 +946,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">267</context>
<context context-type="linenumber">271</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -962,7 +962,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">308</context>
<context context-type="linenumber">313</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-market/home-market.html</context>
@ -1054,7 +1054,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">414</context>
<context context-type="linenumber">430</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
@ -1098,7 +1098,7 @@
<target state="translated">Einloggen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">321</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1528,6 +1528,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html</context>
<context context-type="linenumber">267</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1652,6 +1656,10 @@
<trans-unit id="218afa01afa0cfc71b1a6507a3387763ecaa9332" datatype="html">
<source>per year</source>
<target state="translated">pro Jahr</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">332</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/user-account/user-account-page.html</context>
<context context-type="linenumber">57</context>
@ -2350,7 +2358,7 @@
<target state="translated">Weiter mit Internet Identity</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">40</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="c7eb7fc17d2f646c6c835f4da0b96f255b515cf4" datatype="html">
@ -2358,7 +2366,7 @@
<target state="translated">Weiter mit Google</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="3a6e5a6aa78ca864f6542410c5dafb6334538106" datatype="html">
@ -2534,7 +2542,7 @@
<target state="translated">Registrieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">333</context>
<context context-type="linenumber">338</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -7206,11 +7214,11 @@
<target state="translated">Aktive Nutzer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">40</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
<context context-type="linenumber">62</context>
</context-group>
</trans-unit>
<trans-unit id="8c4cfd77b7b3d7917de13bec98a8a74890f95618" datatype="html">
@ -7218,7 +7226,7 @@
<target state="translated">Neue Nutzer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="c0eb011366e597e23542be386e8bc0d53470b520" datatype="html">
@ -7226,7 +7234,7 @@
<target state="translated">Nutzer in der Slack Community</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="be99161cc904867871ab172df77b736d3b27dfc5" datatype="html">
@ -7234,7 +7242,7 @@
<target state="translated">Contributors auf GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="8d3932a9eba50bc101c2b8c329e7b4ea033cde97" datatype="html">
@ -7242,11 +7250,11 @@
<target state="translated">Sterne auf GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="512b096f732f5e05dc1c451276b7a2b1a2509acd" datatype="html">
@ -7254,11 +7262,11 @@
<target state="translated">Downloads auf Docker Hub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d16219cf7cc3ad92d2d49f0c55bbafe3768b2" datatype="html">
@ -7266,7 +7274,7 @@
<target state="translated">Verfügbarkeit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -7341,12 +7349,12 @@
<context context-type="linenumber">24,28</context>
</context-group>
</trans-unit>
<trans-unit id="1be07764640e49ab8b6f59b079e31d42083abf5b" datatype="html">
<trans-unit id="7b3c319feef05dcc1f487d09dd2a59eb4c50e6d6" datatype="html">
<source> Manage your wealth like a boss </source>
<target state="translated"> Verwalte dein Vermögen wie ein Profi </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">4,6</context>
<context context-type="linenumber">11,13</context>
</context-group>
</trans-unit>
<trans-unit id="f251aca95a00756de48b14172b02d33f175661fc" datatype="html">
@ -7354,7 +7362,7 @@
<target state="translated"> Ghostfolio ist ein Open Source Dashboard für deine persönlichen Finanzen mit Fokus auf Datenschutz. Analysiere deine Vermögensverteilung, ermittle dein Nettovermögen und treffe fundierte, datengestützte Investitionsentscheidungen. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7,11</context>
<context context-type="linenumber">15,19</context>
</context-group>
</trans-unit>
<trans-unit id="50fefcca3f8b7dd5a34141329118014a8c4b7d1b" datatype="html">
@ -7362,11 +7370,11 @@
<target state="translated"> Jetzt loslegen </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">39,41</context>
<context context-type="linenumber">47,49</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">410,412</context>
<context context-type="linenumber">426,428</context>
</context-group>
</trans-unit>
<trans-unit id="c4b553bb0e33c675cd6a34e2e295b984f9ee8381" datatype="html">
@ -7374,7 +7382,7 @@
<target state="translated"> oder </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">44,46</context>
<context context-type="linenumber">52,54</context>
</context-group>
</trans-unit>
<trans-unit id="1d6f11238819cf97ea87ab54714deda567d83f5c" datatype="html">
@ -7382,7 +7390,7 @@
<target state="translated">Monatlich aktive Nutzer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="9c7ee452b83c7458f6ffdd49837daf95b1d5f34e" datatype="html">
@ -7390,7 +7398,7 @@
<target state="translated">Bekannt aus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="c8ef12032b654cfd51b9ae1082fde84247945e03" datatype="html">
@ -7398,7 +7406,7 @@
<target state="translated"> Schützen Sie Ihr <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Vermögen<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. Optimieren Sie Ihre <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>persönliche Anlagestrategie<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">205,208</context>
<context context-type="linenumber">221,224</context>
</context-group>
</trans-unit>
<trans-unit id="9dd7364c5dcf1b010bfa80e824ba80eb67cc2b57" datatype="html">
@ -7406,7 +7414,7 @@
<target state="translated"> Ghostfolio ermöglicht es geschäftigen Leuten, den Überblick über Aktien, ETFs oder Kryptowährungen zu behalten, ohne überwacht zu werden. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">209,212</context>
<context context-type="linenumber">225,228</context>
</context-group>
</trans-unit>
<trans-unit id="70a1ed4b69a5a2cefa86b16c94ff2799a6566b4f" datatype="html">
@ -7414,7 +7422,7 @@
<target state="translated">360° Ansicht</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="e0840e61fd65397c9dd8c0aa35ec19778c79b73d" datatype="html">
@ -7422,7 +7430,7 @@
<target state="translated">Web3 ready</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">231</context>
<context context-type="linenumber">247</context>
</context-group>
</trans-unit>
<trans-unit id="0a82bf107b3693ed6bdba551a97ce92494921513" datatype="html">
@ -7430,7 +7438,7 @@
<target state="translated"> Nutze Ghostfolio ganz anonym und behalte deine Finanzdaten. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">233,235</context>
<context context-type="linenumber">249,251</context>
</context-group>
</trans-unit>
<trans-unit id="ebc1c2623f53ce48c714e00161a2f31f732c815b" datatype="html">
@ -7438,7 +7446,7 @@
<target state="translated">Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">241</context>
<context context-type="linenumber">257</context>
</context-group>
</trans-unit>
<trans-unit id="3756fe4769648222e9a3143d6a140e55afd7424b" datatype="html">
@ -7446,7 +7454,7 @@
<target state="translated"> Profitiere von kontinuierlichen Verbesserungen durch eine aktive Community. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">243,245</context>
<context context-type="linenumber">259,261</context>
</context-group>
</trans-unit>
<trans-unit id="e7360ce972bb10156736d042a15c6c939fea123d" datatype="html">
@ -7454,7 +7462,7 @@
<target state="translated">Warum <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">252</context>
<context context-type="linenumber">268</context>
</context-group>
</trans-unit>
<trans-unit id="b2466b29949bb745c1f96f2d82e5dab9061f8efe" datatype="html">
@ -7462,7 +7470,7 @@
<target state="translated"> Ghostfolio ist für dich geeignet, wenn du... </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">253,255</context>
<context context-type="linenumber">269,271</context>
</context-group>
</trans-unit>
<trans-unit id="2fe7c768f92932a3a6c9b460dd5d72e53deb9cfe" datatype="html">
@ -7470,7 +7478,7 @@
<target state="translated">Aktien, ETFs oder Kryptowährungen auf unterschiedlichen Plattformen handelst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">260,261</context>
<context context-type="linenumber">276,277</context>
</context-group>
</trans-unit>
<trans-unit id="fe71658bf131fad393a7ce618908e246617ded26" datatype="html">
@ -7478,7 +7486,7 @@
<target state="translated">eine Buy &amp; Hold Strategie verfolgst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">266</context>
<context context-type="linenumber">282</context>
</context-group>
</trans-unit>
<trans-unit id="2e95d2cbc69d45e5ecf3eb92c2972e8cb4ff3ec6" datatype="html">
@ -7486,7 +7494,7 @@
<target state="translated">dich für die Zusammensetzung deines Portfolios interessierst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">271</context>
<context context-type="linenumber">287</context>
</context-group>
</trans-unit>
<trans-unit id="4093027d62fd4125e36fe21bdd44475fc7499d02" datatype="html">
@ -7494,7 +7502,7 @@
<target state="translated">Privatsphäre und Datenhoheit wertschätzt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit id="5fae4f4ad7de60db18a5c52ccf5e7e8c7b194a9c" datatype="html">
@ -7502,7 +7510,7 @@
<target state="translated">zum Frugalismus oder Minimalismus neigst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">295</context>
</context-group>
</trans-unit>
<trans-unit id="18bb2c16577866572e3656986d9660d2db012565" datatype="html">
@ -7510,7 +7518,7 @@
<target state="translated">dich um die Diversifizierung deiner finanziellen Mittel kümmerst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">283</context>
<context context-type="linenumber">299</context>
</context-group>
</trans-unit>
<trans-unit id="0a6c37c2d3a8c41e7e44f020aefb1c667ac150dc" datatype="html">
@ -7518,7 +7526,7 @@
<target state="translated">Interesse an finanzieller Freiheit hast</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">287</context>
<context context-type="linenumber">303</context>
</context-group>
</trans-unit>
<trans-unit id="81fbb4e2cd3d3079d790bdddbfcc73ec3b600d22" datatype="html">
@ -7526,7 +7534,7 @@
<target state="translated">Nein sagst zu Excel-Tabellen im Jahr <x id="INTERPOLATION" equiv-text="{{ currentYear }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">291</context>
<context context-type="linenumber">307</context>
</context-group>
</trans-unit>
<trans-unit id="92cef868de56015b451e7eee26c9eaef54f41d37" datatype="html">
@ -7534,7 +7542,7 @@
<target state="translated">diese Liste bis zum Ende liest</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">310</context>
</context-group>
</trans-unit>
<trans-unit id="8c11c506c55700ca9883f360c52df5a432a51dcf" datatype="html">
@ -7542,7 +7550,7 @@
<target state="translated">Erfahre mehr über Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">299</context>
<context context-type="linenumber">315</context>
</context-group>
</trans-unit>
<trans-unit id="ae508ae33a02ae69247d9e4d84e98b610209ef3b" datatype="html">
@ -7550,7 +7558,7 @@
<target state="translated"> Was unsere <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Nutzer<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> sagen </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">307,309</context>
<context context-type="linenumber">323,325</context>
</context-group>
</trans-unit>
<trans-unit id="f9e4d441f5fed560c87d2f1f061eaa826ed271cd" datatype="html">
@ -7558,7 +7566,7 @@
<target state="translated"> Nutzer aus aller Welt verwenden <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;pricing&quot;&gt;"/><x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio Premium<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">337,339</context>
<context context-type="linenumber">353,355</context>
</context-group>
</trans-unit>
<trans-unit id="abc6737537d65639f566a7068d0e5dde19c9d220" datatype="html">
@ -7566,7 +7574,7 @@
<target state="translated"> Wie funktioniert <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> ? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">352,354</context>
<context context-type="linenumber">368,370</context>
</context-group>
</trans-unit>
<trans-unit id="969974097ecdfff6cb04b4cb71efccd717da1ce8" datatype="html">
@ -7574,7 +7582,7 @@
<target state="translated">Registriere dich anonym*</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">361</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="ebca1c496ea9caf6acf2a7ee5c4fa2b3f5aee1fe" datatype="html">
@ -7582,7 +7590,7 @@
<target state="translated"><x id="START_SMALL_TEXT" ctype="x-small" equiv-text="&lt;small&gt;"/>* Keine E-Mail-Adresse oder Kreditkarte erforderlich<x id="CLOSE_SMALL_TEXT" ctype="x-small" equiv-text="&lt;/small&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">379</context>
</context-group>
</trans-unit>
<trans-unit id="2039f449cf4ee0c26a9211de9d057c1002293917" datatype="html">
@ -7590,7 +7598,7 @@
<target state="translated"> Füge historische Transaktionen hinzu </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">374,376</context>
<context context-type="linenumber">390,392</context>
</context-group>
</trans-unit>
<trans-unit id="d6a2cfef5de5fd13ceb051a8725b1414c2ad9a69" datatype="html">
@ -7598,7 +7606,7 @@
<target state="translated"> Erhalte nützliche Erkenntnisse über die Zusammensetzung deines Portfolios </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">386,388</context>
<context context-type="linenumber">402,404</context>
</context-group>
</trans-unit>
<trans-unit id="b19d6b55a61fe4b3a9594fe87d504667cae32d8e" datatype="html">
@ -7606,7 +7614,7 @@
<target state="translated">Bist <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>du<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> bereit?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">398</context>
<context context-type="linenumber">414</context>
</context-group>
</trans-unit>
<trans-unit id="31d1cab2469b1cd9d7105900f3bf2781873282ad" datatype="html">
@ -7614,7 +7622,7 @@
<target state="translated"> Melde dich jetzt an <x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;ng-container *ngIf=&quot;hasPermissionForDemo&quot;&gt;"/> oder probiere die Live Demo aus<x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;/ng-container &gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">399,402</context>
<context context-type="linenumber">415,418</context>
</context-group>
</trans-unit>
<trans-unit id="195d2d6475819f55cf73287f97752093b7721ade" datatype="html">
@ -7622,11 +7630,11 @@
<target state="translated">Live Demo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">47</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">415</context>
<context context-type="linenumber">431</context>
</context-group>
</trans-unit>
<trans-unit id="dbe66b4824faaff93249a96c9ce23c237b446ed5" datatype="html">
@ -7634,7 +7642,7 @@
<target state="translated"> Verschaffe dir einen vollständigen Überblick deiner persönlichen Finanzen über mehrere Plattformen hinweg. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">222,225</context>
<context context-type="linenumber">238,241</context>
</context-group>
</trans-unit>
<trans-unit id="9454b3758f67cb4d178570e8bfb3e0d684e2353e" datatype="html">
@ -7642,7 +7650,7 @@
<target state="translated">Beginne mit nur 3 Schritten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">355</context>
<context context-type="linenumber">371</context>
</context-group>
</trans-unit>
<trans-unit id="4656883433287439415" datatype="html">
@ -7700,6 +7708,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">13</context>
@ -7864,6 +7876,14 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.component.ts</context>
<context context-type="linenumber">25</context>
@ -8028,6 +8048,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">14</context>
@ -9413,6 +9437,42 @@
<context context-type="linenumber">325</context>
</context-group>
</trans-unit>
<trans-unit id="7db7ee6941e96fe86681e5fb785c69d66da006d7" datatype="html">
<source>(Last 24 hours)</source>
<target state="translated">(Letzte 24 Stunden)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="e365d670d2eeb6a6876784db260668a2eb749044" datatype="html">
<source>(Last 30 days)</source>
<target state="translated">(Letzte 30 Tage)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="b9e82953df4178922cea15c5a8371fa224d6bc0c" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Letzte 90 Tage)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit id="d81f00c85d3b507f3e3d78bfc617a2c66e028391" datatype="html">
<source>New</source>
<target state="translated">Neu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -659,7 +659,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">158</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit id="7d6573fb998f3a1cf1356623b85850d9d10edaa9" datatype="html">
@ -703,7 +703,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="323af13292ecc714ab3848b9dff48f923893be32" datatype="html">
@ -715,7 +715,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">185</context>
</context-group>
</trans-unit>
<trans-unit id="4fe84c1d0eef5726c017f64c691145db7a61f879" datatype="html">
@ -735,7 +735,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">189</context>
<context context-type="linenumber">193</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.html</context>
@ -751,7 +751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">209</context>
</context-group>
</trans-unit>
<trans-unit id="452ef1b96854fe05618303ee601f8fed3b866c9f" datatype="html">
@ -767,7 +767,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/resources-page.html</context>
@ -787,11 +787,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">228</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">292</context>
<context context-type="linenumber">297</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
@ -907,7 +907,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="28094f38aac43d3cb6edaf98a281fe443a930b5e" datatype="html">
@ -915,7 +915,7 @@
<target state="translated">mí</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="90d136a4e1f551f5de5340d443e0c95e49e95e1c" datatype="html">
@ -923,7 +923,7 @@
<target state="translated">Mi Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">196</context>
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="6313384ccd7be95272bc2113ee9dada12af79b9b" datatype="html">
@ -931,7 +931,7 @@
<target state="translated">Sobre Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">236</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
@ -947,7 +947,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">267</context>
<context context-type="linenumber">271</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -963,7 +963,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">308</context>
<context context-type="linenumber">313</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-market/home-market.html</context>
@ -1055,7 +1055,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">414</context>
<context context-type="linenumber">430</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
@ -1099,7 +1099,7 @@
<target state="translated">Iniciar sesión</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">321</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1529,6 +1529,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html</context>
<context context-type="linenumber">267</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1653,6 +1657,10 @@
<trans-unit id="218afa01afa0cfc71b1a6507a3387763ecaa9332" datatype="html">
<source>per year</source>
<target state="translated">por año</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">332</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/user-account/user-account-page.html</context>
<context context-type="linenumber">57</context>
@ -2351,7 +2359,7 @@
<target state="translated">Continuar con Internet Identity</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">40</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="c7eb7fc17d2f646c6c835f4da0b96f255b515cf4" datatype="html">
@ -2359,7 +2367,7 @@
<target state="translated">Continuar con Google</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="3a6e5a6aa78ca864f6542410c5dafb6334538106" datatype="html">
@ -2535,7 +2543,7 @@
<target state="translated">Comenzar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">333</context>
<context context-type="linenumber">338</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -7207,11 +7215,11 @@
<target state="new">Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">40</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
<context context-type="linenumber">62</context>
</context-group>
</trans-unit>
<trans-unit id="8c4cfd77b7b3d7917de13bec98a8a74890f95618" datatype="html">
@ -7219,7 +7227,7 @@
<target state="new">New Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="c0eb011366e597e23542be386e8bc0d53470b520" datatype="html">
@ -7227,7 +7235,7 @@
<target state="new">Users in Slack community</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="be99161cc904867871ab172df77b736d3b27dfc5" datatype="html">
@ -7235,7 +7243,7 @@
<target state="new">Contributors on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="8d3932a9eba50bc101c2b8c329e7b4ea033cde97" datatype="html">
@ -7243,11 +7251,11 @@
<target state="new">Stars on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="512b096f732f5e05dc1c451276b7a2b1a2509acd" datatype="html">
@ -7255,11 +7263,11 @@
<target state="new">Pulls on Docker Hub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d16219cf7cc3ad92d2d49f0c55bbafe3768b2" datatype="html">
@ -7267,7 +7275,7 @@
<target state="new">Uptime</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -7342,12 +7350,12 @@
<context context-type="linenumber">24,28</context>
</context-group>
</trans-unit>
<trans-unit id="1be07764640e49ab8b6f59b079e31d42083abf5b" datatype="html">
<trans-unit id="7b3c319feef05dcc1f487d09dd2a59eb4c50e6d6" datatype="html">
<source> Manage your wealth like a boss </source>
<target state="new"> Manage your wealth like a boss </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">4,6</context>
<context context-type="linenumber">11,13</context>
</context-group>
</trans-unit>
<trans-unit id="f251aca95a00756de48b14172b02d33f175661fc" datatype="html">
@ -7355,7 +7363,7 @@
<target state="new"> 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. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7,11</context>
<context context-type="linenumber">15,19</context>
</context-group>
</trans-unit>
<trans-unit id="50fefcca3f8b7dd5a34141329118014a8c4b7d1b" datatype="html">
@ -7363,11 +7371,11 @@
<target state="new"> Get Started </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">39,41</context>
<context context-type="linenumber">47,49</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">410,412</context>
<context context-type="linenumber">426,428</context>
</context-group>
</trans-unit>
<trans-unit id="c4b553bb0e33c675cd6a34e2e295b984f9ee8381" datatype="html">
@ -7375,7 +7383,7 @@
<target state="new"> or </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">44,46</context>
<context context-type="linenumber">52,54</context>
</context-group>
</trans-unit>
<trans-unit id="1d6f11238819cf97ea87ab54714deda567d83f5c" datatype="html">
@ -7383,7 +7391,7 @@
<target state="new">Monthly Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="9c7ee452b83c7458f6ffdd49837daf95b1d5f34e" datatype="html">
@ -7391,7 +7399,7 @@
<target state="new">As seen in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="c8ef12032b654cfd51b9ae1082fde84247945e03" datatype="html">
@ -7399,7 +7407,7 @@
<target state="new"> Protect your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>assets<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. Refine your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>personal investment strategy<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">205,208</context>
<context context-type="linenumber">221,224</context>
</context-group>
</trans-unit>
<trans-unit id="9dd7364c5dcf1b010bfa80e824ba80eb67cc2b57" datatype="html">
@ -7407,7 +7415,7 @@
<target state="new"> Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">209,212</context>
<context context-type="linenumber">225,228</context>
</context-group>
</trans-unit>
<trans-unit id="70a1ed4b69a5a2cefa86b16c94ff2799a6566b4f" datatype="html">
@ -7415,7 +7423,7 @@
<target state="new">360° View</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="e0840e61fd65397c9dd8c0aa35ec19778c79b73d" datatype="html">
@ -7423,7 +7431,7 @@
<target state="new">Web3 Ready</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">231</context>
<context context-type="linenumber">247</context>
</context-group>
</trans-unit>
<trans-unit id="0a82bf107b3693ed6bdba551a97ce92494921513" datatype="html">
@ -7431,7 +7439,7 @@
<target state="new"> Use Ghostfolio anonymously and own your financial data. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">233,235</context>
<context context-type="linenumber">249,251</context>
</context-group>
</trans-unit>
<trans-unit id="ebc1c2623f53ce48c714e00161a2f31f732c815b" datatype="html">
@ -7439,7 +7447,7 @@
<target state="new">Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">241</context>
<context context-type="linenumber">257</context>
</context-group>
</trans-unit>
<trans-unit id="3756fe4769648222e9a3143d6a140e55afd7424b" datatype="html">
@ -7447,7 +7455,7 @@
<target state="new"> Benefit from continuous improvements through a strong community. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">243,245</context>
<context context-type="linenumber">259,261</context>
</context-group>
</trans-unit>
<trans-unit id="e7360ce972bb10156736d042a15c6c939fea123d" datatype="html">
@ -7455,7 +7463,7 @@
<target state="new">Why <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">252</context>
<context context-type="linenumber">268</context>
</context-group>
</trans-unit>
<trans-unit id="b2466b29949bb745c1f96f2d82e5dab9061f8efe" datatype="html">
@ -7463,7 +7471,7 @@
<target state="new"> Ghostfolio is for you if you are... </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">253,255</context>
<context context-type="linenumber">269,271</context>
</context-group>
</trans-unit>
<trans-unit id="2fe7c768f92932a3a6c9b460dd5d72e53deb9cfe" datatype="html">
@ -7471,7 +7479,7 @@
<target state="new">trading stocks, ETFs or cryptocurrencies on multiple platforms</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">260,261</context>
<context context-type="linenumber">276,277</context>
</context-group>
</trans-unit>
<trans-unit id="fe71658bf131fad393a7ce618908e246617ded26" datatype="html">
@ -7479,7 +7487,7 @@
<target state="new">pursuing a buy &amp; hold strategy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">266</context>
<context context-type="linenumber">282</context>
</context-group>
</trans-unit>
<trans-unit id="2e95d2cbc69d45e5ecf3eb92c2972e8cb4ff3ec6" datatype="html">
@ -7487,7 +7495,7 @@
<target state="new">interested in getting insights of your portfolio composition</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">271</context>
<context context-type="linenumber">287</context>
</context-group>
</trans-unit>
<trans-unit id="4093027d62fd4125e36fe21bdd44475fc7499d02" datatype="html">
@ -7495,7 +7503,7 @@
<target state="new">valuing privacy and data ownership</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit id="5fae4f4ad7de60db18a5c52ccf5e7e8c7b194a9c" datatype="html">
@ -7503,7 +7511,7 @@
<target state="new">into minimalism</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">295</context>
</context-group>
</trans-unit>
<trans-unit id="18bb2c16577866572e3656986d9660d2db012565" datatype="html">
@ -7511,7 +7519,7 @@
<target state="new">caring about diversifying your financial resources</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">283</context>
<context context-type="linenumber">299</context>
</context-group>
</trans-unit>
<trans-unit id="0a6c37c2d3a8c41e7e44f020aefb1c667ac150dc" datatype="html">
@ -7519,7 +7527,7 @@
<target state="new">interested in financial independence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">287</context>
<context context-type="linenumber">303</context>
</context-group>
</trans-unit>
<trans-unit id="81fbb4e2cd3d3079d790bdddbfcc73ec3b600d22" datatype="html">
@ -7527,7 +7535,7 @@
<target state="new">saying no to spreadsheets in <x id="INTERPOLATION" equiv-text="{{ currentYear }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">291</context>
<context context-type="linenumber">307</context>
</context-group>
</trans-unit>
<trans-unit id="92cef868de56015b451e7eee26c9eaef54f41d37" datatype="html">
@ -7535,7 +7543,7 @@
<target state="new">still reading this list</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">310</context>
</context-group>
</trans-unit>
<trans-unit id="8c11c506c55700ca9883f360c52df5a432a51dcf" datatype="html">
@ -7543,7 +7551,7 @@
<target state="new">Learn more about Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">299</context>
<context context-type="linenumber">315</context>
</context-group>
</trans-unit>
<trans-unit id="ae508ae33a02ae69247d9e4d84e98b610209ef3b" datatype="html">
@ -7551,7 +7559,7 @@
<target state="new"> What our <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>users<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> are saying </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">307,309</context>
<context context-type="linenumber">323,325</context>
</context-group>
</trans-unit>
<trans-unit id="f9e4d441f5fed560c87d2f1f061eaa826ed271cd" datatype="html">
@ -7559,7 +7567,7 @@
<target state="new"> Members from around the globe are using <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;pricing&quot;&gt;"/><x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio Premium<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">337,339</context>
<context context-type="linenumber">353,355</context>
</context-group>
</trans-unit>
<trans-unit id="abc6737537d65639f566a7068d0e5dde19c9d220" datatype="html">
@ -7567,7 +7575,7 @@
<target state="new"> How does <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> work? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">352,354</context>
<context context-type="linenumber">368,370</context>
</context-group>
</trans-unit>
<trans-unit id="969974097ecdfff6cb04b4cb71efccd717da1ce8" datatype="html">
@ -7575,7 +7583,7 @@
<target state="new">Sign up anonymously*</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">361</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="ebca1c496ea9caf6acf2a7ee5c4fa2b3f5aee1fe" datatype="html">
@ -7583,7 +7591,7 @@
<target state="new"><x id="START_SMALL_TEXT" ctype="x-small" equiv-text="&lt;small&gt;"/>* no e-mail address nor credit card required<x id="CLOSE_SMALL_TEXT" ctype="x-small" equiv-text="&lt;/small&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">379</context>
</context-group>
</trans-unit>
<trans-unit id="2039f449cf4ee0c26a9211de9d057c1002293917" datatype="html">
@ -7591,7 +7599,7 @@
<target state="new"> Add any of your historical transactions </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">374,376</context>
<context context-type="linenumber">390,392</context>
</context-group>
</trans-unit>
<trans-unit id="d6a2cfef5de5fd13ceb051a8725b1414c2ad9a69" datatype="html">
@ -7599,7 +7607,7 @@
<target state="new"> Get valuable insights of your portfolio composition </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">386,388</context>
<context context-type="linenumber">402,404</context>
</context-group>
</trans-unit>
<trans-unit id="b19d6b55a61fe4b3a9594fe87d504667cae32d8e" datatype="html">
@ -7607,7 +7615,7 @@
<target state="new">Are <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>you<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> ready?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">398</context>
<context context-type="linenumber">414</context>
</context-group>
</trans-unit>
<trans-unit id="31d1cab2469b1cd9d7105900f3bf2781873282ad" datatype="html">
@ -7615,7 +7623,7 @@
<target state="new"> Join now<x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;ng-container *ngIf=&quot;hasPermissionForDemo&quot;&gt;"/> or check out the example account<x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;/ng-container &gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">399,402</context>
<context context-type="linenumber">415,418</context>
</context-group>
</trans-unit>
<trans-unit id="195d2d6475819f55cf73287f97752093b7721ade" datatype="html">
@ -7623,11 +7631,11 @@
<target state="new">Live Demo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">47</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">415</context>
<context context-type="linenumber">431</context>
</context-group>
</trans-unit>
<trans-unit id="dbe66b4824faaff93249a96c9ce23c237b446ed5" datatype="html">
@ -7635,7 +7643,7 @@
<target state="new"> Get the full picture of your personal finances across multiple platforms. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">222,225</context>
<context context-type="linenumber">238,241</context>
</context-group>
</trans-unit>
<trans-unit id="9454b3758f67cb4d178570e8bfb3e0d684e2353e" datatype="html">
@ -7643,7 +7651,7 @@
<target state="new">Get started in only 3 steps</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">355</context>
<context context-type="linenumber">371</context>
</context-group>
</trans-unit>
<trans-unit id="4656883433287439415" datatype="html">
@ -7701,6 +7709,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">13</context>
@ -7865,6 +7877,14 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.component.ts</context>
<context context-type="linenumber">25</context>
@ -8029,6 +8049,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">14</context>
@ -9414,6 +9438,42 @@
<context context-type="linenumber">325</context>
</context-group>
</trans-unit>
<trans-unit id="7db7ee6941e96fe86681e5fb785c69d66da006d7" datatype="html">
<source>(Last 24 hours)</source>
<target state="new">(Last 24 hours)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="e365d670d2eeb6a6876784db260668a2eb749044" datatype="html">
<source>(Last 30 days)</source>
<target state="new">(Last 30 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="b9e82953df4178922cea15c5a8371fa224d6bc0c" datatype="html">
<source>(Last 90 days)</source>
<target state="new">(Last 90 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit id="d81f00c85d3b507f3e3d78bfc617a2c66e028391" datatype="html">
<source>New</source>
<target state="new">New</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -906,7 +906,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">158</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit id="7d6573fb998f3a1cf1356623b85850d9d10edaa9" datatype="html">
@ -934,7 +934,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">189</context>
<context context-type="linenumber">193</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.html</context>
@ -1018,7 +1018,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="323af13292ecc714ab3848b9dff48f923893be32" datatype="html">
@ -1030,7 +1030,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">185</context>
</context-group>
</trans-unit>
<trans-unit id="b0f210a3147d1b669e081dae1fcd0918fe7c3021" datatype="html">
@ -1042,7 +1042,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">209</context>
</context-group>
</trans-unit>
<trans-unit id="452ef1b96854fe05618303ee601f8fed3b866c9f" datatype="html">
@ -1058,7 +1058,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/resources-page.html</context>
@ -1078,11 +1078,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">228</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">292</context>
<context context-type="linenumber">297</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
@ -1198,7 +1198,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="28094f38aac43d3cb6edaf98a281fe443a930b5e" datatype="html">
@ -1206,7 +1206,7 @@
<target state="translated">Moi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="90d136a4e1f551f5de5340d443e0c95e49e95e1c" datatype="html">
@ -1214,7 +1214,7 @@
<target state="translated">Mon Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">196</context>
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="6313384ccd7be95272bc2113ee9dada12af79b9b" datatype="html">
@ -1222,7 +1222,7 @@
<target state="translated">À propos de Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">236</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
@ -1238,7 +1238,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">267</context>
<context context-type="linenumber">271</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1254,7 +1254,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">308</context>
<context context-type="linenumber">313</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-market/home-market.html</context>
@ -1270,7 +1270,7 @@
<target state="translated">Se connecter</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">321</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1282,7 +1282,7 @@
<target state="translated">Démarrer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">333</context>
<context context-type="linenumber">338</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
@ -1410,7 +1410,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">414</context>
<context context-type="linenumber">430</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
@ -1940,6 +1940,10 @@
<trans-unit id="218afa01afa0cfc71b1a6507a3387763ecaa9332" datatype="html">
<source>per year</source>
<target state="translated">par an</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">332</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/user-account/user-account-page.html</context>
<context context-type="linenumber">57</context>
@ -2296,6 +2300,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html</context>
<context context-type="linenumber">267</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -2890,7 +2898,7 @@
<target state="translated">Continue avec Internet Identity</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">40</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="c7eb7fc17d2f646c6c835f4da0b96f255b515cf4" datatype="html">
@ -2898,7 +2906,7 @@
<target state="translated">Continuer avec Google</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="3a6e5a6aa78ca864f6542410c5dafb6334538106" datatype="html">
@ -7206,11 +7214,11 @@
<target state="new">Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">40</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
<context context-type="linenumber">62</context>
</context-group>
</trans-unit>
<trans-unit id="8c4cfd77b7b3d7917de13bec98a8a74890f95618" datatype="html">
@ -7218,7 +7226,7 @@
<target state="new">New Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="c0eb011366e597e23542be386e8bc0d53470b520" datatype="html">
@ -7226,7 +7234,7 @@
<target state="new">Users in Slack community</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="be99161cc904867871ab172df77b736d3b27dfc5" datatype="html">
@ -7234,7 +7242,7 @@
<target state="new">Contributors on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="8d3932a9eba50bc101c2b8c329e7b4ea033cde97" datatype="html">
@ -7242,11 +7250,11 @@
<target state="new">Stars on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="512b096f732f5e05dc1c451276b7a2b1a2509acd" datatype="html">
@ -7254,11 +7262,11 @@
<target state="new">Pulls on Docker Hub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d16219cf7cc3ad92d2d49f0c55bbafe3768b2" datatype="html">
@ -7266,7 +7274,7 @@
<target state="new">Uptime</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -7341,12 +7349,12 @@
<context context-type="linenumber">24,28</context>
</context-group>
</trans-unit>
<trans-unit id="1be07764640e49ab8b6f59b079e31d42083abf5b" datatype="html">
<trans-unit id="7b3c319feef05dcc1f487d09dd2a59eb4c50e6d6" datatype="html">
<source> Manage your wealth like a boss </source>
<target state="new"> Manage your wealth like a boss </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">4,6</context>
<context context-type="linenumber">11,13</context>
</context-group>
</trans-unit>
<trans-unit id="f251aca95a00756de48b14172b02d33f175661fc" datatype="html">
@ -7354,7 +7362,7 @@
<target state="new"> 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. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7,11</context>
<context context-type="linenumber">15,19</context>
</context-group>
</trans-unit>
<trans-unit id="50fefcca3f8b7dd5a34141329118014a8c4b7d1b" datatype="html">
@ -7362,11 +7370,11 @@
<target state="new"> Get Started </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">39,41</context>
<context context-type="linenumber">47,49</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">410,412</context>
<context context-type="linenumber">426,428</context>
</context-group>
</trans-unit>
<trans-unit id="c4b553bb0e33c675cd6a34e2e295b984f9ee8381" datatype="html">
@ -7374,7 +7382,7 @@
<target state="new"> or </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">44,46</context>
<context context-type="linenumber">52,54</context>
</context-group>
</trans-unit>
<trans-unit id="1d6f11238819cf97ea87ab54714deda567d83f5c" datatype="html">
@ -7382,7 +7390,7 @@
<target state="new">Monthly Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="9c7ee452b83c7458f6ffdd49837daf95b1d5f34e" datatype="html">
@ -7390,7 +7398,7 @@
<target state="new">As seen in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="c8ef12032b654cfd51b9ae1082fde84247945e03" datatype="html">
@ -7398,7 +7406,7 @@
<target state="new"> Protect your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>assets<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. Refine your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>personal investment strategy<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">205,208</context>
<context context-type="linenumber">221,224</context>
</context-group>
</trans-unit>
<trans-unit id="9dd7364c5dcf1b010bfa80e824ba80eb67cc2b57" datatype="html">
@ -7406,7 +7414,7 @@
<target state="new"> Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">209,212</context>
<context context-type="linenumber">225,228</context>
</context-group>
</trans-unit>
<trans-unit id="70a1ed4b69a5a2cefa86b16c94ff2799a6566b4f" datatype="html">
@ -7414,7 +7422,7 @@
<target state="new">360° View</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="e0840e61fd65397c9dd8c0aa35ec19778c79b73d" datatype="html">
@ -7422,7 +7430,7 @@
<target state="new">Web3 Ready</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">231</context>
<context context-type="linenumber">247</context>
</context-group>
</trans-unit>
<trans-unit id="0a82bf107b3693ed6bdba551a97ce92494921513" datatype="html">
@ -7430,7 +7438,7 @@
<target state="new"> Use Ghostfolio anonymously and own your financial data. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">233,235</context>
<context context-type="linenumber">249,251</context>
</context-group>
</trans-unit>
<trans-unit id="ebc1c2623f53ce48c714e00161a2f31f732c815b" datatype="html">
@ -7438,7 +7446,7 @@
<target state="new">Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">241</context>
<context context-type="linenumber">257</context>
</context-group>
</trans-unit>
<trans-unit id="3756fe4769648222e9a3143d6a140e55afd7424b" datatype="html">
@ -7446,7 +7454,7 @@
<target state="new"> Benefit from continuous improvements through a strong community. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">243,245</context>
<context context-type="linenumber">259,261</context>
</context-group>
</trans-unit>
<trans-unit id="e7360ce972bb10156736d042a15c6c939fea123d" datatype="html">
@ -7454,7 +7462,7 @@
<target state="new">Why <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">252</context>
<context context-type="linenumber">268</context>
</context-group>
</trans-unit>
<trans-unit id="b2466b29949bb745c1f96f2d82e5dab9061f8efe" datatype="html">
@ -7462,7 +7470,7 @@
<target state="new"> Ghostfolio is for you if you are... </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">253,255</context>
<context context-type="linenumber">269,271</context>
</context-group>
</trans-unit>
<trans-unit id="2fe7c768f92932a3a6c9b460dd5d72e53deb9cfe" datatype="html">
@ -7470,7 +7478,7 @@
<target state="new">trading stocks, ETFs or cryptocurrencies on multiple platforms</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">260,261</context>
<context context-type="linenumber">276,277</context>
</context-group>
</trans-unit>
<trans-unit id="fe71658bf131fad393a7ce618908e246617ded26" datatype="html">
@ -7478,7 +7486,7 @@
<target state="new">pursuing a buy &amp; hold strategy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">266</context>
<context context-type="linenumber">282</context>
</context-group>
</trans-unit>
<trans-unit id="2e95d2cbc69d45e5ecf3eb92c2972e8cb4ff3ec6" datatype="html">
@ -7486,7 +7494,7 @@
<target state="new">interested in getting insights of your portfolio composition</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">271</context>
<context context-type="linenumber">287</context>
</context-group>
</trans-unit>
<trans-unit id="4093027d62fd4125e36fe21bdd44475fc7499d02" datatype="html">
@ -7494,7 +7502,7 @@
<target state="new">valuing privacy and data ownership</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit id="5fae4f4ad7de60db18a5c52ccf5e7e8c7b194a9c" datatype="html">
@ -7502,7 +7510,7 @@
<target state="new">into minimalism</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">295</context>
</context-group>
</trans-unit>
<trans-unit id="18bb2c16577866572e3656986d9660d2db012565" datatype="html">
@ -7510,7 +7518,7 @@
<target state="new">caring about diversifying your financial resources</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">283</context>
<context context-type="linenumber">299</context>
</context-group>
</trans-unit>
<trans-unit id="0a6c37c2d3a8c41e7e44f020aefb1c667ac150dc" datatype="html">
@ -7518,7 +7526,7 @@
<target state="new">interested in financial independence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">287</context>
<context context-type="linenumber">303</context>
</context-group>
</trans-unit>
<trans-unit id="81fbb4e2cd3d3079d790bdddbfcc73ec3b600d22" datatype="html">
@ -7526,7 +7534,7 @@
<target state="new">saying no to spreadsheets in <x id="INTERPOLATION" equiv-text="{{ currentYear }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">291</context>
<context context-type="linenumber">307</context>
</context-group>
</trans-unit>
<trans-unit id="92cef868de56015b451e7eee26c9eaef54f41d37" datatype="html">
@ -7534,7 +7542,7 @@
<target state="new">still reading this list</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">310</context>
</context-group>
</trans-unit>
<trans-unit id="8c11c506c55700ca9883f360c52df5a432a51dcf" datatype="html">
@ -7542,7 +7550,7 @@
<target state="new">Learn more about Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">299</context>
<context context-type="linenumber">315</context>
</context-group>
</trans-unit>
<trans-unit id="ae508ae33a02ae69247d9e4d84e98b610209ef3b" datatype="html">
@ -7550,7 +7558,7 @@
<target state="new"> What our <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>users<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> are saying </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">307,309</context>
<context context-type="linenumber">323,325</context>
</context-group>
</trans-unit>
<trans-unit id="f9e4d441f5fed560c87d2f1f061eaa826ed271cd" datatype="html">
@ -7558,7 +7566,7 @@
<target state="new"> Members from around the globe are using <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;pricing&quot;&gt;"/><x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio Premium<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">337,339</context>
<context context-type="linenumber">353,355</context>
</context-group>
</trans-unit>
<trans-unit id="abc6737537d65639f566a7068d0e5dde19c9d220" datatype="html">
@ -7566,7 +7574,7 @@
<target state="new"> How does <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> work? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">352,354</context>
<context context-type="linenumber">368,370</context>
</context-group>
</trans-unit>
<trans-unit id="969974097ecdfff6cb04b4cb71efccd717da1ce8" datatype="html">
@ -7574,7 +7582,7 @@
<target state="new">Sign up anonymously*</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">361</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="ebca1c496ea9caf6acf2a7ee5c4fa2b3f5aee1fe" datatype="html">
@ -7582,7 +7590,7 @@
<target state="new"><x id="START_SMALL_TEXT" ctype="x-small" equiv-text="&lt;small&gt;"/>* no e-mail address nor credit card required<x id="CLOSE_SMALL_TEXT" ctype="x-small" equiv-text="&lt;/small&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">379</context>
</context-group>
</trans-unit>
<trans-unit id="2039f449cf4ee0c26a9211de9d057c1002293917" datatype="html">
@ -7590,7 +7598,7 @@
<target state="new"> Add any of your historical transactions </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">374,376</context>
<context context-type="linenumber">390,392</context>
</context-group>
</trans-unit>
<trans-unit id="d6a2cfef5de5fd13ceb051a8725b1414c2ad9a69" datatype="html">
@ -7598,7 +7606,7 @@
<target state="new"> Get valuable insights of your portfolio composition </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">386,388</context>
<context context-type="linenumber">402,404</context>
</context-group>
</trans-unit>
<trans-unit id="b19d6b55a61fe4b3a9594fe87d504667cae32d8e" datatype="html">
@ -7606,7 +7614,7 @@
<target state="new">Are <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>you<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> ready?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">398</context>
<context context-type="linenumber">414</context>
</context-group>
</trans-unit>
<trans-unit id="31d1cab2469b1cd9d7105900f3bf2781873282ad" datatype="html">
@ -7614,7 +7622,7 @@
<target state="new"> Join now<x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;ng-container *ngIf=&quot;hasPermissionForDemo&quot;&gt;"/> or check out the example account<x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;/ng-container &gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">399,402</context>
<context context-type="linenumber">415,418</context>
</context-group>
</trans-unit>
<trans-unit id="195d2d6475819f55cf73287f97752093b7721ade" datatype="html">
@ -7622,11 +7630,11 @@
<target state="new">Live Demo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">47</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">415</context>
<context context-type="linenumber">431</context>
</context-group>
</trans-unit>
<trans-unit id="dbe66b4824faaff93249a96c9ce23c237b446ed5" datatype="html">
@ -7634,7 +7642,7 @@
<target state="new"> Get the full picture of your personal finances across multiple platforms. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">222,225</context>
<context context-type="linenumber">238,241</context>
</context-group>
</trans-unit>
<trans-unit id="9454b3758f67cb4d178570e8bfb3e0d684e2353e" datatype="html">
@ -7642,7 +7650,7 @@
<target state="new">Get started in only 3 steps</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">355</context>
<context context-type="linenumber">371</context>
</context-group>
</trans-unit>
<trans-unit id="4656883433287439415" datatype="html">
@ -7700,6 +7708,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">13</context>
@ -7864,6 +7876,14 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.component.ts</context>
<context context-type="linenumber">25</context>
@ -8028,6 +8048,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">14</context>
@ -9413,6 +9437,42 @@
<context context-type="linenumber">325</context>
</context-group>
</trans-unit>
<trans-unit id="7db7ee6941e96fe86681e5fb785c69d66da006d7" datatype="html">
<source>(Last 24 hours)</source>
<target state="new">(Last 24 hours)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="e365d670d2eeb6a6876784db260668a2eb749044" datatype="html">
<source>(Last 30 days)</source>
<target state="new">(Last 30 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="b9e82953df4178922cea15c5a8371fa224d6bc0c" datatype="html">
<source>(Last 90 days)</source>
<target state="new">(Last 90 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit id="d81f00c85d3b507f3e3d78bfc617a2c66e028391" datatype="html">
<source>New</source>
<target state="new">New</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -659,7 +659,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">158</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit id="7d6573fb998f3a1cf1356623b85850d9d10edaa9" datatype="html">
@ -703,7 +703,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="323af13292ecc714ab3848b9dff48f923893be32" datatype="html">
@ -715,7 +715,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">185</context>
</context-group>
</trans-unit>
<trans-unit id="4fe84c1d0eef5726c017f64c691145db7a61f879" datatype="html">
@ -735,7 +735,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">189</context>
<context context-type="linenumber">193</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.html</context>
@ -751,7 +751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">209</context>
</context-group>
</trans-unit>
<trans-unit id="452ef1b96854fe05618303ee601f8fed3b866c9f" datatype="html">
@ -767,7 +767,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/resources-page.html</context>
@ -787,11 +787,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">228</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">292</context>
<context context-type="linenumber">297</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
@ -907,7 +907,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="28094f38aac43d3cb6edaf98a281fe443a930b5e" datatype="html">
@ -915,7 +915,7 @@
<target state="translated">Io</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="90d136a4e1f551f5de5340d443e0c95e49e95e1c" datatype="html">
@ -923,7 +923,7 @@
<target state="translated">Il mio Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">196</context>
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="6313384ccd7be95272bc2113ee9dada12af79b9b" datatype="html">
@ -931,7 +931,7 @@
<target state="translated">Informazioni su Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">236</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
@ -947,7 +947,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">267</context>
<context context-type="linenumber">271</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -963,7 +963,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">308</context>
<context context-type="linenumber">313</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-market/home-market.html</context>
@ -1055,7 +1055,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">414</context>
<context context-type="linenumber">430</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
@ -1099,7 +1099,7 @@
<target state="translated">Accedi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">321</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1529,6 +1529,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html</context>
<context context-type="linenumber">267</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1653,6 +1657,10 @@
<trans-unit id="218afa01afa0cfc71b1a6507a3387763ecaa9332" datatype="html">
<source>per year</source>
<target state="translated">per anno</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">332</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/user-account/user-account-page.html</context>
<context context-type="linenumber">57</context>
@ -2351,7 +2359,7 @@
<target state="translated">Continua con Internet Identity</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">40</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="c7eb7fc17d2f646c6c835f4da0b96f255b515cf4" datatype="html">
@ -2359,7 +2367,7 @@
<target state="translated">Continua con Google</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="3a6e5a6aa78ca864f6542410c5dafb6334538106" datatype="html">
@ -2535,7 +2543,7 @@
<target state="translated">Inizia</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">333</context>
<context context-type="linenumber">338</context>
</context-group>
</trans-unit>
<trans-unit id="4190182554887994764" datatype="html">
@ -7207,11 +7215,11 @@
<target state="new">Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">40</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
<context context-type="linenumber">62</context>
</context-group>
</trans-unit>
<trans-unit id="8c4cfd77b7b3d7917de13bec98a8a74890f95618" datatype="html">
@ -7219,7 +7227,7 @@
<target state="new">New Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="c0eb011366e597e23542be386e8bc0d53470b520" datatype="html">
@ -7227,7 +7235,7 @@
<target state="new">Users in Slack community</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="be99161cc904867871ab172df77b736d3b27dfc5" datatype="html">
@ -7235,7 +7243,7 @@
<target state="new">Contributors on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="8d3932a9eba50bc101c2b8c329e7b4ea033cde97" datatype="html">
@ -7243,11 +7251,11 @@
<target state="new">Stars on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="512b096f732f5e05dc1c451276b7a2b1a2509acd" datatype="html">
@ -7255,11 +7263,11 @@
<target state="new">Pulls on Docker Hub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d16219cf7cc3ad92d2d49f0c55bbafe3768b2" datatype="html">
@ -7267,7 +7275,7 @@
<target state="new">Uptime</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -7342,12 +7350,12 @@
<context context-type="linenumber">24,28</context>
</context-group>
</trans-unit>
<trans-unit id="1be07764640e49ab8b6f59b079e31d42083abf5b" datatype="html">
<trans-unit id="7b3c319feef05dcc1f487d09dd2a59eb4c50e6d6" datatype="html">
<source> Manage your wealth like a boss </source>
<target state="new"> Manage your wealth like a boss </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">4,6</context>
<context context-type="linenumber">11,13</context>
</context-group>
</trans-unit>
<trans-unit id="f251aca95a00756de48b14172b02d33f175661fc" datatype="html">
@ -7355,7 +7363,7 @@
<target state="new"> 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. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7,11</context>
<context context-type="linenumber">15,19</context>
</context-group>
</trans-unit>
<trans-unit id="50fefcca3f8b7dd5a34141329118014a8c4b7d1b" datatype="html">
@ -7363,11 +7371,11 @@
<target state="new"> Get Started </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">39,41</context>
<context context-type="linenumber">47,49</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">410,412</context>
<context context-type="linenumber">426,428</context>
</context-group>
</trans-unit>
<trans-unit id="c4b553bb0e33c675cd6a34e2e295b984f9ee8381" datatype="html">
@ -7375,7 +7383,7 @@
<target state="new"> or </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">44,46</context>
<context context-type="linenumber">52,54</context>
</context-group>
</trans-unit>
<trans-unit id="1d6f11238819cf97ea87ab54714deda567d83f5c" datatype="html">
@ -7383,7 +7391,7 @@
<target state="new">Monthly Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="9c7ee452b83c7458f6ffdd49837daf95b1d5f34e" datatype="html">
@ -7391,7 +7399,7 @@
<target state="new">As seen in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="c8ef12032b654cfd51b9ae1082fde84247945e03" datatype="html">
@ -7399,7 +7407,7 @@
<target state="new"> Protect your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>assets<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. Refine your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>personal investment strategy<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">205,208</context>
<context context-type="linenumber">221,224</context>
</context-group>
</trans-unit>
<trans-unit id="9dd7364c5dcf1b010bfa80e824ba80eb67cc2b57" datatype="html">
@ -7407,7 +7415,7 @@
<target state="new"> Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">209,212</context>
<context context-type="linenumber">225,228</context>
</context-group>
</trans-unit>
<trans-unit id="70a1ed4b69a5a2cefa86b16c94ff2799a6566b4f" datatype="html">
@ -7415,7 +7423,7 @@
<target state="new">360° View</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="e0840e61fd65397c9dd8c0aa35ec19778c79b73d" datatype="html">
@ -7423,7 +7431,7 @@
<target state="new">Web3 Ready</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">231</context>
<context context-type="linenumber">247</context>
</context-group>
</trans-unit>
<trans-unit id="0a82bf107b3693ed6bdba551a97ce92494921513" datatype="html">
@ -7431,7 +7439,7 @@
<target state="new"> Use Ghostfolio anonymously and own your financial data. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">233,235</context>
<context context-type="linenumber">249,251</context>
</context-group>
</trans-unit>
<trans-unit id="ebc1c2623f53ce48c714e00161a2f31f732c815b" datatype="html">
@ -7439,7 +7447,7 @@
<target state="new">Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">241</context>
<context context-type="linenumber">257</context>
</context-group>
</trans-unit>
<trans-unit id="3756fe4769648222e9a3143d6a140e55afd7424b" datatype="html">
@ -7447,7 +7455,7 @@
<target state="new"> Benefit from continuous improvements through a strong community. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">243,245</context>
<context context-type="linenumber">259,261</context>
</context-group>
</trans-unit>
<trans-unit id="e7360ce972bb10156736d042a15c6c939fea123d" datatype="html">
@ -7455,7 +7463,7 @@
<target state="new">Why <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">252</context>
<context context-type="linenumber">268</context>
</context-group>
</trans-unit>
<trans-unit id="b2466b29949bb745c1f96f2d82e5dab9061f8efe" datatype="html">
@ -7463,7 +7471,7 @@
<target state="new"> Ghostfolio is for you if you are... </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">253,255</context>
<context context-type="linenumber">269,271</context>
</context-group>
</trans-unit>
<trans-unit id="2fe7c768f92932a3a6c9b460dd5d72e53deb9cfe" datatype="html">
@ -7471,7 +7479,7 @@
<target state="new">trading stocks, ETFs or cryptocurrencies on multiple platforms</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">260,261</context>
<context context-type="linenumber">276,277</context>
</context-group>
</trans-unit>
<trans-unit id="fe71658bf131fad393a7ce618908e246617ded26" datatype="html">
@ -7479,7 +7487,7 @@
<target state="new">pursuing a buy &amp; hold strategy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">266</context>
<context context-type="linenumber">282</context>
</context-group>
</trans-unit>
<trans-unit id="2e95d2cbc69d45e5ecf3eb92c2972e8cb4ff3ec6" datatype="html">
@ -7487,7 +7495,7 @@
<target state="new">interested in getting insights of your portfolio composition</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">271</context>
<context context-type="linenumber">287</context>
</context-group>
</trans-unit>
<trans-unit id="4093027d62fd4125e36fe21bdd44475fc7499d02" datatype="html">
@ -7495,7 +7503,7 @@
<target state="new">valuing privacy and data ownership</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit id="5fae4f4ad7de60db18a5c52ccf5e7e8c7b194a9c" datatype="html">
@ -7503,7 +7511,7 @@
<target state="new">into minimalism</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">295</context>
</context-group>
</trans-unit>
<trans-unit id="18bb2c16577866572e3656986d9660d2db012565" datatype="html">
@ -7511,7 +7519,7 @@
<target state="new">caring about diversifying your financial resources</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">283</context>
<context context-type="linenumber">299</context>
</context-group>
</trans-unit>
<trans-unit id="0a6c37c2d3a8c41e7e44f020aefb1c667ac150dc" datatype="html">
@ -7519,7 +7527,7 @@
<target state="new">interested in financial independence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">287</context>
<context context-type="linenumber">303</context>
</context-group>
</trans-unit>
<trans-unit id="81fbb4e2cd3d3079d790bdddbfcc73ec3b600d22" datatype="html">
@ -7527,7 +7535,7 @@
<target state="new">saying no to spreadsheets in <x id="INTERPOLATION" equiv-text="{{ currentYear }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">291</context>
<context context-type="linenumber">307</context>
</context-group>
</trans-unit>
<trans-unit id="92cef868de56015b451e7eee26c9eaef54f41d37" datatype="html">
@ -7535,7 +7543,7 @@
<target state="new">still reading this list</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">310</context>
</context-group>
</trans-unit>
<trans-unit id="8c11c506c55700ca9883f360c52df5a432a51dcf" datatype="html">
@ -7543,7 +7551,7 @@
<target state="new">Learn more about Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">299</context>
<context context-type="linenumber">315</context>
</context-group>
</trans-unit>
<trans-unit id="ae508ae33a02ae69247d9e4d84e98b610209ef3b" datatype="html">
@ -7551,7 +7559,7 @@
<target state="new"> What our <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>users<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> are saying </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">307,309</context>
<context context-type="linenumber">323,325</context>
</context-group>
</trans-unit>
<trans-unit id="f9e4d441f5fed560c87d2f1f061eaa826ed271cd" datatype="html">
@ -7559,7 +7567,7 @@
<target state="new"> Members from around the globe are using <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;pricing&quot;&gt;"/><x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio Premium<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">337,339</context>
<context context-type="linenumber">353,355</context>
</context-group>
</trans-unit>
<trans-unit id="abc6737537d65639f566a7068d0e5dde19c9d220" datatype="html">
@ -7567,7 +7575,7 @@
<target state="new"> How does <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> work? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">352,354</context>
<context context-type="linenumber">368,370</context>
</context-group>
</trans-unit>
<trans-unit id="969974097ecdfff6cb04b4cb71efccd717da1ce8" datatype="html">
@ -7575,7 +7583,7 @@
<target state="new">Sign up anonymously*</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">361</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="ebca1c496ea9caf6acf2a7ee5c4fa2b3f5aee1fe" datatype="html">
@ -7583,7 +7591,7 @@
<target state="new"><x id="START_SMALL_TEXT" ctype="x-small" equiv-text="&lt;small&gt;"/>* no e-mail address nor credit card required<x id="CLOSE_SMALL_TEXT" ctype="x-small" equiv-text="&lt;/small&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">379</context>
</context-group>
</trans-unit>
<trans-unit id="2039f449cf4ee0c26a9211de9d057c1002293917" datatype="html">
@ -7591,7 +7599,7 @@
<target state="new"> Add any of your historical transactions </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">374,376</context>
<context context-type="linenumber">390,392</context>
</context-group>
</trans-unit>
<trans-unit id="d6a2cfef5de5fd13ceb051a8725b1414c2ad9a69" datatype="html">
@ -7599,7 +7607,7 @@
<target state="new"> Get valuable insights of your portfolio composition </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">386,388</context>
<context context-type="linenumber">402,404</context>
</context-group>
</trans-unit>
<trans-unit id="b19d6b55a61fe4b3a9594fe87d504667cae32d8e" datatype="html">
@ -7607,7 +7615,7 @@
<target state="new">Are <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>you<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> ready?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">398</context>
<context context-type="linenumber">414</context>
</context-group>
</trans-unit>
<trans-unit id="31d1cab2469b1cd9d7105900f3bf2781873282ad" datatype="html">
@ -7615,7 +7623,7 @@
<target state="new"> Join now<x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;ng-container *ngIf=&quot;hasPermissionForDemo&quot;&gt;"/> or check out the example account<x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;/ng-container &gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">399,402</context>
<context context-type="linenumber">415,418</context>
</context-group>
</trans-unit>
<trans-unit id="195d2d6475819f55cf73287f97752093b7721ade" datatype="html">
@ -7623,11 +7631,11 @@
<target state="new">Live Demo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">47</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">415</context>
<context context-type="linenumber">431</context>
</context-group>
</trans-unit>
<trans-unit id="dbe66b4824faaff93249a96c9ce23c237b446ed5" datatype="html">
@ -7635,7 +7643,7 @@
<target state="new"> Get the full picture of your personal finances across multiple platforms. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">222,225</context>
<context context-type="linenumber">238,241</context>
</context-group>
</trans-unit>
<trans-unit id="9454b3758f67cb4d178570e8bfb3e0d684e2353e" datatype="html">
@ -7643,7 +7651,7 @@
<target state="new">Get started in only 3 steps</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">355</context>
<context context-type="linenumber">371</context>
</context-group>
</trans-unit>
<trans-unit id="4656883433287439415" datatype="html">
@ -7701,6 +7709,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">13</context>
@ -7865,6 +7877,14 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.component.ts</context>
<context context-type="linenumber">25</context>
@ -8029,6 +8049,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">14</context>
@ -9414,6 +9438,42 @@
<context context-type="linenumber">325</context>
</context-group>
</trans-unit>
<trans-unit id="7db7ee6941e96fe86681e5fb785c69d66da006d7" datatype="html">
<source>(Last 24 hours)</source>
<target state="new">(Last 24 hours)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="e365d670d2eeb6a6876784db260668a2eb749044" datatype="html">
<source>(Last 30 days)</source>
<target state="new">(Last 30 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="b9e82953df4178922cea15c5a8371fa224d6bc0c" datatype="html">
<source>(Last 90 days)</source>
<target state="new">(Last 90 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit id="d81f00c85d3b507f3e3d78bfc617a2c66e028391" datatype="html">
<source>New</source>
<target state="new">New</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

File diff suppressed because it is too large

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

@ -786,7 +786,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">158</context>
<context context-type="linenumber">161</context>
</context-group>
</trans-unit>
<trans-unit id="7d6573fb998f3a1cf1356623b85850d9d10edaa9" datatype="html">
@ -814,7 +814,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">189</context>
<context context-type="linenumber">193</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.html</context>
@ -898,7 +898,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">171</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="323af13292ecc714ab3848b9dff48f923893be32" datatype="html">
@ -910,7 +910,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">185</context>
</context-group>
</trans-unit>
<trans-unit id="b0f210a3147d1b669e081dae1fcd0918fe7c3021" datatype="html">
@ -922,7 +922,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">209</context>
</context-group>
</trans-unit>
<trans-unit id="452ef1b96854fe05618303ee601f8fed3b866c9f" datatype="html">
@ -938,7 +938,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/resources-page.html</context>
@ -958,11 +958,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">228</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">292</context>
<context context-type="linenumber">297</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
@ -1078,7 +1078,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">284</context>
</context-group>
</trans-unit>
<trans-unit id="28094f38aac43d3cb6edaf98a281fe443a930b5e" datatype="html">
@ -1086,7 +1086,7 @@
<target state="translated">Eu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">141</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="90d136a4e1f551f5de5340d443e0c95e49e95e1c" datatype="html">
@ -1094,7 +1094,7 @@
<target state="translated">O meu Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">196</context>
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="6313384ccd7be95272bc2113ee9dada12af79b9b" datatype="html">
@ -1102,7 +1102,7 @@
<target state="translated">Sobre o Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">236</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
@ -1118,7 +1118,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">267</context>
<context context-type="linenumber">271</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1134,7 +1134,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">308</context>
<context context-type="linenumber">313</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-market/home-market.html</context>
@ -1150,7 +1150,7 @@
<target state="translated">Iniciar sessão</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">321</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1162,7 +1162,7 @@
<target state="translated">Começar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">333</context>
<context context-type="linenumber">338</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
@ -1306,7 +1306,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">414</context>
<context context-type="linenumber">430</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
@ -1924,6 +1924,10 @@
<trans-unit id="218afa01afa0cfc71b1a6507a3387763ecaa9332" datatype="html">
<source>per year</source>
<target state="translated">por ano</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">332</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/user-account/user-account-page.html</context>
<context context-type="linenumber">57</context>
@ -2224,6 +2228,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html</context>
<context context-type="linenumber">267</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -2798,7 +2806,7 @@
<target state="translated">Continuar com Internet Identity</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">40</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="c7eb7fc17d2f646c6c835f4da0b96f255b515cf4" datatype="html">
@ -2806,7 +2814,7 @@
<target state="translated">Continuar com Google</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="3a6e5a6aa78ca864f6542410c5dafb6334538106" datatype="html">
@ -7206,11 +7214,11 @@
<target state="new">Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">40</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
<context context-type="linenumber">62</context>
</context-group>
</trans-unit>
<trans-unit id="8c4cfd77b7b3d7917de13bec98a8a74890f95618" datatype="html">
@ -7218,7 +7226,7 @@
<target state="new">New Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="c0eb011366e597e23542be386e8bc0d53470b520" datatype="html">
@ -7226,7 +7234,7 @@
<target state="new">Users in Slack community</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">72</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="be99161cc904867871ab172df77b736d3b27dfc5" datatype="html">
@ -7234,7 +7242,7 @@
<target state="new">Contributors on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="8d3932a9eba50bc101c2b8c329e7b4ea033cde97" datatype="html">
@ -7242,11 +7250,11 @@
<target state="new">Stars on GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="512b096f732f5e05dc1c451276b7a2b1a2509acd" datatype="html">
@ -7254,11 +7262,11 @@
<target state="new">Pulls on Docker Hub</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="ed1d16219cf7cc3ad92d2d49f0c55bbafe3768b2" datatype="html">
@ -7266,7 +7274,7 @@
<target state="new">Uptime</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -7341,12 +7349,12 @@
<context context-type="linenumber">24,28</context>
</context-group>
</trans-unit>
<trans-unit id="1be07764640e49ab8b6f59b079e31d42083abf5b" datatype="html">
<trans-unit id="7b3c319feef05dcc1f487d09dd2a59eb4c50e6d6" datatype="html">
<source> Manage your wealth like a boss </source>
<target state="new"> Manage your wealth like a boss </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">4,6</context>
<context context-type="linenumber">11,13</context>
</context-group>
</trans-unit>
<trans-unit id="f251aca95a00756de48b14172b02d33f175661fc" datatype="html">
@ -7354,7 +7362,7 @@
<target state="new"> 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. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7,11</context>
<context context-type="linenumber">15,19</context>
</context-group>
</trans-unit>
<trans-unit id="50fefcca3f8b7dd5a34141329118014a8c4b7d1b" datatype="html">
@ -7362,11 +7370,11 @@
<target state="new"> Get Started </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">39,41</context>
<context context-type="linenumber">47,49</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">410,412</context>
<context context-type="linenumber">426,428</context>
</context-group>
</trans-unit>
<trans-unit id="c4b553bb0e33c675cd6a34e2e295b984f9ee8381" datatype="html">
@ -7374,7 +7382,7 @@
<target state="new"> or </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">44,46</context>
<context context-type="linenumber">52,54</context>
</context-group>
</trans-unit>
<trans-unit id="1d6f11238819cf97ea87ab54714deda567d83f5c" datatype="html">
@ -7382,7 +7390,7 @@
<target state="new">Monthly Active Users</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">75</context>
</context-group>
</trans-unit>
<trans-unit id="9c7ee452b83c7458f6ffdd49837daf95b1d5f34e" datatype="html">
@ -7390,7 +7398,7 @@
<target state="new">As seen in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="c8ef12032b654cfd51b9ae1082fde84247945e03" datatype="html">
@ -7398,7 +7406,7 @@
<target state="new"> Protect your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>assets<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. Refine your <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>personal investment strategy<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">205,208</context>
<context context-type="linenumber">221,224</context>
</context-group>
</trans-unit>
<trans-unit id="9dd7364c5dcf1b010bfa80e824ba80eb67cc2b57" datatype="html">
@ -7406,7 +7414,7 @@
<target state="new"> Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">209,212</context>
<context context-type="linenumber">225,228</context>
</context-group>
</trans-unit>
<trans-unit id="70a1ed4b69a5a2cefa86b16c94ff2799a6566b4f" datatype="html">
@ -7414,7 +7422,7 @@
<target state="new">360° View</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="e0840e61fd65397c9dd8c0aa35ec19778c79b73d" datatype="html">
@ -7422,7 +7430,7 @@
<target state="new">Web3 Ready</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">231</context>
<context context-type="linenumber">247</context>
</context-group>
</trans-unit>
<trans-unit id="0a82bf107b3693ed6bdba551a97ce92494921513" datatype="html">
@ -7430,7 +7438,7 @@
<target state="new"> Use Ghostfolio anonymously and own your financial data. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">233,235</context>
<context context-type="linenumber">249,251</context>
</context-group>
</trans-unit>
<trans-unit id="ebc1c2623f53ce48c714e00161a2f31f732c815b" datatype="html">
@ -7438,7 +7446,7 @@
<target state="new">Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">241</context>
<context context-type="linenumber">257</context>
</context-group>
</trans-unit>
<trans-unit id="3756fe4769648222e9a3143d6a140e55afd7424b" datatype="html">
@ -7446,7 +7454,7 @@
<target state="new"> Benefit from continuous improvements through a strong community. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">243,245</context>
<context context-type="linenumber">259,261</context>
</context-group>
</trans-unit>
<trans-unit id="e7360ce972bb10156736d042a15c6c939fea123d" datatype="html">
@ -7454,7 +7462,7 @@
<target state="new">Why <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">252</context>
<context context-type="linenumber">268</context>
</context-group>
</trans-unit>
<trans-unit id="b2466b29949bb745c1f96f2d82e5dab9061f8efe" datatype="html">
@ -7462,7 +7470,7 @@
<target state="new"> Ghostfolio is for you if you are... </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">253,255</context>
<context context-type="linenumber">269,271</context>
</context-group>
</trans-unit>
<trans-unit id="2fe7c768f92932a3a6c9b460dd5d72e53deb9cfe" datatype="html">
@ -7470,7 +7478,7 @@
<target state="new">trading stocks, ETFs or cryptocurrencies on multiple platforms</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">260,261</context>
<context context-type="linenumber">276,277</context>
</context-group>
</trans-unit>
<trans-unit id="fe71658bf131fad393a7ce618908e246617ded26" datatype="html">
@ -7478,7 +7486,7 @@
<target state="new">pursuing a buy &amp; hold strategy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">266</context>
<context context-type="linenumber">282</context>
</context-group>
</trans-unit>
<trans-unit id="2e95d2cbc69d45e5ecf3eb92c2972e8cb4ff3ec6" datatype="html">
@ -7486,7 +7494,7 @@
<target state="new">interested in getting insights of your portfolio composition</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">271</context>
<context context-type="linenumber">287</context>
</context-group>
</trans-unit>
<trans-unit id="4093027d62fd4125e36fe21bdd44475fc7499d02" datatype="html">
@ -7494,7 +7502,7 @@
<target state="new">valuing privacy and data ownership</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">292</context>
</context-group>
</trans-unit>
<trans-unit id="5fae4f4ad7de60db18a5c52ccf5e7e8c7b194a9c" datatype="html">
@ -7502,7 +7510,7 @@
<target state="new">into minimalism</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">295</context>
</context-group>
</trans-unit>
<trans-unit id="18bb2c16577866572e3656986d9660d2db012565" datatype="html">
@ -7510,7 +7518,7 @@
<target state="new">caring about diversifying your financial resources</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">283</context>
<context context-type="linenumber">299</context>
</context-group>
</trans-unit>
<trans-unit id="0a6c37c2d3a8c41e7e44f020aefb1c667ac150dc" datatype="html">
@ -7518,7 +7526,7 @@
<target state="new">interested in financial independence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">287</context>
<context context-type="linenumber">303</context>
</context-group>
</trans-unit>
<trans-unit id="81fbb4e2cd3d3079d790bdddbfcc73ec3b600d22" datatype="html">
@ -7526,7 +7534,7 @@
<target state="new">saying no to spreadsheets in <x id="INTERPOLATION" equiv-text="{{ currentYear }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">291</context>
<context context-type="linenumber">307</context>
</context-group>
</trans-unit>
<trans-unit id="92cef868de56015b451e7eee26c9eaef54f41d37" datatype="html">
@ -7534,7 +7542,7 @@
<target state="new">still reading this list</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">310</context>
</context-group>
</trans-unit>
<trans-unit id="8c11c506c55700ca9883f360c52df5a432a51dcf" datatype="html">
@ -7542,7 +7550,7 @@
<target state="new">Learn more about Ghostfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">299</context>
<context context-type="linenumber">315</context>
</context-group>
</trans-unit>
<trans-unit id="ae508ae33a02ae69247d9e4d84e98b610209ef3b" datatype="html">
@ -7550,7 +7558,7 @@
<target state="new"> What our <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>users<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> are saying </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">307,309</context>
<context context-type="linenumber">323,325</context>
</context-group>
</trans-unit>
<trans-unit id="f9e4d441f5fed560c87d2f1f061eaa826ed271cd" datatype="html">
@ -7558,7 +7566,7 @@
<target state="new"> Members from around the globe are using <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;pricing&quot;&gt;"/><x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio Premium<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">337,339</context>
<context context-type="linenumber">353,355</context>
</context-group>
</trans-unit>
<trans-unit id="abc6737537d65639f566a7068d0e5dde19c9d220" datatype="html">
@ -7566,7 +7574,7 @@
<target state="new"> How does <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Ghostfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> work? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">352,354</context>
<context context-type="linenumber">368,370</context>
</context-group>
</trans-unit>
<trans-unit id="969974097ecdfff6cb04b4cb71efccd717da1ce8" datatype="html">
@ -7574,7 +7582,7 @@
<target state="new">Sign up anonymously*</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">361</context>
<context context-type="linenumber">377</context>
</context-group>
</trans-unit>
<trans-unit id="ebca1c496ea9caf6acf2a7ee5c4fa2b3f5aee1fe" datatype="html">
@ -7582,7 +7590,7 @@
<target state="new"><x id="START_SMALL_TEXT" ctype="x-small" equiv-text="&lt;small&gt;"/>* no e-mail address nor credit card required<x id="CLOSE_SMALL_TEXT" ctype="x-small" equiv-text="&lt;/small&gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">379</context>
</context-group>
</trans-unit>
<trans-unit id="2039f449cf4ee0c26a9211de9d057c1002293917" datatype="html">
@ -7590,7 +7598,7 @@
<target state="new"> Add any of your historical transactions </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">374,376</context>
<context context-type="linenumber">390,392</context>
</context-group>
</trans-unit>
<trans-unit id="d6a2cfef5de5fd13ceb051a8725b1414c2ad9a69" datatype="html">
@ -7598,7 +7606,7 @@
<target state="new"> Get valuable insights of your portfolio composition </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">386,388</context>
<context context-type="linenumber">402,404</context>
</context-group>
</trans-unit>
<trans-unit id="b19d6b55a61fe4b3a9594fe87d504667cae32d8e" datatype="html">
@ -7606,7 +7614,7 @@
<target state="new">Are <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>you<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> ready?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">398</context>
<context context-type="linenumber">414</context>
</context-group>
</trans-unit>
<trans-unit id="31d1cab2469b1cd9d7105900f3bf2781873282ad" datatype="html">
@ -7614,7 +7622,7 @@
<target state="new"> Join now<x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;ng-container *ngIf=&quot;hasPermissionForDemo&quot;&gt;"/> or check out the example account<x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="&lt;/ng-container &gt;"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">399,402</context>
<context context-type="linenumber">415,418</context>
</context-group>
</trans-unit>
<trans-unit id="195d2d6475819f55cf73287f97752093b7721ade" datatype="html">
@ -7622,11 +7630,11 @@
<target state="new">Live Demo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">47</context>
<context context-type="linenumber">55</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">415</context>
<context context-type="linenumber">431</context>
</context-group>
</trans-unit>
<trans-unit id="dbe66b4824faaff93249a96c9ce23c237b446ed5" datatype="html">
@ -7634,7 +7642,7 @@
<target state="new"> Get the full picture of your personal finances across multiple platforms. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">222,225</context>
<context context-type="linenumber">238,241</context>
</context-group>
</trans-unit>
<trans-unit id="9454b3758f67cb4d178570e8bfb3e0d684e2353e" datatype="html">
@ -7642,7 +7650,7 @@
<target state="new">Get started in only 3 steps</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">355</context>
<context context-type="linenumber">371</context>
</context-group>
</trans-unit>
<trans-unit id="4656883433287439415" datatype="html">
@ -7700,6 +7708,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">13</context>
@ -7864,6 +7876,14 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.component.ts</context>
<context context-type="linenumber">25</context>
@ -8028,6 +8048,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts</context>
<context context-type="linenumber">13</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/faq-page.component.ts</context>
<context context-type="linenumber">14</context>
@ -9413,6 +9437,42 @@
<context context-type="linenumber">325</context>
</context-group>
</trans-unit>
<trans-unit id="7db7ee6941e96fe86681e5fb785c69d66da006d7" datatype="html">
<source>(Last 24 hours)</source>
<target state="new">(Last 24 hours)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="e365d670d2eeb6a6876784db260668a2eb749044" datatype="html">
<source>(Last 30 days)</source>
<target state="new">(Last 30 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="b9e82953df4178922cea15c5a8371fa224d6bc0c" datatype="html">
<source>(Last 90 days)</source>
<target state="new">(Last 90 days)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/open/open-page.html</context>
<context context-type="linenumber">127</context>
</context-group>
</trans-unit>
<trans-unit id="d81f00c85d3b507f3e3d78bfc617a2c66e028391" datatype="html">
<source>New</source>
<target state="new">New</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/landing/landing-page.html</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

File diff suppressed because it is too large

8
docker/docker-compose.build.yml

@ -1,4 +1,4 @@
version: '3.7'
version: '3.9'
services:
ghostfolio:
build: ../
@ -7,7 +7,7 @@ services:
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer
NODE_ENV: production
REDIS_HOST: 'redis'
REDIS_HOST: redis
REDIS_PASSWORD: ${REDIS_PASSWORD}
ports:
- 3333:3333
@ -16,7 +16,6 @@ services:
condition: service_healthy
redis:
condition: service_healthy
postgres:
image: postgres:12
env_file:
@ -28,9 +27,8 @@ services:
retries: 5
volumes:
- postgres:/var/lib/postgresql/data
redis:
image: 'redis:alpine'
image: redis:alpine
healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
interval: 10s

5
docker/docker-compose.dev.yml

@ -1,4 +1,4 @@
version: '3.7'
version: '3.9'
services:
postgres:
image: postgres:12
@ -10,9 +10,8 @@ services:
- 5432:5432
volumes:
- postgres:/var/lib/postgresql/data
redis:
image: 'redis:alpine'
image: redis:alpine
container_name: redis
restart: unless-stopped
ports:

8
docker/docker-compose.yml

@ -1,4 +1,4 @@
version: '3.7'
version: '3.9'
services:
ghostfolio:
image: ghostfolio/ghostfolio:latest
@ -7,7 +7,7 @@ services:
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer
NODE_ENV: production
REDIS_HOST: 'redis'
REDIS_HOST: redis
REDIS_PASSWORD: ${REDIS_PASSWORD}
ports:
- 3333:3333
@ -16,7 +16,6 @@ services:
condition: service_healthy
redis:
condition: service_healthy
postgres:
image: postgres:12
env_file:
@ -28,9 +27,8 @@ services:
retries: 5
volumes:
- postgres:/var/lib/postgresql/data
redis:
image: 'redis:alpine'
image: redis:alpine
healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
interval: 10s

4
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "1.305.0",
"version": "2.0.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -129,7 +129,7 @@
"svgmap": "2.6.0",
"twitter-api-v2": "1.14.2",
"uuid": "9.0.0",
"yahoo-finance2": "2.4.4",
"yahoo-finance2": "2.5.0",
"zone.js": "0.13.1"
},
"devDependencies": {

8
yarn.lock

@ -19035,10 +19035,10 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yahoo-finance2@2.4.4:
version "2.4.4"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.4.tgz#3149a4f2e6fab04430aabe7758bfbc70f240503e"
integrity sha512-dL8bz3ubmPYRHd2M85hyL8kcVVlvpTGdzqeuewMH6X1Ej/lo4/2qlbAqZVT4qlcFeuEdlEIZ1N/mFp6SFnW8Uw==
yahoo-finance2@2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.5.0.tgz#847834b33d24dc8ce96357401aba7dae1bcfda9f"
integrity sha512-YTniHzTx17lrs7tUonFZMWvY0dF4UJSrPkrTNMqNrb+la7Nde/5KY7mQFf+8VdXhngPup2V9ex27M2WK3ADtbw==
dependencies:
"@types/tough-cookie" "^4.0.2"
ajv "8.10.0"

Loading…
Cancel
Save