Files
e-tib.com/i18n/request.ts
Marc Mintel d14122005d Initial commit: E-TIB production hardening & E2E foundation
Former-commit-id: ef04fca3d76375630c05aac117bf586953f3b657
2026-04-28 19:11:38 +02:00

47 lines
1.5 KiB
TypeScript

import { getRequestConfig } from 'next-intl/server';
import * as Sentry from '@sentry/nextjs';
export default getRequestConfig(async ({ requestLocale }) => {
// Hardened locale validation: only allow 'en' or 'de'
// Use a temporary variable to validate before assigning to locale
const rawLocale = await requestLocale;
const supportedLocales = ['en', 'de'];
const locale =
typeof rawLocale === 'string' && supportedLocales.includes(rawLocale) ? rawLocale : 'de';
// Silent fallback for missing locales to support internal requests (e.g. OG generation)
if (!rawLocale || !supportedLocales.includes(rawLocale as string)) {
// console.debug(`[i18n] Fallback to "de" for locale: "${rawLocale}"`);
}
console.log(`[i18n] Resolved locale: ${locale}`);
let messages;
try {
messages = (await import(`../messages/${locale}.json`)).default;
console.log(`[i18n] Loaded messages for ${locale}`);
} catch (error) {
console.error(`[i18n] Error loading messages for ${locale}:`, error);
messages = {};
}
return {
locale,
messages,
onError(error) {
if (error.code === 'MISSING_MESSAGE') {
console.error('[i18n] Missing message:', error.message);
} else {
console.error('[i18n] Error:', error);
}
Sentry.captureException(error);
},
getMessageFallback({ namespace, key, error }) {
const path = [namespace, key].filter((part) => part != null).join('.');
if (error.code === 'MISSING_MESSAGE') {
return path;
}
return 'fallback';
},
} as any;
});