Browse Source

Feature/refactor public routes: resources (#4937)

* Refactor public routes: resources
pull/4929/head
Thomas Kaul 2 weeks ago
committed by GitHub
parent
commit
4b556dfdc4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      apps/client/src/app/app-routing.module.ts
  2. 6
      apps/client/src/app/app.component.ts
  3. 6
      apps/client/src/app/components/header/header.component.ts
  4. 4
      apps/client/src/app/core/auth.guard.ts
  5. 4
      apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts
  6. 4
      apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts
  7. 4
      apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts
  8. 4
      apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts
  9. 2
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts
  10. 4
      apps/client/src/app/pages/features/features-page.component.ts
  11. 4
      apps/client/src/app/pages/resources/glossary/resources-glossary-routing.module.ts
  12. 4
      apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
  13. 4
      apps/client/src/app/pages/resources/guides/resources-guides-routing.module.ts
  14. 4
      apps/client/src/app/pages/resources/markets/resources-markets-routing.module.ts
  15. 14
      apps/client/src/app/pages/resources/overview/resources-overview.component.ts
  16. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  17. 2
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  18. 13
      apps/client/src/app/pages/resources/resources-page-routing.module.ts
  19. 10
      apps/client/src/app/pages/resources/resources-page.component.ts
  20. 38
      libs/common/src/lib/routes/routes.ts

4
apps/client/src/app/app-routing.module.ts

@ -13,7 +13,7 @@ import { ModulePreloadService } from './core/module-preload.service';
const routes: Routes = [ const routes: Routes = [
{ {
path: ghostfolioRoutes.about, path: publicRoutes.about.path,
loadChildren: () => loadChildren: () =>
import('./pages/about/about-page.module').then((m) => m.AboutPageModule) import('./pages/about/about-page.module').then((m) => m.AboutPageModule)
}, },
@ -132,7 +132,7 @@ const routes: Routes = [
) )
}, },
{ {
path: ghostfolioRoutes.resources, path: publicRoutes.resources.path,
loadChildren: () => loadChildren: () =>
import('./pages/resources/resources-page.module').then( import('./pages/resources/resources-page.module').then(
(m) => m.ResourcesPageModule (m) => m.ResourcesPageModule

6
apps/client/src/app/app.component.ts

@ -83,7 +83,7 @@ export class AppComponent implements OnDestroy, OnInit {
public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; public routerLinkOpenStartup = publicRoutes.openStartup.routerLink;
public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkPricing = publicRoutes.pricing.routerLink;
public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkRegister = publicRoutes.register.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
public showFooter = false; public showFooter = false;
public user: User; public user: User;
@ -198,9 +198,9 @@ export class AppComponent implements OnDestroy, OnInit {
} }
this.hasTabs = this.hasTabs =
(this.currentRoute === routes.about || (this.currentRoute === publicRoutes.about.path ||
this.currentRoute === publicRoutes.faq.path || this.currentRoute === publicRoutes.faq.path ||
this.currentRoute === routes.resources || this.currentRoute === publicRoutes.resources.path ||
this.currentRoute === internalRoutes.account.path || this.currentRoute === internalRoutes.account.path ||
this.currentRoute === routes.adminControl || this.currentRoute === routes.adminControl ||
this.currentRoute === internalRoutes.home.path || this.currentRoute === internalRoutes.home.path ||

6
apps/client/src/app/components/header/header.component.ts

@ -85,11 +85,11 @@ export class HeaderComponent implements OnChanges {
public impersonationId: string; public impersonationId: string;
public internalRoutes = internalRoutes; public internalRoutes = internalRoutes;
public isMenuOpen: boolean; public isMenuOpen: boolean;
public routeAbout = routes.about; public routeAbout = publicRoutes.about.path;
public routeFeatures = publicRoutes.features.path; public routeFeatures = publicRoutes.features.path;
public routeMarkets = publicRoutes.markets.path; public routeMarkets = publicRoutes.markets.path;
public routePricing = publicRoutes.pricing.path; public routePricing = publicRoutes.pricing.path;
public routeResources = routes.resources; public routeResources = publicRoutes.resources.path;
public routerLinkAbout = publicRoutes.about.routerLink; public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkAccount = internalRoutes.account.routerLink; public routerLinkAccount = internalRoutes.account.routerLink;
public routerLinkAccounts = internalRoutes.accounts.routerLink; public routerLinkAccounts = internalRoutes.accounts.routerLink;
@ -99,7 +99,7 @@ export class HeaderComponent implements OnChanges {
public routerLinkPortfolio = internalRoutes.portfolio.routerLink; public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkPricing = publicRoutes.pricing.routerLink;
public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkRegister = publicRoutes.register.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
public routes = routes; public routes = routes;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

4
apps/client/src/app/core/auth.guard.ts

@ -19,7 +19,7 @@ import { catchError } from 'rxjs/operators';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AuthGuard { export class AuthGuard {
private static PUBLIC_PAGE_ROUTES = [ private static PUBLIC_PAGE_ROUTES = [
`/${routes.about}`, `/${publicRoutes.about.path}`,
`/${publicRoutes.blog.path}`, `/${publicRoutes.blog.path}`,
`/${routes.demo}`, `/${routes.demo}`,
`/${publicRoutes.faq.path}`, `/${publicRoutes.faq.path}`,
@ -29,7 +29,7 @@ export class AuthGuard {
`/${publicRoutes.pricing.path}`, `/${publicRoutes.pricing.path}`,
`/${routes.public}`, `/${routes.public}`,
`/${publicRoutes.register.path}`, `/${publicRoutes.register.path}`,
`/${routes.resources}` `/${publicRoutes.resources.path}`
]; ];
public constructor( public constructor(

4
apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router';
export class HalloGhostfolioPageComponent { export class HalloGhostfolioPageComponent {
public routerLinkBlog = publicRoutes.blog.routerLink; public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkPricing = publicRoutes.pricing.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
} }

4
apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router';
export class HelloGhostfolioPageComponent { export class HelloGhostfolioPageComponent {
public routerLinkBlog = publicRoutes.blog.routerLink; public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkPricing = publicRoutes.pricing.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
} }

4
apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -12,5 +12,5 @@ import { RouterModule } from '@angular/router';
}) })
export class HowDoIGetMyFinancesInOrderPageComponent { export class HowDoIGetMyFinancesInOrderPageComponent {
public routerLinkBlog = publicRoutes.blog.routerLink; public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
} }

4
apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router';
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent { export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
public routerLinkBlog = publicRoutes.blog.routerLink; public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkFeatures = publicRoutes.features.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
} }

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

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';

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

@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
@ -27,7 +27,7 @@ export class GfFeaturesPageComponent implements OnDestroy {
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public info: InfoItem; public info: InfoItem;
public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkRegister = publicRoutes.register.routerLink;
public routerLinkResources = ['/' + routes.resources]; public routerLinkResources = publicRoutes.resources.routerLink;
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

4
apps/client/src/app/pages/resources/glossary/resources-glossary-routing.module.ts

@ -1,3 +1,5 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -7,7 +9,7 @@ const routes: Routes = [
{ {
component: ResourcesGlossaryPageComponent, component: ResourcesGlossaryPageComponent,
path: '', path: '',
title: $localize`Glossary` title: publicRoutes.resources.subRoutes.glossary.title
} }
]; ];

4
apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes, routes } from '@ghostfolio/common/routes/routes';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
@ -15,7 +15,7 @@ export class ResourcesGlossaryPageComponent implements OnInit {
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public info: InfoItem; public info: InfoItem;
public routerLinkResourcesPersonalFinanceTools = [ public routerLinkResourcesPersonalFinanceTools = [
'/' + routes.resources, '/' + publicRoutes.resources.path,
routes.personalFinanceTools routes.personalFinanceTools
]; ];

4
apps/client/src/app/pages/resources/guides/resources-guides-routing.module.ts

@ -1,3 +1,5 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -7,7 +9,7 @@ const routes: Routes = [
{ {
component: ResourcesGuidesComponent, component: ResourcesGuidesComponent,
path: '', path: '',
title: $localize`Guides` title: publicRoutes.resources.subRoutes.guides.title
} }
]; ];

4
apps/client/src/app/pages/resources/markets/resources-markets-routing.module.ts

@ -1,3 +1,5 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -7,7 +9,7 @@ const routes: Routes = [
{ {
component: ResourcesMarketsComponent, component: ResourcesMarketsComponent,
path: '', path: '',
title: $localize`Markets` title: publicRoutes.resources.subRoutes.markets.title
} }
]; ];

14
apps/client/src/app/pages/resources/overview/resources-overview.component.ts

@ -1,4 +1,4 @@
import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@ -19,20 +19,20 @@ export class ResourcesOverviewComponent {
{ {
description: description:
'Explore our guides to help you get started with investing and managing your finances.', 'Explore our guides to help you get started with investing and managing your finances.',
routerLink: ['/' + routes.resources, routes.guides], routerLink: publicRoutes.resources.subRoutes.guides.routerLink,
title: 'Guides' title: publicRoutes.resources.subRoutes.guides.title
}, },
{ {
description: description:
'Access various market resources and tools to stay informed about financial markets.', 'Access various market resources and tools to stay informed about financial markets.',
routerLink: ['/' + routes.resources, routes.markets], routerLink: publicRoutes.resources.subRoutes.markets.routerLink,
title: 'Markets' title: publicRoutes.resources.subRoutes.markets.title
}, },
{ {
description: description:
'Learn key financial terms and concepts in our comprehensive glossary.', 'Learn key financial terms and concepts in our comprehensive glossary.',
routerLink: ['/' + routes.resources, routes.glossary], routerLink: publicRoutes.resources.subRoutes.glossary.routerLink,
title: 'Glossary' title: publicRoutes.resources.subRoutes.glossary.title
} }
]; ];
} }

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts

@ -13,7 +13,7 @@ import { Subject } from 'rxjs';
}) })
export class PersonalFinanceToolsPageComponent implements OnDestroy { export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = routes.openSourceAlternativeTo + '-'; public pathAlternativeTo = routes.openSourceAlternativeTo + '-';
public pathResources = '/' + routes.resources; public pathResources = publicRoutes.resources.path;
public personalFinanceTools = personalFinanceTools.sort((a, b) => { public personalFinanceTools = personalFinanceTools.sort((a, b) => {
return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
}); });

2
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -23,7 +23,7 @@ export class GfProductPageComponent implements OnInit {
public routerLinkAbout = publicRoutes.about.routerLink; public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkFeatures = publicRoutes.features.routerLink;
public routerLinkResourcesPersonalFinanceTools = [ public routerLinkResourcesPersonalFinanceTools = [
'/' + routes.resources, '/' + publicRoutes.resources.path,
routes.personalFinanceTools routes.personalFinanceTools
]; ];
public tags: string[]; public tags: string[];

13
apps/client/src/app/pages/resources/resources-page-routing.module.ts

@ -1,5 +1,8 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import {
routes as ghostfolioRoutes,
publicRoutes
} from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -19,21 +22,21 @@ const routes: Routes = [
) )
}, },
{ {
path: ghostfolioRoutes.glossary, path: publicRoutes.resources.subRoutes.glossary.path,
loadChildren: () => loadChildren: () =>
import('./glossary/resources-glossary.module').then( import('./glossary/resources-glossary.module').then(
(m) => m.ResourcesGlossaryPageModule (m) => m.ResourcesGlossaryPageModule
) )
}, },
{ {
path: ghostfolioRoutes.guides, path: publicRoutes.resources.subRoutes.guides.path,
loadChildren: () => loadChildren: () =>
import('./guides/resources-guides.module').then( import('./guides/resources-guides.module').then(
(m) => m.ResourcesGuidesModule (m) => m.ResourcesGuidesModule
) )
}, },
{ {
path: ghostfolioRoutes.markets, path: publicRoutes.resources.subRoutes.markets.path,
loadChildren: () => loadChildren: () =>
import('./markets/resources-markets.module').then( import('./markets/resources-markets.module').then(
(m) => m.ResourcesMarketsModule (m) => m.ResourcesMarketsModule
@ -48,7 +51,7 @@ const routes: Routes = [
})) }))
], ],
path: '', path: '',
title: $localize`Resources` title: publicRoutes.resources.title
} }
]; ];

