diff --git a/apps/api/src/app/sitemap/sitemap.controller.ts b/apps/api/src/app/sitemap/sitemap.controller.ts index 5f051f468..ea21906ef 100644 --- a/apps/api/src/app/sitemap/sitemap.controller.ts +++ b/apps/api/src/app/sitemap/sitemap.controller.ts @@ -1,9 +1,10 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DATE_FORMAT, getYesterday, interpolate } from '@ghostfolio/common/helper'; -import { products } from '@ghostfolio/common/personal-finance-tools'; +import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { Controller, Get, Res, VERSION_NEUTRAL, Version } from '@nestjs/common'; import { format } from 'date-fns'; @@ -15,7 +16,9 @@ import * as path from 'path'; export class SitemapController { public sitemapXml = ''; - public constructor() { + public constructor( + private readonly configurationService: ConfigurationService + ) { try { this.sitemapXml = fs.readFileSync( path.join(__dirname, 'assets', 'sitemap.xml'), @@ -33,28 +36,44 @@ export class SitemapController { response.send( interpolate(this.sitemapXml, { currentDate, - personalFinanceTools: products - .map(({ alias, key }) => { - return [ - '', - ` https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '' - ].join('\n'); - }) - .join('\n') + personalFinanceTools: this.configurationService.get( + 'ENABLE_FEATURE_SUBSCRIPTION' + ) + ? personalFinanceTools + .map(({ alias, key }) => { + return [ + '', + ` https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/es/recursos/personal-finance-tools/alternativa-de-software-libre-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/fr/ressources/personal-finance-tools/alternative-open-source-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/pt/recursos/personal-finance-tools/alternativa-de-software-livre-ao-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '' + ].join('\n'); + }) + .join('\n') + : '' }) ); } diff --git a/apps/api/src/app/sitemap/sitemap.module.ts b/apps/api/src/app/sitemap/sitemap.module.ts index e04e3f6b3..d1059d408 100644 --- a/apps/api/src/app/sitemap/sitemap.module.ts +++ b/apps/api/src/app/sitemap/sitemap.module.ts @@ -1,8 +1,11 @@ +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; + import { Module } from '@nestjs/common'; import { SitemapController } from './sitemap.controller'; @Module({ - controllers: [SitemapController] + controllers: [SitemapController], + imports: [ConfigurationModule] }) export class SitemapModule {} diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index 44a924248..7510b180e 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -238,6 +238,10 @@ https://ghostfol.io/es/recursos ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/es/recursos/personal-finance-tools + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/es/registro ${currentDate}T00:00:00+00:00 @@ -316,6 +320,10 @@ https://ghostfol.io/fr/ressources ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/fr/ressources/personal-finance-tools + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/it ${currentDate}T00:00:00+00:00 @@ -470,6 +478,10 @@ https://ghostfol.io/pt/recursos ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/pt/recursos/personal-finance-tools + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/pt/registo ${currentDate}T00:00:00+00:00 diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts index 6592969d8..01d920460 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { products } from '@ghostfolio/common/personal-finance-tools'; +import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -13,7 +13,7 @@ const routes: Routes = [ path: '', title: $localize`Personal Finance Tools` }, - ...products.map(({ alias, key, name }) => { + ...personalFinanceTools.map(({ alias, key, name }) => { return { canActivate: [AuthGuard], data: { key }, diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts index b72e49144..596ac310e 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts @@ -1,4 +1,4 @@ -import { products } from '@ghostfolio/common/personal-finance-tools'; +import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -12,7 +12,7 @@ import { Subject } from 'rxjs'; export class PersonalFinanceToolsPageComponent implements OnDestroy { public pathAlternativeTo = $localize`open-source-alternative-to` + '-'; public pathResources = '/' + $localize`resources`; - public products = products.sort((a, b) => { + public personalFinanceTools = personalFinanceTools.sort((a, b) => { return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); }); public routerLinkAbout = ['/' + $localize`about`]; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html index ec224ae6c..90b7b3ad1 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html @@ -18,25 +18,29 @@ with Ghostfolio.

- @for (product of products; track product) { + @for ( + personalFinanceTool of personalFinanceTools; + track personalFinanceTool + ) {
- Open Source Alternative to {{ product.name }} + Open Source Alternative to {{ personalFinanceTool.name }}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 6bf11dee2..3004a3ec4 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,6 +1,6 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Product } from '@ghostfolio/common/interfaces'; -import { products } from '@ghostfolio/common/personal-finance-tools'; +import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { CommonModule } from '@angular/common'; import { Component, OnInit } from '@angular/core'; @@ -61,7 +61,7 @@ export class GfProductPageComponent implements OnInit { useAnonymously: true }; - this.product2 = products.find(({ key }) => { + this.product2 = personalFinanceTools.find(({ key }) => { return key === this.route.snapshot.data['key']; }); } diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 3b9123218..43a9cf16a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -13144,7 +13144,7 @@ open-source-alternative-to - open-source-alternative-to + alternativa-de-software-libre-a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts 23 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 0a084f24d..d0c60a0d4 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -3,7 +3,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. - Le risque de perte en investissant peut être important. Il est déconseillé d'investir de l'argent dont vous pourriez avoir besoin à court terme. + Le risque de perte en investissant peut être important. Il est déconseillé d’investir de l’argent dont vous pourriez avoir besoin à court terme. apps/client/src/app/app.component.html 182 @@ -459,7 +459,7 @@ Asset Profiles - Profil d'Actifs + Profil d’Actifs libs/ui/src/lib/assistant/assistant.html 67 @@ -627,7 +627,7 @@ Asset Class - Classe d'Actifs + Classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html 60 @@ -651,7 +651,7 @@ Asset Sub Class - Sous-classe d'Actifs + Sous-classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html 69 @@ -695,7 +695,7 @@ Activities Count - Nombre d'Activités + Nombre d’Activités apps/client/src/app/components/admin-market-data/admin-market-data.html 87 @@ -895,7 +895,7 @@ User Count - Nombre d'Utilisateurs + Nombre d’Utilisateurs apps/client/src/app/components/admin-overview/admin-overview.html 13 @@ -903,7 +903,7 @@ Activity Count - Nombre d'Activités + Nombre d’Activités apps/client/src/app/components/admin-overview/admin-overview.html 23 @@ -1623,7 +1623,7 @@ Upgrade Plan - Mettre à niveau l'Abonnement + Mettre à niveau l’Abonnement apps/client/src/app/components/home-summary/home-summary.component.ts 115 @@ -1651,7 +1651,7 @@ Savings Rate - Taux d'Épargne + Taux d’Épargne apps/client/src/app/components/investment-chart/investment-chart.component.ts 214 @@ -1807,7 +1807,7 @@ Emergency Fund - Fonds d'Urgence + Fonds d’Urgence apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 190 @@ -1823,7 +1823,7 @@ Buying Power - Pouvoir d'Achat + Pouvoir d’Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 237 @@ -1831,7 +1831,7 @@ Excluded from Analysis - Exclus de l'Analyse + Exclus de l’Analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 249 @@ -1879,7 +1879,7 @@ Please enter the amount of your emergency fund: - Veuillez entrer le montant de votre fonds d'urgence : + Veuillez entrer le montant de votre fonds d’urgence : apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 57 @@ -1947,7 +1947,7 @@ Today - Aujourd'hui + Aujourd’hui apps/client/src/app/components/toggle/toggle.component.ts 22 @@ -2031,7 +2031,7 @@ Oops! Something went wrong. - Oups! Quelque chose s'est mal passé. + Oups! Quelque chose s’est mal passé. apps/client/src/app/core/http-response.interceptor.ts 89 @@ -2043,7 +2043,7 @@ Okay - D'accord + D’accord apps/client/src/app/core/http-response.interceptor.ts 92 @@ -2143,7 +2143,7 @@ Could not redeem coupon code - Le code promotionnel n'a pas pu être appliqué + Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 121 @@ -2299,7 +2299,7 @@ Date and number format - Format de date et d'heure + Format de date et d’heure apps/client/src/app/components/user-account-settings/user-account-settings.html 123 @@ -2367,7 +2367,7 @@ User ID - ID d'utilisateur + ID d’utilisateur apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 45 @@ -2739,7 +2739,7 @@ Import has been completed - L'import est terminé + L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 128 @@ -2835,7 +2835,7 @@ By Asset Class - Par Classe d'Actifs + Par Classe d’Actifs apps/client/src/app/pages/portfolio/allocations/allocations-page.html 86 @@ -3070,8 +3070,8 @@ - Hello, has shared a Portfolio with you! - Bonjour, a partagé un Portefeuille avec vous ! + Hello, has shared a Portfolio with you! + Bonjour, a partagé un Portefeuille avec vous ! apps/client/src/app/pages/public/public-page.html 4 @@ -3187,7 +3187,7 @@ Oops, authentication has failed. - Oups, l'identification a échoué. + Oups, l’identification a échoué. apps/client/src/app/pages/webauthn/webauthn-page.html 19 @@ -3203,7 +3203,7 @@ Go back to Home Page - Retour à la Page d'Accueil + Retour à la Page d’Accueil apps/client/src/app/pages/webauthn/webauthn-page.html 31 @@ -3319,7 +3319,7 @@ Annual Interest Rate - Taux d'Intérêt Annuel + Taux d’Intérêt Annuel libs/ui/src/lib/fire-calculator/fire-calculator.component.html 21 @@ -3387,7 +3387,7 @@ Asset Class - Classe d'Actifs + Classe d’Actifs libs/ui/src/lib/i18n.ts 6 @@ -3395,7 +3395,7 @@ Asset Sub Class - Sous-classe d'Actifs + Sous-classe d’Actifs libs/ui/src/lib/i18n.ts 7 @@ -3403,7 +3403,7 @@ Emergency Fund - Fonds d'Urgence + Fonds d’Urgence libs/ui/src/lib/i18n.ts 13 @@ -3583,7 +3583,7 @@ Time to add your first activity. - Il est temps d'ajouter votre première activité. + Il est temps d’ajouter votre première activité. libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html 12 @@ -3635,7 +3635,7 @@ Valid until - Valide jusqu'au + Valide jusqu’au libs/ui/src/lib/membership-card/membership-card.component.html 23 @@ -3715,7 +3715,7 @@ Are you an ambitious investor who needs the full picture? - Êtes-vous un investisseur ambitieux qui a besoin d'une vue complète ? + Êtes-vous un investisseur ambitieux qui a besoin d’une vue complète ? apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 12 @@ -3771,7 +3771,7 @@ and more Features... - et d'autres fonctionnalités... + et d’autres fonctionnalités... apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 42 @@ -3795,7 +3795,7 @@ Upgrade Plan - Mettre à niveau l'Abonnement + Mettre à niveau l’Abonnement apps/client/src/app/components/header/header.component.html 182 @@ -3815,7 +3815,7 @@ For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. - Pour les investisseurs à l'aise avec la technologie qui préfèrent héberger Ghostfolio sur leur propre infrastructure. + Pour les investisseurs à l’aise avec la technologie qui préfèrent héberger Ghostfolio sur leur propre infrastructure. apps/client/src/app/pages/pricing/pricing-page.html 36 @@ -3911,7 +3911,7 @@ For ambitious investors who need the full picture of their financial assets. - Pour les investisseurs ambitieux qui ont besoin d'une vue complète de leurs actifs financiers. + Pour les investisseurs ambitieux qui ont besoin d’une vue complète de leurs actifs financiers. apps/client/src/app/pages/pricing/pricing-page.html 180 @@ -3935,7 +3935,7 @@ It’s free. - C'est gratuit. + C’est gratuit. apps/client/src/app/pages/pricing/pricing-page.html 294 @@ -3979,7 +3979,7 @@ Savings Rate per Month - Taux d'Épargne mensuel + Taux d’Épargne mensuel libs/ui/src/lib/fire-calculator/fire-calculator.component.html 10 @@ -4051,7 +4051,7 @@ Oops! Could not get the historical exchange rate from - Oups ! Nous n'avons pas pu obtenir le taux de change historique à partir de + Oups ! Nous n’avons pas pu obtenir le taux de change historique à partir de apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 292 @@ -4095,7 +4095,7 @@ Renew Plan - Renouveler l'Abonnement + Renouveler l’Abonnement apps/client/src/app/components/header/header.component.html 190 @@ -4111,7 +4111,7 @@ Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. - Notre offre Ghostfolio Premium cloud est la manière la plus simple de débuter. Grâce au temps qu'elle économise, ce sera la meilleure option pour la plupart des gens. Les revenus sont utilisés pour couvrir les frais d'infrastructures et financer le développement continu de Ghostfolio. + Notre offre Ghostfolio Premium cloud est la manière la plus simple de débuter. Grâce au temps qu’elle économise, ce sera la meilleure option pour la plupart des gens. Les revenus sont utilisés pour couvrir les frais d’infrastructures et financer le développement continu de Ghostfolio. apps/client/src/app/pages/pricing/pricing-page.html 6 @@ -4127,7 +4127,7 @@ Delete User - Supprimer l'Utilisateur + Supprimer l’Utilisateur apps/client/src/app/components/admin-users/admin-users.html 232 @@ -4143,7 +4143,7 @@ By ETF Provider - Par Émetteur d'ETF + Par Émetteur d’ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html 314 @@ -4215,7 +4215,7 @@ Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: - Mettez à niveau vers Ghostfolio Premium aujourd'hui et gagnez accès à des fonctionnalités exclusives pour améliorer votre expérience d'investissement: + Mettez à niveau vers Ghostfolio Premium aujourd’hui et gagnez accès à des fonctionnalités exclusives pour améliorer votre expérience d’investissement: apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 15 @@ -4223,7 +4223,7 @@ Get the tools to effectively manage your finances and refine your personal investment strategy. - Obtenez les outils pour gérer efficacement vos finances et affinez votre stratégie d'investissement personnelle. + Obtenez les outils pour gérer efficacement vos finances et affinez votre stratégie d’investissement personnelle. apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 45 @@ -5499,7 +5499,7 @@ ✅ Yes - ✅ Yes + ✅ Oui apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 109 @@ -7295,7 +7295,7 @@ ❌ No - ❌ No + ❌ Non apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111 @@ -12231,7 +12231,7 @@ The Open Source Alternative to - The Open Source Alternative to + L’alternative open source à apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 8 @@ -13143,7 +13143,7 @@ open-source-alternative-to - open-source-alternative-to + alternative-open-source-a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts 23 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index e996ec68e..1b35a6a52 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -5499,7 +5499,7 @@ ✅ Yes - ✅ Yes + ✅ Sim apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 109 @@ -7295,7 +7295,7 @@ ❌ No - ❌ No + ❌ Não apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 111 @@ -12231,7 +12231,7 @@ The Open Source Alternative to - The Open Source Alternative to + A alternativa de software livre ao apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html 8 @@ -13143,7 +13143,7 @@ open-source-alternative-to - open-source-alternative-to + alternativa-de-software-livre-ao apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts 23 diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 247e2d090..f7d10366d 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -1,6 +1,6 @@ import { Product } from '@ghostfolio/common/interfaces'; -export const products: Product[] = [ +export const personalFinanceTools: Product[] = [ { founded: 2023, hasSelfHostingAbility: false,