Browse Source

Feature/set up localization for static portfolio analysis rules: Economic Market Cluster Risks (#5169)

* Set up localization for static portfolio analysis rules: Economic Market Cluster Risks

* Update changelog
pull/5182/head
Tobias Kugel 5 days ago
committed by GitHub
parent
commit
44ea3cba8d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      CHANGELOG.md
  2. 8
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 4
      apps/api/src/app/user/user.service.ts
  4. 58
      apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts
  5. 58
      apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts
  6. 36
      apps/client/src/app/pages/i18n/i18n-page.html

5
CHANGELOG.md

@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Set up the language localization for the static portfolio analysis rule: _Economic Market Cluster Risks_ (Developed Markets)
- Set up the language localization for the static portfolio analysis rule: _Economic Market Cluster Risks_ (Emerging Markets)
### Changed ### Changed
- Improved the platform icon in the create or update platform dialog of the admin control - Improved the platform icon in the create or update platform dialog of the admin control

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

@ -1223,13 +1223,17 @@ export class PortfolioService {
[ [
new EconomicMarketClusterRiskDevelopedMarkets( new EconomicMarketClusterRiskDevelopedMarkets(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService,
marketsTotalInBaseCurrency, marketsTotalInBaseCurrency,
markets.developedMarkets.valueInBaseCurrency markets.developedMarkets.valueInBaseCurrency,
userSettings.language
), ),
new EconomicMarketClusterRiskEmergingMarkets( new EconomicMarketClusterRiskEmergingMarkets(
this.exchangeRateDataService, this.exchangeRateDataService,
this.i18nService,
marketsTotalInBaseCurrency, marketsTotalInBaseCurrency,
markets.emergingMarkets.valueInBaseCurrency markets.emergingMarkets.valueInBaseCurrency,
userSettings.language
) )
], ],
userSettings userSettings

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

@ -300,12 +300,16 @@ export class UserService {
).getSettings(user.settings.settings), ).getSettings(user.settings.settings),
EconomicMarketClusterRiskDevelopedMarkets: EconomicMarketClusterRiskDevelopedMarkets:
new EconomicMarketClusterRiskDevelopedMarkets( new EconomicMarketClusterRiskDevelopedMarkets(
undefined,
undefined,
undefined, undefined,
undefined, undefined,
undefined undefined
).getSettings(user.settings.settings), ).getSettings(user.settings.settings),
EconomicMarketClusterRiskEmergingMarkets: EconomicMarketClusterRiskEmergingMarkets:
new EconomicMarketClusterRiskEmergingMarkets( new EconomicMarketClusterRiskEmergingMarkets(
undefined,
undefined,
undefined, undefined,
undefined, undefined,
undefined undefined

58
apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts

@ -1,6 +1,7 @@
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { Rule } from '@ghostfolio/api/models/rule'; import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { UserSettings } from '@ghostfolio/common/interfaces'; import { UserSettings } from '@ghostfolio/common/interfaces';
export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> { export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> {
@ -9,10 +10,13 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> {
public constructor( public constructor(
protected exchangeRateDataService: ExchangeRateDataService, protected exchangeRateDataService: ExchangeRateDataService,
private i18nService: I18nService,
currentValueInBaseCurrency: number, currentValueInBaseCurrency: number,
developedMarketsValueInBaseCurrency: number developedMarketsValueInBaseCurrency: number,
languageCode: string
) { ) {
super(exchangeRateDataService, { super(exchangeRateDataService, {
languageCode,
key: EconomicMarketClusterRiskDevelopedMarkets.name key: EconomicMarketClusterRiskDevelopedMarkets.name
}); });
@ -29,32 +33,55 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> {
if (developedMarketsValueRatio > ruleSettings.thresholdMax) { if (developedMarketsValueRatio > ruleSettings.thresholdMax) {
return { return {
evaluation: `The developed markets contribution of your current investment (${(developedMarketsValueRatio * 100).toPrecision(3)}%) exceeds ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMax * 100 id: 'rule.economicMarketClusterRiskDevelopedMarkets.false.max',
).toPrecision(3)}%`, languageCode: this.getLanguageCode(),
placeholders: {
developedMarketsValueRatio: (
developedMarketsValueRatio * 100
).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: false value: false
}; };
} else if (developedMarketsValueRatio < ruleSettings.thresholdMin) { } else if (developedMarketsValueRatio < ruleSettings.thresholdMin) {
return { return {
evaluation: `The developed markets contribution of your current investment (${(developedMarketsValueRatio * 100).toPrecision(3)}%) is below ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMin * 100 id: 'rule.economicMarketClusterRiskDevelopedMarkets.false.min',
).toPrecision(3)}%`, languageCode: this.getLanguageCode(),
placeholders: {
developedMarketsValueRatio: (
developedMarketsValueRatio * 100
).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: false value: false
}; };
} }
return { return {
evaluation: `The developed markets contribution of your current investment (${(developedMarketsValueRatio * 100).toPrecision(3)}%) is within the range of ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMin * 100 id: 'rule.economicMarketClusterRiskDevelopedMarkets.true',
).toPrecision( languageCode: this.getLanguageCode(),
3 placeholders: {
)}% and ${(ruleSettings.thresholdMax * 100).toPrecision(3)}%`, developedMarketsValueRatio: (
developedMarketsValueRatio * 100
).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: true value: true
}; };
} }
public getCategoryName() { public getCategoryName() {
return 'Economic Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation return this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRisk.category',
languageCode: this.getLanguageCode()
});
} }
public getConfiguration() { public getConfiguration() {
@ -71,7 +98,10 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> {
} }
public getName() { public getName() {
return 'Developed Markets'; return this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRiskDevelopedMarkets',
languageCode: this.getLanguageCode()
});
} }
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {

58
apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts

@ -1,6 +1,7 @@
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { Rule } from '@ghostfolio/api/models/rule'; import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { UserSettings } from '@ghostfolio/common/interfaces'; import { UserSettings } from '@ghostfolio/common/interfaces';
export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> { export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> {
@ -9,10 +10,13 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> {
public constructor( public constructor(
protected exchangeRateDataService: ExchangeRateDataService, protected exchangeRateDataService: ExchangeRateDataService,
private i18nService: I18nService,
currentValueInBaseCurrency: number, currentValueInBaseCurrency: number,
emergingMarketsValueInBaseCurrency: number emergingMarketsValueInBaseCurrency: number,
languageCode: string
) { ) {
super(exchangeRateDataService, { super(exchangeRateDataService, {
languageCode,
key: EconomicMarketClusterRiskEmergingMarkets.name key: EconomicMarketClusterRiskEmergingMarkets.name
}); });
@ -29,32 +33,55 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> {
if (emergingMarketsValueRatio > ruleSettings.thresholdMax) { if (emergingMarketsValueRatio > ruleSettings.thresholdMax) {
return { return {
evaluation: `The emerging markets contribution of your current investment (${(emergingMarketsValueRatio * 100).toPrecision(3)}%) exceeds ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMax * 100 id: 'rule.economicMarketClusterRiskEmergingMarkets.false.max',
).toPrecision(3)}%`, languageCode: this.getLanguageCode(),
placeholders: {
emergingMarketsValueRatio: (
emergingMarketsValueRatio * 100
).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: false value: false
}; };
} else if (emergingMarketsValueRatio < ruleSettings.thresholdMin) { } else if (emergingMarketsValueRatio < ruleSettings.thresholdMin) {
return { return {
evaluation: `The emerging markets contribution of your current investment (${(emergingMarketsValueRatio * 100).toPrecision(3)}%) is below ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMin * 100 id: 'rule.economicMarketClusterRiskEmergingMarkets.false.min',
).toPrecision(3)}%`, languageCode: this.getLanguageCode(),
placeholders: {
emergingMarketsValueRatio: (
emergingMarketsValueRatio * 100
).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3)
}
}),
value: false value: false
}; };
} }
return { return {
evaluation: `The emerging markets contribution of your current investment (${(emergingMarketsValueRatio * 100).toPrecision(3)}%) is within the range of ${( evaluation: this.i18nService.getTranslation({
ruleSettings.thresholdMin * 100 id: 'rule.economicMarketClusterRiskEmergingMarkets.true',
).toPrecision( languageCode: this.getLanguageCode(),
3 placeholders: {
)}% and ${(ruleSettings.thresholdMax * 100).toPrecision(3)}%`, emergingMarketsValueRatio: (
emergingMarketsValueRatio * 100
).toPrecision(3),
thresholdMin: (ruleSettings.thresholdMin * 100).toPrecision(3),
thresholdMax: (ruleSettings.thresholdMax * 100).toPrecision(3)
}
}),
value: true value: true
}; };
} }
public getCategoryName() { public getCategoryName() {
return 'Economic Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation return this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRisk.category',
languageCode: this.getLanguageCode()
});
} }
public getConfiguration() { public getConfiguration() {
@ -71,7 +98,10 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> {
} }
public getName() { public getName() {
return 'Emerging Markets'; return this.i18nService.getTranslation({
id: 'rule.economicMarketClusterRiskEmergingMarkets',
languageCode: this.getLanguageCode()
});
} }
public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings {

36
apps/client/src/app/pages/i18n/i18n-page.html

@ -86,6 +86,42 @@
<li i18n="@@rule.economicMarketClusterRisk.category"> <li i18n="@@rule.economicMarketClusterRisk.category">
Economic Market Cluster Risks Economic Market Cluster Risks
</li> </li>
<li i18n="@@rule.economicMarketClusterRiskDevelopedMarkets">
Developed Markets
</li>
<li i18n="@@rule.economicMarketClusterRiskDevelopedMarkets.false.max">
The developed markets contribution of your current investment
($&#123;developedMarketsValueRatio&#125;%) exceeds
$&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.economicMarketClusterRiskDevelopedMarkets.false.min">
The developed markets contribution of your current investment
($&#123;developedMarketsValueRatio&#125;%) is below
$&#123;thresholdMin&#125;%
</li>
<li i18n="@@rule.economicMarketClusterRiskDevelopedMarkets.true">
The developed markets contribution of your current investment
($&#123;developedMarketsValueRatio&#125;%) is within the range of
$&#123;thresholdMin&#125;% and $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.economicMarketClusterRiskEmergingMarkets">
Emerging Markets
</li>
<li i18n="@@rule.economicMarketClusterRiskEmergingMarkets.false.max">
The emerging markets contribution of your current investment
($&#123;emergingMarketsValueRatio&#125;%) exceeds
$&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.economicMarketClusterRiskEmergingMarkets.false.min">
The emerging markets contribution of your current investment
($&#123;emergingMarketsValueRatio&#125;%) is below
$&#123;thresholdMin&#125;%
</li>
<li i18n="@@rule.economicMarketClusterRiskEmergingMarkets.true">
The emerging markets contribution of your current investment
($&#123;emergingMarketsValueRatio&#125;%) is within the range of
$&#123;thresholdMin&#125;% and $&#123;thresholdMax&#125;%
</li>
<li i18n="@@rule.emergencyFund.category">Emergency Fund</li> <li i18n="@@rule.emergencyFund.category">Emergency Fund</li>
<li i18n="@@rule.emergencyFundSetup">Set up</li> <li i18n="@@rule.emergencyFundSetup">Set up</li>
<li i18n="@@rule.emergencyFundSetup.false"> <li i18n="@@rule.emergencyFundSetup.false">

Loading…
Cancel
Save