10
apps/client/src/app/pages/resources/resources-page.component.ts

@ -1,5 +1,5 @@
import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { TabConfiguration } from '@ghostfolio/common/interfaces';
import { routes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -18,22 +18,22 @@ export class ResourcesPageComponent implements OnInit {
{ {
iconName: 'reader-outline', iconName: 'reader-outline',
label: $localize`Overview`, label: $localize`Overview`,
routerLink: ['/' + routes.resources] routerLink: publicRoutes.resources.routerLink
}, },
{ {
label: $localize`Guides`, label: $localize`Guides`,
iconName: 'book-outline', iconName: 'book-outline',
routerLink: ['/' + routes.resources, routes.guides] routerLink: publicRoutes.resources.subRoutes.guides.routerLink
}, },
{ {
iconName: 'newspaper-outline', iconName: 'newspaper-outline',
label: $localize`Markets`, label: $localize`Markets`,
routerLink: ['/' + routes.resources, routes.markets] routerLink: publicRoutes.resources.subRoutes.markets.routerLink
}, },
{ {
iconName: 'library-outline', iconName: 'library-outline',
label: $localize`Glossary`, label: $localize`Glossary`,
routerLink: ['/' + routes.resources, routes.glossary] routerLink: publicRoutes.resources.subRoutes.glossary.routerLink
} }
]; ];

