Browse Source

angular localization conditionally executed

pull/5035/head
csehatt741 5 days ago
committed by Thomas Kaul
parent
commit
8a7e028145
  1. 87
      apps/api/src/app/endpoints/sitemap/sitemap.service.ts
  2. 11
      libs/common/src/lib/routes/routes.ts

87
apps/api/src/app/endpoints/sitemap/sitemap.service.ts

@ -7,6 +7,9 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
const translationTaggedMessageRegex =
/:.*@@(?<id>[a-zA-Z0-9.]+):(?<message>.+)/;
@Injectable() @Injectable()
export class SitemapService { export class SitemapService {
public constructor( public constructor(
@ -19,11 +22,9 @@ export class SitemapService {
return SUPPORTED_LANGUAGE_CODES.flatMap((languageCode) => { return SUPPORTED_LANGUAGE_CODES.flatMap((languageCode) => {
return personalFinanceTools.map(({ alias, key }) => { return personalFinanceTools.map(({ alias, key }) => {
const pathSegments = [ const route =
'resources', publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes
'personalFinanceTools', .product;
'openSourceAlternativeTo'
];
const params = { const params = {
rootUrl, rootUrl,
languageCode, languageCode,
@ -31,7 +32,7 @@ export class SitemapService {
urlPostfix: alias ?? key urlPostfix: alias ?? key
}; };
return this.createSitemapUrl(pathSegments, params); return this.createRouteSitemapUrl({ route, ...params });
}); });
}).join('\n'); }).join('\n');
} }
@ -40,7 +41,6 @@ export class SitemapService {
const rootUrl = this.configurationService.get('ROOT_URL'); const rootUrl = this.configurationService.get('ROOT_URL');
return SUPPORTED_LANGUAGE_CODES.flatMap((languageCode) => { return SUPPORTED_LANGUAGE_CODES.flatMap((languageCode) => {
const pathSegments = [];
const params = { const params = {
rootUrl, rootUrl,
languageCode, languageCode,
@ -48,9 +48,9 @@ export class SitemapService {
}; };
// add language specific root URL // add language specific root URL
const urls = [this.createSitemapUrl(pathSegments, params)]; const urls = [this.createRouteSitemapUrl(params)];
urls.push(...this.createSitemapUrls(publicRoutes, pathSegments, params)); urls.push(...this.createSitemapUrls(publicRoutes, params));
return urls; return urls;
}).join('\n'); }).join('\n');
@ -58,57 +58,46 @@ export class SitemapService {
private createSitemapUrls( private createSitemapUrls(
routes: Record<string, PublicRoute>, routes: Record<string, PublicRoute>,
pathSegments: string[],
params: { rootUrl: string; languageCode: string; currentDate: string } params: { rootUrl: string; languageCode: string; currentDate: string }
): string[] { ): string[] {
return Object.values(routes).flatMap((route) => { return Object.values(routes).flatMap((route) => {
if (route.excludeFromSitemap) return []; if (route.excludeFromSitemap) return [];
const currentPathSegments = [ const urls = [this.createRouteSitemapUrl({ route, ...params })];
...pathSegments,
this.kebabToCamel(route.path)
];
const urls = [this.createSitemapUrl(currentPathSegments, params)];
if (route.subRoutes) { if (route.subRoutes) {
urls.push( urls.push(...this.createSitemapUrls(route.subRoutes, params));
...this.createSitemapUrls(
route.subRoutes,
currentPathSegments,
params
)
);
} }
return urls; return urls;
}); });
} }
private createSitemapUrl( private createRouteSitemapUrl({
pathSegments: string[], route,
{ rootUrl,
rootUrl, languageCode,
languageCode, currentDate,
currentDate, urlPostfix
urlPostfix }: {
}: { route?: PublicRoute;
rootUrl: string; rootUrl: string;
languageCode: string; languageCode: string;
currentDate: string; currentDate: string;
urlPostfix?: string; urlPostfix?: string;
} }): string {
): string { const segments =
const segments = pathSegments.map((_, index, segments) => { route?.routerLink.map((link) => {
const translationId = ['routes', ...segments.slice(0, index + 1)].join( const match = link.match(translationTaggedMessageRegex);
'.' const segment = match
); ? (this.i18nService.getTranslation({
languageCode,
return this.i18nService.getTranslation({ id: match.groups.id
languageCode, }) ?? match.groups.message)
id: translationId : link;
});
}); return segment.replace(/^\/+|\/+$/, '');
}) ?? [];
const location = const location =
[rootUrl, languageCode, ...segments].join('/') + [rootUrl, languageCode, ...segments].join('/') +
(urlPostfix ? `-${urlPostfix}` : ''); (urlPostfix ? `-${urlPostfix}` : '');
@ -120,8 +109,4 @@ export class SitemapService {
' </url>' ' </url>'
].join('\n'); ].join('\n');
} }
private kebabToCamel(str: string): string {
return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
}
} }

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

@ -1,11 +1,18 @@
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import '@angular/localize/init';
import { InternalRoute } from './interfaces/internal-route.interface'; import { InternalRoute } from './interfaces/internal-route.interface';
import { PublicRoute } from './interfaces/public-route.interface'; import { PublicRoute } from './interfaces/public-route.interface';
if (typeof window !== 'undefined') {
import('@angular/localize/init');
} else {
(global as any).$localize = (
messageParts: TemplateStringsArray,
...expressions: any[]
) => String.raw({ raw: messageParts }, ...expressions);
}
export const internalRoutes: Record<string, InternalRoute> = { export const internalRoutes: Record<string, InternalRoute> = {
account: { account: {
path: 'account', path: 'account',

Loading…
Cancel
Save