Browse Source

Refactoring

pull/3478/head
Thomas Kaul 1 year ago
parent
commit
fd028ea68e
  1. 25
      apps/api/src/app/sitemap/sitemap.controller.ts
  2. 5
      apps/api/src/app/sitemap/sitemap.module.ts
  3. 12
      apps/api/src/assets/sitemap.xml
  4. 4
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  5. 4
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  6. 16
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
  7. 4
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  8. 2
      apps/client/src/locales/messages.es.xlf
  9. 98
      apps/client/src/locales/messages.fr.xlf
  10. 8
      apps/client/src/locales/messages.pt.xlf
  11. 2
      libs/common/src/lib/personal-finance-tools.ts

25
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,7 +36,10 @@ export class SitemapController {
response.send(
interpolate(this.sitemapXml, {
currentDate,
personalFinanceTools: products
personalFinanceTools: this.configurationService.get(
'ENABLE_FEATURE_SUBSCRIPTION'
)
? personalFinanceTools
.map(({ alias, key }) => {
return [
'<url>',
@ -45,16 +51,29 @@ export class SitemapController {
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>',
'<url>',
` <loc>https://ghostfol.io/es/recursos/personal-finance-tools/alternativa-de-software-libre-a-${alias ?? key}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>',
'<url>',
` <loc>https://ghostfol.io/fr/ressources/personal-finance-tools/alternative-open-source-a-${alias ?? key}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>',
'<url>',
` <loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-${alias ?? key}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>',
'<url>',
` <loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-${alias ?? key}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>',
'<url>',
` <loc>https://ghostfol.io/pt/recursos/personal-finance-tools/alternativa-de-software-livre-ao-${alias ?? key}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
'</url>'
].join('\n');
})
.join('\n')
: ''
})
);
}

5
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 {}

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

@ -238,6 +238,10 @@
<loc>https://ghostfol.io/es/recursos</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/es/recursos/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/es/registro</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -316,6 +320,10 @@
<loc>https://ghostfol.io/fr/ressources</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/fr/ressources/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/it</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -470,6 +478,10 @@
<loc>https://ghostfol.io/pt/recursos</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/pt/recursos/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/pt/registo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>

4
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 },

4
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`];

16
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html

@ -18,25 +18,29 @@
with Ghostfolio.
</p>
</div>
@for (product of products; track product) {
@for (
personalFinanceTool of personalFinanceTools;
track personalFinanceTool
) {
<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"
title="Compare Ghostfolio to {{ product.name }} - {{
product.slogan
}}"
title="Compare Ghostfolio to {{
personalFinanceTool.name
}} - {{ personalFinanceTool.slogan }}"
[routerLink]="[
pathResources,
'personal-finance-tools',
pathAlternativeTo + (product.alias ?? product.key)
pathAlternativeTo +
(personalFinanceTool.alias ?? personalFinanceTool.key)
]"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate" i18n>
Open Source Alternative to {{ product.name }}
Open Source Alternative to {{ personalFinanceTool.name }}
</div>
</div>
<div class="align-items-center d-flex">

4
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'];
});
}

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

@ -13144,7 +13144,7 @@
</trans-unit>
<trans-unit id="5827613432388799534" datatype="html">
<source>open-source-alternative-to</source>
<target state="new">open-source-alternative-to</target>
<target state="translated">alternativa-de-software-libre-a</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts</context>
<context context-type="linenumber">23</context>

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

@ -3,7 +3,7 @@
<body>
<trans-unit id="2ca05295d27e46c262b233252d1b19c27d95d07f" datatype="html">
<source>The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.</source>
<target state="translated">Le risque de perte en investissant peut être important. Il est déconseillé d&apos;investir de l&apos;argent dont vous pourriez avoir besoin à court terme.</target>
<target state="translated">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.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">182</context>
@ -459,7 +459,7 @@
</trans-unit>
<trans-unit id="db287ecf48f50d8a83c1dbdcee6282723b4cd9ad" datatype="html">
<source>Asset Profiles</source>
<target state="new">Profil d&apos;Actifs</target>
<target state="new">Profil dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">67</context>
@ -627,7 +627,7 @@
</trans-unit>
<trans-unit id="584c9433705e9bfdd2e7a9f0192690f453d36196" datatype="html">
<source>Asset Class</source>
<target state="translated">Classe d&apos;Actifs</target>
<target state="translated">Classe dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">60</context>
@ -651,7 +651,7 @@
</trans-unit>
<trans-unit id="27fe3d097c64eaec7ff564358f80fb7ba795f484" datatype="html">
<source>Asset Sub Class</source>
<target state="translated">Sous-classe d&apos;Actifs</target>
<target state="translated">Sous-classe dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">69</context>
@ -695,7 +695,7 @@
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
<source>Activities Count</source>
<target state="translated">Nombre d&apos;Activités</target>
<target state="translated">Nombre dActivités</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">87</context>
@ -895,7 +895,7 @@
</trans-unit>
<trans-unit id="ec03f5c28b327fc7ecfc4b20a0a7cf14a75843ff" datatype="html">
<source>User Count</source>
<target state="translated">Nombre d&apos;Utilisateurs</target>
<target state="translated">Nombre dUtilisateurs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">13</context>
@ -903,7 +903,7 @@
</trans-unit>
<trans-unit id="ced0954194f098201837bb03b32441e4991b5193" datatype="html">
<source>Activity Count</source>
<target state="translated">Nombre d&apos;Activités</target>
<target state="translated">Nombre dActivités</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
<context context-type="linenumber">23</context>
@ -1623,7 +1623,7 @@
</trans-unit>
<trans-unit id="5499742151525073097" datatype="html">
<source>Upgrade Plan</source>
<target state="translated">Mettre à niveau l&apos;Abonnement</target>
<target state="translated">Mettre à niveau lAbonnement</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/home-summary/home-summary.component.ts</context>
<context context-type="linenumber">115</context>
@ -1651,7 +1651,7 @@
</trans-unit>
<trans-unit id="8192718423057883427" datatype="html">
<source>Savings Rate</source>
<target state="translated">Taux d&apos;Épargne</target>
<target state="translated">Taux dÉpargne</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/investment-chart/investment-chart.component.ts</context>
<context context-type="linenumber">214</context>
@ -1807,7 +1807,7 @@
</trans-unit>
<trans-unit id="2201b2004bc4997a66f6f8ea2511a4e1311f3de1" datatype="html">
<source>Emergency Fund</source>
<target state="translated">Fonds d&apos;Urgence</target>
<target state="translated">Fonds dUrgence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
<context context-type="linenumber">190</context>
@ -1823,7 +1823,7 @@
</trans-unit>
<trans-unit id="8cce9d03787606e0052d19c2ae7e7fa5ff785e94" datatype="html">
<source>Buying Power</source>
<target state="translated">Pouvoir d&apos;Achat</target>
<target state="translated">Pouvoir dAchat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
<context context-type="linenumber">237</context>
@ -1831,7 +1831,7 @@
</trans-unit>
<trans-unit id="98fc3013bfcbf452b9f37bbfcdb77b9b882866e3" datatype="html">
<source>Excluded from Analysis</source>
<target state="translated">Exclus de l&apos;Analyse</target>
<target state="translated">Exclus de lAnalyse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html</context>
<context context-type="linenumber">249</context>
@ -1879,7 +1879,7 @@
</trans-unit>
<trans-unit id="6785405835169448749" datatype="html">
<source>Please enter the amount of your emergency fund:</source>
<target state="translated">Veuillez entrer le montant de votre fonds d&apos;urgence :</target>
<target state="translated">Veuillez entrer le montant de votre fonds durgence :</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts</context>
<context context-type="linenumber">57</context>
@ -1947,7 +1947,7 @@
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
<target state="translated">Aujourd&apos;hui</target>
<target state="translated">Aujourdhui</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/toggle/toggle.component.ts</context>
<context context-type="linenumber">22</context>
@ -2031,7 +2031,7 @@
</trans-unit>
<trans-unit id="7224997887539831269" datatype="html">
<source>Oops! Something went wrong.</source>
<target state="translated">Oups! Quelque chose s&apos;est mal passé.</target>
<target state="translated">Oups! Quelque chose sest mal passé.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">89</context>
@ -2043,7 +2043,7 @@
</trans-unit>
<trans-unit id="1579692722565712588" datatype="html">
<source>Okay</source>
<target state="translated">D&apos;accord</target>
<target state="translated">Daccord</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/core/http-response.interceptor.ts</context>
<context context-type="linenumber">92</context>
@ -2143,7 +2143,7 @@
</trans-unit>
<trans-unit id="4420880039966769543" datatype="html">
<source>Could not redeem coupon code</source>
<target state="translated">Le code promotionnel n&apos;a pas pu être appliqué</target>
<target state="translated">Le code promotionnel na pas pu être appliqué</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.component.ts</context>
<context context-type="linenumber">121</context>
@ -2299,7 +2299,7 @@
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
<source>Date and number format</source>
<target state="translated">Format de date et d&apos;heure</target>
<target state="translated">Format de date et dheure</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">123</context>
@ -2367,7 +2367,7 @@
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
<source>User ID</source>
<target state="translated">ID d&apos;utilisateur</target>
<target state="translated">ID dutilisateur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
<context context-type="linenumber">45</context>
@ -2739,7 +2739,7 @@
</trans-unit>
<trans-unit id="7500216440144530775" datatype="html">
<source>Import has been completed</source>
<target state="translated">L&apos;import est terminé</target>
<target state="translated">Limport est terminé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts</context>
<context context-type="linenumber">128</context>
@ -2835,7 +2835,7 @@
</trans-unit>
<trans-unit id="8288ff761f2d259625d2e5a3d96db727926d9cd4" datatype="html">
<source>By Asset Class</source>
<target state="translated">Par Classe d&apos;Actifs</target>
<target state="translated">Par Classe dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/allocations/allocations-page.html</context>
<context context-type="linenumber">86</context>
@ -3070,8 +3070,8 @@
</context-group>
</trans-unit>
<trans-unit id="3d14940af7de691ac27efb67bef3e974cbe3281c" datatype="html">
<source> Hello, <x id="INTERPOLATION" equiv-text="{{ portfolioPublicDetails?.alias ?? &apos;someone&apos; }}"/> has shared a <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Portfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> with you! </source>
<target state="translated"> Bonjour, <x id="INTERPOLATION" equiv-text="{{ portfolioPublicDetails?.alias ?? &apos;someone&apos; }}"/> a partagé un <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Portefeuille<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> avec vous ! </target>
<source> Hello, <x id="INTERPOLATION" equiv-text="{{ portfolioPublicDetails?.alias ?? ’someone’ }}"/> has shared a <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Portfolio<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> with you! </source>
<target state="translated"> Bonjour, <x id="INTERPOLATION" equiv-text="{{ portfolioPublicDetails?.alias ?? ’someone’ }}"/> a partagé un <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Portefeuille<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> avec vous ! </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
<context context-type="linenumber">4</context>
@ -3187,7 +3187,7 @@
</trans-unit>
<trans-unit id="495a0574bd9a3d619a8b16dd5b893c6f617beded" datatype="html">
<source>Oops, authentication has failed.</source>
<target state="translated">Oups, l&apos;identification a échoué.</target>
<target state="translated">Oups, lidentification a échoué.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/webauthn/webauthn-page.html</context>
<context context-type="linenumber">19</context>
@ -3203,7 +3203,7 @@
</trans-unit>
<trans-unit id="52cd09f578994ef3573e434007c1f9c86d3e8fc0" datatype="html">
<source>Go back to Home Page</source>
<target state="translated">Retour à la Page d&apos;Accueil</target>
<target state="translated">Retour à la Page dAccueil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/webauthn/webauthn-page.html</context>
<context context-type="linenumber">31</context>
@ -3319,7 +3319,7 @@
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
<source>Annual Interest Rate</source>
<target state="translated">Taux d&apos;Intérêt Annuel</target>
<target state="translated">Taux dIntérêt Annuel</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">21</context>
@ -3387,7 +3387,7 @@
</trans-unit>
<trans-unit id="4574987680940794089" datatype="html">
<source>Asset Class</source>
<target state="translated">Classe d&apos;Actifs</target>
<target state="translated">Classe dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">6</context>
@ -3395,7 +3395,7 @@
</trans-unit>
<trans-unit id="7608037008789240367" datatype="html">
<source>Asset Sub Class</source>
<target state="translated">Sous-classe d&apos;Actifs</target>
<target state="translated">Sous-classe dActifs</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">7</context>
@ -3403,7 +3403,7 @@
</trans-unit>
<trans-unit id="6268646680388419543" datatype="html">
<source>Emergency Fund</source>
<target state="translated">Fonds d&apos;Urgence</target>
<target state="translated">Fonds dUrgence</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">13</context>
@ -3583,7 +3583,7 @@
</trans-unit>
<trans-unit id="c004f99bac91f7dc28e87d458f80e5035ae99884" datatype="html">
<source>Time to add your first activity.</source>
<target state="translated">Il est temps d&apos;ajouter votre première activité.</target>
<target state="translated">Il est temps dajouter votre première activité.</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html</context>
<context context-type="linenumber">12</context>
@ -3635,7 +3635,7 @@
</trans-unit>
<trans-unit id="d82473cef3cd2258eab20223ffcdd5af0c0025cc" datatype="html">
<source>Valid until</source>
<target state="translated">Valide jusqu&apos;au</target>
<target state="translated">Valide jusquau</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.html</context>
<context context-type="linenumber">23</context>
@ -3715,7 +3715,7 @@
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
<source> Are you an ambitious investor who needs the full picture? </source>
<target state="translated"> Êtes-vous un investisseur ambitieux qui a besoin d&apos;une vue complète ? </target>
<target state="translated"> Êtes-vous un investisseur ambitieux qui a besoin dune vue complète ? </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">12</context>
@ -3771,7 +3771,7 @@
</trans-unit>
<trans-unit id="ae3ddc340195a1b9564574fd757c0cd1ab5cd765" datatype="html">
<source>and more Features...</source>
<target state="translated">et d&apos;autres fonctionnalités...</target>
<target state="translated">et dautres fonctionnalités...</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">42</context>
@ -3795,7 +3795,7 @@
</trans-unit>
<trans-unit id="6dcab4069ec74eb21b38bd9f9678dc957c99618c" datatype="html">
<source>Upgrade Plan</source>
<target state="translated">Mettre à niveau l&apos;Abonnement</target>
<target state="translated">Mettre à niveau lAbonnement</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">182</context>
@ -3815,7 +3815,7 @@
</trans-unit>
<trans-unit id="fd30b4e3189726798f09fa0ce875486cf50dda2d" datatype="html">
<source> For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. </source>
<target state="translated"> Pour les investisseurs à l&apos;aise avec la technologie qui préfèrent héberger Ghostfolio sur leur propre infrastructure. </target>
<target state="translated"> Pour les investisseurs à laise avec la technologie qui préfèrent héberger Ghostfolio sur leur propre infrastructure. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">36</context>
@ -3911,7 +3911,7 @@
</trans-unit>
<trans-unit id="5afce9034d974ae1e794d437885bf17b0ebf5a0c" datatype="html">
<source> For ambitious investors who need the full picture of their financial assets. </source>
<target state="translated"> Pour les investisseurs ambitieux qui ont besoin d&apos;une vue complète de leurs actifs financiers. </target>
<target state="translated"> Pour les investisseurs ambitieux qui ont besoin dune vue complète de leurs actifs financiers. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">180</context>
@ -3935,7 +3935,7 @@
</trans-unit>
<trans-unit id="9fc169f3af45f638d4b304b828b640514b1d017c" datatype="html">
<source>It’s free.</source>
<target state="translated">C&apos;est gratuit.</target>
<target state="translated">Cest gratuit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">294</context>
@ -3979,7 +3979,7 @@
</trans-unit>
<trans-unit id="310aea3a64b9279726e047f196c097f4f3268d09" datatype="html">
<source>Savings Rate per Month</source>
<target state="translated">Taux d&apos;Épargne mensuel</target>
<target state="translated">Taux dÉpargne mensuel</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/fire-calculator/fire-calculator.component.html</context>
<context context-type="linenumber">10</context>
@ -4051,7 +4051,7 @@
</trans-unit>
<trans-unit id="f15e6e0a8fb2412d0fc8c40bc2946ccac969f491" datatype="html">
<source>Oops! Could not get the historical exchange rate from</source>
<target state="translated">Oups ! Nous n&apos;avons pas pu obtenir le taux de change historique à partir de</target>
<target state="translated">Oups ! Nous navons pas pu obtenir le taux de change historique à partir de</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">292</context>
@ -4095,7 +4095,7 @@
</trans-unit>
<trans-unit id="e5580416a35e85e0ce48cf447c45043386d1027f" datatype="html">
<source>Renew Plan</source>
<target state="translated">Renouveler l&apos;Abonnement</target>
<target state="translated">Renouveler lAbonnement</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.html</context>
<context context-type="linenumber">190</context>
@ -4111,7 +4111,7 @@
</trans-unit>
<trans-unit id="de0d77a5255f97548d2b579f78c20c911a71820f" datatype="html">
<source> 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. </source>
<target state="new"> Notre offre Ghostfolio Premium cloud est la manière la plus simple de débuter. Grâce au temps qu&apos;elle économise, ce sera la meilleure option pour la plupart des gens. Les revenus sont utilisés pour couvrir les frais d&apos;infrastructures et financer le développement continu de Ghostfolio. </target>
<target state="new"> Notre offre Ghostfolio Premium cloud est la manière la plus simple de débuter. Grâce au temps quelle économise, ce sera la meilleure option pour la plupart des gens. Les revenus sont utilisés pour couvrir les frais dinfrastructures et financer le développement continu de Ghostfolio. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">6</context>
@ -4127,7 +4127,7 @@
</trans-unit>
<trans-unit id="3c32a07710e402b2c056bd346e7c42f6015334a6" datatype="html">
<source>Delete User</source>
<target state="translated">Supprimer l&apos;Utilisateur</target>
<target state="translated">Supprimer lUtilisateur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-users/admin-users.html</context>
<context context-type="linenumber">232</context>
@ -4143,7 +4143,7 @@
</trans-unit>
<trans-unit id="166ccc92e1aa598f9056a260be209a0bab64d37a" datatype="html">
<source>By ETF Provider</source>
<target state="translated">Par Émetteur d&apos;ETF</target>
<target state="translated">Par Émetteur dETF</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/allocations/allocations-page.html</context>
<context context-type="linenumber">314</context>
@ -4215,7 +4215,7 @@
</trans-unit>
<trans-unit id="dff74da4ffb45a2fd54f31f9db9da66f7012a702" datatype="html">
<source> Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: </source>
<target state="translated"> Mettez à niveau vers Ghostfolio Premium aujourd&apos;hui et gagnez accès à des fonctionnalités exclusives pour améliorer votre expérience d&apos;investissement: </target>
<target state="translated"> Mettez à niveau vers Ghostfolio Premium aujourd’hui et gagnez accès à des fonctionnalités exclusives pour améliorer votre expérience d’investissement: </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">15</context>
@ -4223,7 +4223,7 @@
</trans-unit>
<trans-unit id="8b17e00983a474a52d16bd139e180303703f01ff" datatype="html">
<source> Get the tools to effectively manage your finances and refine your personal investment strategy. </source>
<target state="translated"> Obtenez les outils pour gérer efficacement vos finances et affinez votre stratégie d&apos;investissement personnelle. </target>
<target state="translated"> Obtenez les outils pour gérer efficacement vos finances et affinez votre stratégie dinvestissement personnelle. </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">45</context>
@ -5499,7 +5499,7 @@
</trans-unit>
<trans-unit id="72aebdb25074909ed3dcb0866e277a1bef1a6916" datatype="html">
<source>✅ Yes</source>
<target state="new">✅ Yes</target>
<target state="translated">✅ Oui</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">109</context>
@ -7295,7 +7295,7 @@
</trans-unit>
<trans-unit id="ecdfd0aa6379102d20ffcf1e9e762edc54f148f4" datatype="html">
<source>❌ No</source>
<target state="new">❌ No</target>
<target state="translated">❌ Non</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">111</context>
@ -12231,7 +12231,7 @@
</trans-unit>
<trans-unit id="59aece48b4cff51f656b88e8f6c4061bb03410dc" datatype="html">
<source>The Open Source Alternative to</source>
<target state="new">The Open Source Alternative to</target>
<target state="translated">L’alternative open source à</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">8</context>
@ -13143,7 +13143,7 @@
</trans-unit>
<trans-unit id="5827613432388799534" datatype="html">
<source>open-source-alternative-to</source>
<target state="new">open-source-alternative-to</target>
<target state="translated">alternative-open-source-a</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts</context>
<context context-type="linenumber">23</context>

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

@ -5499,7 +5499,7 @@
</trans-unit>
<trans-unit id="72aebdb25074909ed3dcb0866e277a1bef1a6916" datatype="html">
<source>✅ Yes</source>
<target state="new">✅ Yes</target>
<target state="translated">✅ Sim</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">109</context>
@ -7295,7 +7295,7 @@
</trans-unit>
<trans-unit id="ecdfd0aa6379102d20ffcf1e9e762edc54f148f4" datatype="html">
<source>❌ No</source>
<target state="new">❌ No</target>
<target state="translated">❌ Não</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">111</context>
@ -12231,7 +12231,7 @@
</trans-unit>
<trans-unit id="59aece48b4cff51f656b88e8f6c4061bb03410dc" datatype="html">
<source>The Open Source Alternative to</source>
<target state="new">The Open Source Alternative to</target>
<target state="translated">A alternativa de software livre ao</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html</context>
<context context-type="linenumber">8</context>
@ -13143,7 +13143,7 @@
</trans-unit>
<trans-unit id="5827613432388799534" datatype="html">
<source>open-source-alternative-to</source>
<target state="new">open-source-alternative-to</target>
<target state="translated">alternativa-de-software-livre-ao</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts</context>
<context context-type="linenumber">23</context>

2
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,

Loading…
Cancel
Save