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; }