This commit is contained in:
David Nguyen
2025-02-03 19:52:23 +11:00
parent b2af10173a
commit 8bffa7c3ed
40 changed files with 1012 additions and 979 deletions

View File

@ -1,19 +1,19 @@
import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies';
import type { I18n, MessageDescriptor } from '@lingui/core';
import { i18n } from '@lingui/core';
import type { I18nLocaleData, SupportedLanguageCodes } from '../constants/i18n';
import { APP_I18N_OPTIONS } from '../constants/i18n';
import { env } from './env';
export async function dynamicActivate(i18nInstance: I18n, locale: string) {
export async function dynamicActivate(locale: string) {
const extension = env('NODE_ENV') === 'development' ? 'po' : 'js';
// const { messages } = await import(`../translations/${locale}/web.${extension}`);
// todo
const messages = {};
// Todo: Use extension (currently breaks).
i18nInstance.loadAndActivate({ locale, messages });
// const { messages } = await import(`../translations/${locale}/web.${extension}`);
const { messages } = await import(`../translations/${locale}/web.po`);
i18n.loadAndActivate({ locale, messages });
}
const parseLanguageFromLocale = (locale: string): SupportedLanguageCodes | null => {
@ -30,25 +30,6 @@ const parseLanguageFromLocale = (locale: string): SupportedLanguageCodes | null
return foundSupportedLanguage;
};
/**
* Extract the language if supported from the cookies header.
*
* Returns `null` if not supported or not found.
*/
export const extractLocaleDataFromCookies = (
cookies: ReadonlyRequestCookies,
): SupportedLanguageCodes | null => {
const preferredLocale = cookies.get('language')?.value || '';
const language = parseLanguageFromLocale(preferredLocale || '');
if (!language) {
return null;
}
return language;
};
/**
* Extracts the language from the `accept-language` header.
*/
@ -67,30 +48,24 @@ export const extractLocaleDataFromHeaders = (
type ExtractLocaleDataOptions = {
headers: Headers;
cookies: ReadonlyRequestCookies;
};
/**
* Extract the supported language from the cookies, then header if not found.
* Extract the supported language from the header.
*
* Will return the default fallback language if not found.
*/
export const extractLocaleData = ({
headers,
cookies,
}: ExtractLocaleDataOptions): I18nLocaleData => {
let lang: SupportedLanguageCodes | null = extractLocaleDataFromCookies(cookies);
export const extractLocaleData = ({ headers }: ExtractLocaleDataOptions): I18nLocaleData => {
const headerLocales = (headers.get('accept-language') ?? '').split(',');
const langHeader = extractLocaleDataFromHeaders(headers);
if (!lang && langHeader?.lang) {
lang = langHeader.lang;
}
const unknownLanguages = headerLocales
.map((locale) => parseLanguageFromLocale(locale))
.filter((value): value is SupportedLanguageCodes => value !== null);
// Filter out locales that are not valid.
const locales = (langHeader?.locales ?? []).filter((locale) => {
const languages = (unknownLanguages ?? []).filter((language) => {
try {
new Intl.Locale(locale);
new Intl.Locale(language);
return true;
} catch {
return false;
@ -98,8 +73,8 @@ export const extractLocaleData = ({
});
return {
lang: lang || APP_I18N_OPTIONS.sourceLang,
locales,
lang: languages[0] || APP_I18N_OPTIONS.sourceLang,
locales: headerLocales,
};
};