diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49d5a1639..ffa2265b6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,13 +10,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Set up the language localization for the static portfolio analysis rule: _Account Cluster Risks_ (Single Account)
+- Included the admin control panel in the quick links of the assistant
### Changed
- Adapted the options of the date range selector in the assistant dynamically based on the user’s first activity
+- Switched the data provider service to `OnModuleInit`, ensuring (currency) quotes are fetched only once
- Migrated the `@ghostfolio/ui/assistant` component to control flow
- Migrated the `@ghostfolio/ui/value` component to control flow
- Improved the language localization for Chinese (`zh`)
+- Improved the language localization for Español (`es`)
- Improved the language localization for Portuguese (`pt`)
## 2.171.0 - 2025-06-15
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 51de2ad25..31b0507bb 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -30,7 +30,13 @@ Run `npm run start:server`
### Start Client
-Run `npm run start:client` and open https://localhost:4200/en in your browser
+#### English (Default)
+
+Run `npm run start:client` and open https://localhost:4200/en in your browser.
+
+#### Other Languages
+
+To start the client in a different language, such as German (`de`), adapt the `start:client` script in the `package.json` file by changing `--configuration=development-en` to `--configuration=development-de`. Then, run `npm run start:client` and open https://localhost:4200/de in your browser.
### Start _Storybook_
diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts
index 348935101..606da5b88 100644
--- a/apps/api/src/services/data-provider/data-provider.service.ts
+++ b/apps/api/src/services/data-provider/data-provider.service.ts
@@ -29,7 +29,7 @@ import {
import { hasRole } from '@ghostfolio/common/permissions';
import type { Granularity, UserWithSettings } from '@ghostfolio/common/types';
-import { Inject, Injectable, Logger } from '@nestjs/common';
+import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { DataSource, MarketData, SymbolProfile } from '@prisma/client';
import { Big } from 'big.js';
import { eachDayOfInterval, format, isBefore, isValid } from 'date-fns';
@@ -37,7 +37,7 @@ import { groupBy, isEmpty, isNumber, uniqWith } from 'lodash';
import ms from 'ms';
@Injectable()
-export class DataProviderService {
+export class DataProviderService implements OnModuleInit {
private dataProviderMapping: { [dataProviderName: string]: string };
public constructor(
@@ -48,11 +48,9 @@ export class DataProviderService {
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService,
private readonly redisCacheService: RedisCacheService
- ) {
- this.initialize();
- }
+ ) {}
- public async initialize() {
+ public async onModuleInit() {
this.dataProviderMapping =
((await this.propertyService.getByKey(PROPERTY_DATA_SOURCE_MAPPING)) as {
[dataProviderName: string]: string;
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 2d59d3a6f..a623b4551 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -6,7 +6,7 @@
Característiques
libs/common/src/lib/routes/routes.ts
- 232
+ 237
@@ -14,7 +14,7 @@
Internacionalització
libs/common/src/lib/routes/routes.ts
- 99
+ 104
@@ -26,11 +26,11 @@
libs/common/src/lib/routes/routes.ts
- 66
+ 71
libs/common/src/lib/routes/routes.ts
- 137
+ 142
@@ -375,31 +375,31 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 156
+ 161
libs/common/src/lib/routes/routes.ts
- 157
+ 162
libs/common/src/lib/routes/routes.ts
- 162
+ 167
libs/common/src/lib/routes/routes.ts
- 170
+ 175
libs/common/src/lib/routes/routes.ts
- 177
+ 182
libs/common/src/lib/routes/routes.ts
- 183
+ 188
libs/common/src/lib/routes/routes.ts
- 191
+ 196
@@ -408,11 +408,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 168
+ 173
libs/common/src/lib/routes/routes.ts
- 171
+ 176
@@ -421,11 +421,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 181
+ 186
libs/common/src/lib/routes/routes.ts
- 184
+ 189
@@ -434,19 +434,19 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 210
+ 215
libs/common/src/lib/routes/routes.ts
- 211
+ 216
libs/common/src/lib/routes/routes.ts
- 215
+ 220
libs/common/src/lib/routes/routes.ts
- 221
+ 226
@@ -455,11 +455,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 230
+ 235
libs/common/src/lib/routes/routes.ts
- 231
+ 236
@@ -468,19 +468,19 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 235
+ 240
libs/common/src/lib/routes/routes.ts
- 236
+ 241
libs/common/src/lib/routes/routes.ts
- 279
+ 284
libs/common/src/lib/routes/routes.ts
- 282
+ 287
@@ -489,11 +489,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 245
+ 250
libs/common/src/lib/routes/routes.ts
- 246
+ 251
@@ -502,11 +502,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 254
+ 259
libs/common/src/lib/routes/routes.ts
- 255
+ 260
@@ -515,27 +515,27 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 259
+ 264
libs/common/src/lib/routes/routes.ts
- 260
+ 265
libs/common/src/lib/routes/routes.ts
- 265
+ 270
libs/common/src/lib/routes/routes.ts
- 273
+ 278
libs/common/src/lib/routes/routes.ts
- 281
+ 286
libs/common/src/lib/routes/routes.ts
- 289
+ 294
@@ -2039,7 +2039,7 @@
libs/common/src/lib/routes/routes.ts
- 131
+ 136
@@ -2899,7 +2899,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 338
+ 339
@@ -2911,7 +2911,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 350
+ 351
@@ -2923,7 +2923,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 360
+ 361
@@ -2935,7 +2935,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 386
@@ -2947,7 +2947,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 391
+ 392
@@ -3347,7 +3347,7 @@
libs/common/src/lib/routes/routes.ts
- 197
+ 202
@@ -3355,7 +3355,7 @@
Registre de canvis
libs/common/src/lib/routes/routes.ts
- 165
+ 170
@@ -3363,7 +3363,7 @@
llicència
libs/common/src/lib/routes/routes.ts
- 173
+ 178
@@ -3371,7 +3371,7 @@
Política de privadesa
libs/common/src/lib/routes/routes.ts
- 186
+ 191
@@ -3403,7 +3403,7 @@
Comptes
libs/common/src/lib/routes/routes.ts
- 54
+ 59
@@ -3467,7 +3467,7 @@
Control d’administració
libs/common/src/lib/routes/routes.ts
- 49
+ 54
@@ -3475,7 +3475,7 @@
Cua de treball
libs/common/src/lib/routes/routes.ts
- 31
+ 36
@@ -3483,7 +3483,7 @@
Dades de mercat
libs/common/src/lib/routes/routes.ts
- 36
+ 41
@@ -3491,11 +3491,11 @@
Configuració
libs/common/src/lib/routes/routes.ts
- 21
+ 24
libs/common/src/lib/routes/routes.ts
- 41
+ 46
@@ -3503,7 +3503,7 @@
Usuaris
libs/common/src/lib/routes/routes.ts
- 46
+ 51
@@ -3519,11 +3519,11 @@
libs/common/src/lib/routes/routes.ts
- 93
+ 98
libs/common/src/lib/routes/routes.ts
- 150
+ 155
@@ -3531,7 +3531,7 @@
Bloc
libs/common/src/lib/routes/routes.ts
- 202
+ 207
@@ -3559,7 +3559,7 @@
libs/common/src/lib/routes/routes.ts
- 227
+ 232
@@ -3579,7 +3579,7 @@
libs/common/src/lib/routes/routes.ts
- 216
+ 221
@@ -3591,7 +3591,7 @@
libs/common/src/lib/routes/routes.ts
- 224
+ 229
@@ -3600,11 +3600,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 219
+ 224
libs/common/src/lib/routes/routes.ts
- 222
+ 227
@@ -3752,11 +3752,11 @@
Explotacions
libs/common/src/lib/routes/routes.ts
- 75
+ 80
libs/common/src/lib/routes/routes.ts
- 147
+ 152
@@ -3764,7 +3764,7 @@
Resum
libs/common/src/lib/routes/routes.ts
- 85
+ 90
@@ -3776,15 +3776,15 @@
libs/common/src/lib/routes/routes.ts
- 80
+ 85
libs/common/src/lib/routes/routes.ts
- 237
+ 242
libs/common/src/lib/routes/routes.ts
- 284
+ 289
@@ -4232,7 +4232,7 @@
Activitats
libs/common/src/lib/routes/routes.ts
- 108
+ 113
@@ -4472,7 +4472,7 @@
libs/common/src/lib/routes/routes.ts
- 113
+ 118
@@ -4660,7 +4660,7 @@
Anàlisi
libs/common/src/lib/routes/routes.ts
- 118
+ 123
@@ -4876,7 +4876,7 @@
libs/common/src/lib/routes/routes.ts
- 247
+ 252
@@ -5100,7 +5100,7 @@
Registration
libs/common/src/lib/routes/routes.ts
- 256
+ 261
@@ -5132,7 +5132,7 @@
Personal Finance Tools
libs/common/src/lib/routes/routes.ts
- 298
+ 303
@@ -5141,7 +5141,7 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 294
+ 299
@@ -5445,7 +5445,7 @@
Resources
libs/common/src/lib/routes/routes.ts
- 301
+ 306
@@ -5469,7 +5469,7 @@
Membership
libs/common/src/lib/routes/routes.ts
- 18
+ 21
@@ -5477,7 +5477,7 @@
Access
libs/common/src/lib/routes/routes.ts
- 13
+ 16
@@ -5621,7 +5621,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 342
+ 343
@@ -5629,7 +5629,7 @@
WTD
libs/ui/src/lib/assistant/assistant.component.ts
- 342
+ 343
@@ -5637,7 +5637,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 346
+ 347
@@ -5645,7 +5645,7 @@
MTD
libs/ui/src/lib/assistant/assistant.component.ts
- 346
+ 347
@@ -5653,7 +5653,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 350
+ 351
@@ -5661,7 +5661,7 @@
year
libs/ui/src/lib/assistant/assistant.component.ts
- 360
+ 361
@@ -5669,7 +5669,7 @@
years
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 386
@@ -6925,7 +6925,7 @@
libs/common/src/lib/routes/routes.ts
- 268
+ 273
@@ -6937,7 +6937,7 @@
libs/common/src/lib/routes/routes.ts
- 276
+ 281
@@ -6946,11 +6946,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 271
+ 276
libs/common/src/lib/routes/routes.ts
- 274
+ 279
@@ -6959,11 +6959,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 263
+ 268
libs/common/src/lib/routes/routes.ts
- 266
+ 271
@@ -7424,11 +7424,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 189
+ 194
libs/common/src/lib/routes/routes.ts
- 192
+ 197
@@ -7436,7 +7436,7 @@
Terms of Service
libs/common/src/lib/routes/routes.ts
- 194
+ 199
@@ -7560,7 +7560,7 @@
Watchlist
libs/common/src/lib/routes/routes.ts
- 90
+ 95
@@ -7601,11 +7601,11 @@
kebab-case
libs/common/src/lib/routes/routes.ts
- 160
+ 165
libs/common/src/lib/routes/routes.ts
- 163
+ 168
@@ -7685,7 +7685,7 @@
Find holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 153
+ 154
@@ -7709,7 +7709,7 @@
Live Demo
libs/common/src/lib/routes/routes.ts
- 207
+ 212
@@ -7717,7 +7717,7 @@
Open Source Alternative to
libs/common/src/lib/routes/routes.ts
- 295
+ 300