cmux/web/i18n/request.ts
Austin Wang 100612d96e
Fix locale page crashes under Google Translate (#1956)
* fix(web): fall back to English for missing locale keys

* fix(web): stabilize translated homepage typing
2026-03-22 16:55:00 -07:00

59 lines
1.6 KiB
TypeScript

import { getRequestConfig } from "next-intl/server";
import type { AbstractIntlMessages } from "next-intl";
import { routing } from "./routing";
function deepMergeMessages(
base: AbstractIntlMessages,
override: AbstractIntlMessages,
): AbstractIntlMessages {
const result: AbstractIntlMessages = { ...base };
for (const key of Object.keys(override)) {
const baseValue = result[key];
const overrideValue = override[key];
if (
typeof baseValue === "object" &&
baseValue !== null &&
!Array.isArray(baseValue) &&
typeof overrideValue === "object" &&
overrideValue !== null &&
!Array.isArray(overrideValue)
) {
result[key] = deepMergeMessages(
baseValue as AbstractIntlMessages,
overrideValue as AbstractIntlMessages,
);
} else {
result[key] = overrideValue;
}
}
return result;
}
export default getRequestConfig(async ({ requestLocale }) => {
let locale = await requestLocale;
if (!locale || !routing.locales.includes(locale as typeof routing.locales[number])) {
locale = routing.defaultLocale;
}
const localeMessages = (await import(`../messages/${locale}.json`)).default;
if (locale === routing.defaultLocale) {
return {
locale,
messages: localeMessages,
};
}
const defaultMessages = (await import(`../messages/${routing.defaultLocale}.json`)).default;
return {
locale,
// Keep localized pages rendering when a non-English bundle is missing
// a key that still exists in English.
messages: deepMergeMessages(defaultMessages, localeMessages),
};
});