diff --git a/src/services/locale.ts b/src/services/locale.ts index 29051152..b4251e72 100644 --- a/src/services/locale.ts +++ b/src/services/locale.ts @@ -1,16 +1,36 @@ 'use server'; -import {cookies} from 'next/headers'; -import {Locale, defaultLocale} from '@/i18n/config'; +import {cookies, headers} from 'next/headers'; +import {Locale, defaultLocale, locales} from '@/i18n/config'; // In this example the locale is read from a cookie. You could alternatively // also read it from a database, backend service, or any other source. const COOKIE_NAME = 'NEXT_LOCALE'; -export async function getUserLocale() { - return (await cookies()).get(COOKIE_NAME)?.value || defaultLocale; +export async function getUserLocale(): Promise { + const cookieLocale = (await cookies()).get(COOKIE_NAME)?.value; + + if (cookieLocale && locales.includes(cookieLocale as Locale)) { + return cookieLocale as Locale; + } + + const headerList = await headers(); + const acceptLang = headerList.get('accept-language'); + + if (acceptLang) { + const browserLang = acceptLang.split(',')[0]; + const matched = locales.find((locale) => + browserLang.toLowerCase().startsWith(locale.split('-')[0].toLowerCase()) + ); + if (matched) { + return matched; + } + } + + return defaultLocale; } + export async function setUserLocale(locale: Locale) { (await cookies()).set(COOKIE_NAME, locale); }