Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 8s
Build & Deploy / 🧪 QA (push) Successful in 1m24s
Build & Deploy / 🏗️ Build (push) Successful in 3m49s
Build & Deploy / 🚀 Deploy (push) Successful in 31s
Build & Deploy / 🧪 Smoke Test (push) Failing after 53s
Build & Deploy / 🔔 Notify (push) Successful in 2s
37 lines
1.2 KiB
TypeScript
37 lines
1.2 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 : 'en';
|
|
|
|
// 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 "en" for locale: "${rawLocale}"`);
|
|
}
|
|
|
|
return {
|
|
locale,
|
|
messages: (await import(`../messages/${locale}.json`)).default,
|
|
onError(error) {
|
|
if (error.code === 'MISSING_MESSAGE') {
|
|
console.error(error.message);
|
|
} else {
|
|
console.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;
|
|
});
|