This commit adds a new 'languagePriority' key to the feature flags configuration. It determines whether to use user's preferred language or the application's default language. Adjustments to the language selection process according to new flag have been made in the 'createInstance' function in 'i18n.server.ts'. Additionally, updates have been made to 'README.md' and '.env' files to reflect these changes.
77 lines
2.1 KiB
TypeScript
77 lines
2.1 KiB
TypeScript
import { cache } from 'react';
|
|
|
|
import { cookies, headers } from 'next/headers';
|
|
|
|
import {
|
|
initializeServerI18n,
|
|
parseAcceptLanguageHeader,
|
|
} from '@kit/i18n/server';
|
|
|
|
import featuresFlagConfig from '~/config/feature-flags.config';
|
|
import {
|
|
I18N_COOKIE_NAME,
|
|
getI18nSettings,
|
|
languages,
|
|
} from '~/lib/i18n/i18n.settings';
|
|
|
|
import { i18nResolver } from './i18n.resolver';
|
|
|
|
/**
|
|
* @name priority
|
|
* @description The language priority setting from the feature flag configuration.
|
|
*/
|
|
const priority = featuresFlagConfig.languagePriority;
|
|
|
|
/**
|
|
* @name createI18nServerInstance
|
|
* @description Creates an instance of the i18n server.
|
|
* It uses the language from the cookie if it exists, otherwise it uses the language from the accept-language header.
|
|
* If neither is available, it will default to the provided environment variable.
|
|
*
|
|
* Initialize the i18n instance for every RSC server request (eg. each page/layout)
|
|
*/
|
|
function createInstance() {
|
|
const cookie = cookies().get(I18N_COOKIE_NAME)?.value;
|
|
|
|
let selectedLanguage: string | undefined = undefined;
|
|
|
|
// if the cookie is set, use the language from the cookie
|
|
if (cookie) {
|
|
selectedLanguage = getLanguageOrFallback(cookie);
|
|
}
|
|
|
|
// if not, check if the language priority is set to user and
|
|
// use the user's preferred language
|
|
if (!selectedLanguage && priority === 'user') {
|
|
const userPreferredLanguage = getPreferredLanguageFromBrowser();
|
|
|
|
selectedLanguage = getLanguageOrFallback(userPreferredLanguage);
|
|
}
|
|
|
|
const settings = getI18nSettings(selectedLanguage);
|
|
|
|
return initializeServerI18n(settings, i18nResolver);
|
|
}
|
|
|
|
export const createI18nServerInstance = cache(createInstance);
|
|
|
|
function getPreferredLanguageFromBrowser() {
|
|
const acceptLanguage = headers().get('accept-language');
|
|
|
|
return parseAcceptLanguageHeader(acceptLanguage, languages)[0];
|
|
}
|
|
|
|
function getLanguageOrFallback(language: string | undefined) {
|
|
let selectedLanguage = language;
|
|
|
|
if (!languages.includes(language ?? '')) {
|
|
console.warn(
|
|
`Language "${language}" is not supported. Falling back to "${languages[0]}"`,
|
|
);
|
|
|
|
selectedLanguage = languages[0];
|
|
}
|
|
|
|
return selectedLanguage;
|
|
}
|