From 53a957dc493bdf9fa72a9fd29e8e29ff8522ede3 Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Wed, 28 May 2025 09:44:41 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20locale=20fallback=20mechan?= =?UTF-8?q?ism=20(#1734)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/middleware.ts | 16 +++++----------- packages/languages/src/get-preferred-locale.ts | 13 ++++++++----- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts index 70b2b5590..71a048d83 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/middleware.ts @@ -1,12 +1,9 @@ -import languages from "@rallly/languages"; import { getPreferredLocale } from "@rallly/languages/get-preferred-locale"; import { getPosthogBootstrapCookie } from "@rallly/posthog/utils"; import { NextResponse } from "next/server"; import { withAuth } from "@/auth/edge"; -const supportedLocales = Object.keys(languages); - export const middleware = withAuth(async (req) => { const { nextUrl } = req; const newUrl = nextUrl.clone(); @@ -19,15 +16,12 @@ export const middleware = withAuth(async (req) => { return NextResponse.redirect(newUrl); } - const locale = - req.auth?.user?.locale || - getPreferredLocale({ - acceptLanguageHeader: req.headers.get("accept-language") ?? undefined, - }); + const locale = getPreferredLocale({ + userLocale: req.auth?.user?.locale ?? undefined, + acceptLanguageHeader: req.headers.get("accept-language") ?? undefined, + }); - if (supportedLocales.includes(locale)) { - newUrl.pathname = `/${locale}${pathname}`; - } + newUrl.pathname = `/${locale}${pathname}`; const res = NextResponse.rewrite(newUrl); res.headers.set("x-locale", locale); diff --git a/packages/languages/src/get-preferred-locale.ts b/packages/languages/src/get-preferred-locale.ts index cb306abe3..4f5812a59 100644 --- a/packages/languages/src/get-preferred-locale.ts +++ b/packages/languages/src/get-preferred-locale.ts @@ -1,14 +1,18 @@ import { match } from "@formatjs/intl-localematcher"; import Negotiator from "negotiator"; -import languages, { defaultLocale } from "./index"; - -const locales = Object.keys(languages); +import { defaultLocale, supportedLngs } from "./index"; export function getPreferredLocale({ + userLocale, acceptLanguageHeader, }: { + userLocale?: string; acceptLanguageHeader?: string; }) { + if (userLocale && supportedLngs.includes(userLocale)) { + return userLocale; + } + if (!acceptLanguageHeader) { return defaultLocale; } @@ -22,9 +26,8 @@ export function getPreferredLocale({ .filter((lang) => lang !== "*"); try { - return match(preferredLanguages, locales, defaultLocale); + return match(preferredLanguages, supportedLngs, defaultLocale); } catch (e) { - console.warn("Failed to match locale", e); return defaultLocale; } }