Files
portfolio/app/api/messages/route.ts
2026-01-22 20:56:35 +01:00

95 lines
2.6 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { getLocalizedMessage } from '@/lib/i18n-loader';
import enMessages from '@/messages/en.json';
import deMessages from '@/messages/de.json';
// Cache für 5 Minuten
export const revalidate = 300;
const messagesMap = { en: enMessages, de: deMessages };
/**
* GET /api/messages?locale=en
* Lädt ALLE Messages aus Directus + JSON Fallback
* Wird von next-intl als messages source verwendet
*/
export async function GET(req: NextRequest) {
const locale = req.nextUrl.searchParams.get('locale') || 'en';
// Normalize locale (de-DE -> de)
const normalizedLocale = locale.startsWith('de') ? 'de' : 'en';
try {
// Starte mit JSON als Basis
const jsonMessages = messagesMap[normalizedLocale as 'en' | 'de'];
// Clone das Objekt
const messages = JSON.parse(JSON.stringify(jsonMessages));
// Flatten alle Keys
const allKeys = getAllKeys(messages);
// Lade jeden Key aus Directus (überschreibt JSON wenn vorhanden)
await Promise.all(
allKeys.map(async (key) => {
try {
const value = await getLocalizedMessage(key, locale);
if (value && value !== key) {
// Überschreibe den Wert im messages Objekt
setNestedValue(messages, key, value);
}
} catch (error) {
// Fallback auf JSON Wert (schon vorhanden)
}
})
);
return NextResponse.json(messages, {
headers: {
'Cache-Control': 'public, s-maxage=300, stale-while-revalidate=600',
},
});
} catch (error) {
console.error('Messages API error:', error);
// Fallback: Return nur JSON messages
return NextResponse.json(messagesMap[normalizedLocale as 'en' | 'de'], {
headers: {
'Cache-Control': 'public, s-maxage=60',
},
});
}
}
// Helper: Sammle alle Keys aus verschachteltem Objekt
function getAllKeys(obj: any, prefix = ''): string[] {
const keys: string[] = [];
for (const [key, value] of Object.entries(obj)) {
const fullKey = prefix ? `${prefix}.${key}` : key;
if (value && typeof value === 'object' && !Array.isArray(value)) {
keys.push(...getAllKeys(value, fullKey));
} else {
keys.push(fullKey);
}
}
return keys;
}
// Helper: Setze Wert in verschachteltem Objekt
function setNestedValue(obj: any, path: string, value: any) {
const keys = path.split('.');
const lastKey = keys.pop()!;
let current = obj;
for (const key of keys) {
if (!(key in current)) {
current[key] = {};
}
current = current[key];
}
current[lastKey] = value;
}