38
libs/common/src/lib/routes/routes.ts

@ -21,12 +21,7 @@ export const routes = {
webauthn: 'webauthn', webauthn: 'webauthn',
// Publicly accessible pages // Publicly accessible pages
about: $localize`:kebab-case:about`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`
glossary: $localize`:kebab-case:glossary`,
guides: $localize`:kebab-case:guides`,
markets: $localize`:kebab-case:markets`,
openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`,
resources: $localize`:kebab-case:resources`
}; };
export const internalRoutes: Record<string, IRoute> = { export const internalRoutes: Record<string, IRoute> = {
@ -203,5 +198,36 @@ export const publicRoutes = {
path: $localize`:kebab-case:register`, path: $localize`:kebab-case:register`,
routerLink: ['/' + $localize`:kebab-case:register`], routerLink: ['/' + $localize`:kebab-case:register`],
title: $localize`Registration` title: $localize`Registration`
},
resources: {
path: $localize`:kebab-case:resources`,
routerLink: ['/' + $localize`:kebab-case:resources`],
subRoutes: {
glossary: {
path: $localize`:kebab-case:glossary`,
routerLink: [
'/' + $localize`:kebab-case:resources`,
$localize`:kebab-case:glossary`
],
title: $localize`Glossary`
},
guides: {
path: $localize`:kebab-case:guides`,
routerLink: [
'/' + $localize`:kebab-case:resources`,
$localize`:kebab-case:guides`
],
title: $localize`Guides`
},
markets: {
path: $localize`:kebab-case:markets`,
routerLink: [
'/' + $localize`:kebab-case:resources`,
$localize`:kebab-case:markets`
],
title: $localize`Markets`
}
},
title: $localize`Resources`
} }
}; };

Loading…
Cancel
Save