Browse Source

Improve language localization of asset classes

pull/7729/head
Thomas Kaul 2 days ago
parent
commit
c47042e7ff
  1. 50
      apps/api/src/app/endpoints/ai/ai.service.ts
  2. 10
      apps/api/src/services/i18n/i18n.service.ts

50
apps/api/src/app/endpoints/ai/ai.service.ts

@ -12,6 +12,7 @@ import type { AiPromptMode } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { AssetClass, AssetSubClass } from '@prisma/client';
import { generateText } from 'ai'; import { generateText } from 'ai';
import { format } from 'date-fns'; import { format } from 'date-fns';
import type { ColumnDescriptor } from 'tablemark'; import type { ColumnDescriptor } from 'tablemark';
@ -105,6 +106,18 @@ export class AiService {
return { name, align: align ?? 'left' }; return { name, align: align ?? 'left' };
}); });
const assetClassTranslations = this.getEnumTranslations({
languageCode,
id: 'assetClass',
values: Object.values(AssetClass)
});
const assetSubClassTranslations = this.getEnumTranslations({
languageCode,
id: 'assetSubClass',
values: Object.values(AssetSubClass)
});
const holdingsTableRows = Object.values(holdings) const holdingsTableRows = Object.values(holdings)
.sort((a, b) => { .sort((a, b) => {
return b.allocationInPercentage - a.allocationInPercentage; return b.allocationInPercentage - a.allocationInPercentage;
@ -134,21 +147,11 @@ export class AiService {
break; break;
case 'ASSET_CLASS': case 'ASSET_CLASS':
row[name] = assetClass row[name] = assetClassTranslations[assetClass] ?? '';
? this.i18nService.getTranslation({
languageCode,
id: `assetClass.${assetClass}`
}) || assetClass
: '';
break; break;
case 'ASSET_SUB_CLASS': case 'ASSET_SUB_CLASS':
row[name] = assetSubClass row[name] = assetSubClassTranslations[assetSubClass] ?? '';
? this.i18nService.getTranslation({
languageCode,
id: `assetSubClass.${assetSubClass}`
}) || assetSubClass
: '';
break; break;
case 'CURRENCY': case 'CURRENCY':
@ -214,4 +217,27 @@ export class AiService {
`Provide your answer in the following language: ${languageCode}.` `Provide your answer in the following language: ${languageCode}.`
].join('\n'); ].join('\n');
} }
private getEnumTranslations<T extends string>({
id,
languageCode,
values
}: {
id: string;
languageCode: string;
values: T[];
}) {
return values.reduce(
(translations, value) => {
translations[value] =
this.i18nService.getTranslation({
languageCode,
id: `${id}.${value}`
}) || value;
return translations;
},
{} as Record<T, string>
);
}
} }

10
apps/api/src/services/i18n/i18n.service.ts

@ -25,15 +25,21 @@ export class I18nService implements OnModuleInit {
languageCode: string; languageCode: string;
placeholders?: Record<string, string | number>; placeholders?: Record<string, string | number>;
}): string { }): string {
const $ = this.translations[languageCode]; const languageCodeToUse = this.translations[languageCode]
? languageCode
: DEFAULT_LANGUAGE_CODE;
const $ = this.translations[languageCodeToUse];
if (!$) { if (!$) {
this.logger.warn(`Translation not found for locale '${languageCode}'`); this.logger.warn(`Translation not found for locale '${languageCode}'`);
return '';
} }
let translatedText = $( let translatedText = $(
`trans-unit[id="${id}"] > ${ `trans-unit[id="${id}"] > ${
languageCode === DEFAULT_LANGUAGE_CODE ? 'source' : 'target' languageCodeToUse === DEFAULT_LANGUAGE_CODE ? 'source' : 'target'
}` }`
).text(); ).text();

Loading…
Cancel
Save