95 lines
2.6 KiB
TypeScript
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;
|
|
}
|