* Initial plan * Initial analysis: understanding locale system issues Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Fix translation types to match actual component usage Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Add comprehensive locale system documentation and fix API route types Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Address code review feedback: improve readability and translate comments to English Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>
218 lines
6.1 KiB
TypeScript
218 lines
6.1 KiB
TypeScript
import { getLocalizedMessage } from '@/lib/i18n-loader';
|
|
import type {
|
|
NavTranslations,
|
|
FooterTranslations,
|
|
HeroTranslations,
|
|
AboutTranslations,
|
|
ProjectsTranslations,
|
|
ContactTranslations,
|
|
ConsentTranslations,
|
|
} from '@/types/translations';
|
|
|
|
/**
|
|
* Lädt alle Translations für eine Section aus Directus
|
|
* Nutzt optimierte Batch-Abfragen wo möglich
|
|
*/
|
|
|
|
export async function getNavTranslations(locale: string): Promise<NavTranslations> {
|
|
const [home, about, projects, contact] = await Promise.all([
|
|
getLocalizedMessage('nav.home', locale),
|
|
getLocalizedMessage('nav.about', locale),
|
|
getLocalizedMessage('nav.projects', locale),
|
|
getLocalizedMessage('nav.contact', locale),
|
|
]);
|
|
|
|
return { home, about, projects, contact };
|
|
}
|
|
|
|
export async function getFooterTranslations(locale: string): Promise<FooterTranslations> {
|
|
const [
|
|
role,
|
|
madeIn,
|
|
legalNotice,
|
|
privacyPolicy,
|
|
privacySettings,
|
|
privacySettingsTitle,
|
|
builtWith
|
|
] = await Promise.all([
|
|
getLocalizedMessage('footer.role', locale),
|
|
getLocalizedMessage('footer.madeIn', locale),
|
|
getLocalizedMessage('footer.legalNotice', locale),
|
|
getLocalizedMessage('footer.privacyPolicy', locale),
|
|
getLocalizedMessage('footer.privacySettings', locale),
|
|
getLocalizedMessage('footer.privacySettingsTitle', locale),
|
|
getLocalizedMessage('footer.builtWith', locale),
|
|
]);
|
|
|
|
return {
|
|
role,
|
|
madeIn,
|
|
legalNotice,
|
|
privacyPolicy,
|
|
privacySettings,
|
|
privacySettingsTitle,
|
|
builtWith,
|
|
};
|
|
}
|
|
|
|
export async function getHeroTranslations(locale: string): Promise<HeroTranslations> {
|
|
const keys = [
|
|
'home.hero.description',
|
|
'home.hero.ctaWork',
|
|
'home.hero.ctaContact',
|
|
'home.hero.features.f1',
|
|
'home.hero.features.f2',
|
|
'home.hero.features.f3',
|
|
];
|
|
|
|
const values = await Promise.all(keys.map(key => getLocalizedMessage(key, locale)));
|
|
|
|
return {
|
|
description: values[0],
|
|
ctaWork: values[1],
|
|
ctaContact: values[2],
|
|
features: {
|
|
f1: values[3],
|
|
f2: values[4],
|
|
f3: values[5],
|
|
},
|
|
};
|
|
}
|
|
|
|
export async function getAboutTranslations(locale: string): Promise<AboutTranslations> {
|
|
const keys = [
|
|
'home.about.title',
|
|
'home.about.p1',
|
|
'home.about.p2',
|
|
'home.about.p3',
|
|
'home.about.funFactTitle',
|
|
'home.about.funFactBody',
|
|
'home.about.techStackTitle',
|
|
'home.about.techStack.categories.frontendMobile',
|
|
'home.about.techStack.categories.backendDevops',
|
|
'home.about.techStack.categories.toolsAutomation',
|
|
'home.about.techStack.categories.securityAdmin',
|
|
'home.about.techStack.items.selfHostedServices',
|
|
'home.about.hobbiesTitle',
|
|
'home.about.hobbies.selfHosting',
|
|
'home.about.hobbies.gaming',
|
|
'home.about.hobbies.gameServers',
|
|
'home.about.hobbies.jogging',
|
|
];
|
|
|
|
const values = await Promise.all(keys.map(key => getLocalizedMessage(key, locale)));
|
|
|
|
return {
|
|
title: values[0],
|
|
p1: values[1],
|
|
p2: values[2],
|
|
p3: values[3],
|
|
funFactTitle: values[4],
|
|
funFactBody: values[5],
|
|
techStackTitle: values[6],
|
|
techStack: {
|
|
categories: {
|
|
frontendMobile: values[7],
|
|
backendDevops: values[8],
|
|
toolsAutomation: values[9],
|
|
securityAdmin: values[10],
|
|
},
|
|
items: {
|
|
selfHostedServices: values[11],
|
|
},
|
|
},
|
|
hobbiesTitle: values[12],
|
|
hobbies: {
|
|
selfHosting: values[13],
|
|
gaming: values[14],
|
|
gameServers: values[15],
|
|
jogging: values[16],
|
|
},
|
|
};
|
|
}
|
|
|
|
export async function getProjectsTranslations(locale: string): Promise<ProjectsTranslations> {
|
|
const [title, subtitle, viewAll] = await Promise.all([
|
|
getLocalizedMessage('home.projects.title', locale),
|
|
getLocalizedMessage('home.projects.subtitle', locale),
|
|
getLocalizedMessage('home.projects.viewAll', locale),
|
|
]);
|
|
|
|
return { title, subtitle, viewAll };
|
|
}
|
|
|
|
export async function getContactTranslations(locale: string): Promise<ContactTranslations> {
|
|
const keys = [
|
|
'home.contact.title',
|
|
'home.contact.subtitle',
|
|
'home.contact.getInTouch',
|
|
'home.contact.getInTouchBody',
|
|
'home.contact.form.title',
|
|
'home.contact.form.sending',
|
|
'home.contact.form.send',
|
|
'home.contact.form.placeholders.name',
|
|
'home.contact.form.placeholders.email',
|
|
'home.contact.form.placeholders.subject',
|
|
'home.contact.form.placeholders.message',
|
|
'home.contact.form.errors.nameRequired',
|
|
'home.contact.form.errors.nameMin',
|
|
'home.contact.form.errors.emailRequired',
|
|
'home.contact.form.errors.emailInvalid',
|
|
'home.contact.form.errors.subjectRequired',
|
|
'home.contact.form.errors.subjectMin',
|
|
'home.contact.form.errors.messageRequired',
|
|
'home.contact.form.errors.messageMin',
|
|
'home.contact.form.characters',
|
|
'home.contact.info.email',
|
|
'home.contact.info.location',
|
|
'home.contact.info.locationValue',
|
|
];
|
|
|
|
const values = await Promise.all(keys.map(key => getLocalizedMessage(key, locale)));
|
|
|
|
return {
|
|
title: values[0],
|
|
subtitle: values[1],
|
|
getInTouch: values[2],
|
|
getInTouchBody: values[3],
|
|
form: {
|
|
title: values[4],
|
|
sending: values[5],
|
|
send: values[6],
|
|
placeholders: {
|
|
name: values[7],
|
|
email: values[8],
|
|
subject: values[9],
|
|
message: values[10],
|
|
},
|
|
errors: {
|
|
nameRequired: values[11],
|
|
nameMin: values[12],
|
|
emailRequired: values[13],
|
|
emailInvalid: values[14],
|
|
subjectRequired: values[15],
|
|
subjectMin: values[16],
|
|
messageRequired: values[17],
|
|
messageMin: values[18],
|
|
},
|
|
characters: values[19],
|
|
},
|
|
info: {
|
|
email: values[20],
|
|
location: values[21],
|
|
locationValue: values[22],
|
|
},
|
|
};
|
|
}
|
|
|
|
export async function getConsentTranslations(locale: string): Promise<ConsentTranslations> {
|
|
const [title, description, accept, decline] = await Promise.all([
|
|
getLocalizedMessage('consent.title', locale),
|
|
getLocalizedMessage('consent.description', locale),
|
|
getLocalizedMessage('consent.accept', locale),
|
|
getLocalizedMessage('consent.decline', locale),
|
|
]);
|
|
|
|
return { title, description, accept, decline };
|
|
}
|