B2B-88: add starter kit structure and elements
This commit is contained in:
47
packages/i18n/src/i18n-provider.tsx
Normal file
47
packages/i18n/src/i18n-provider.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
'use client';
|
||||
|
||||
import type { InitOptions, i18n } from 'i18next';
|
||||
|
||||
import { initializeI18nClient } from './i18n.client';
|
||||
|
||||
let i18nInstance: i18n;
|
||||
|
||||
type Resolver = (
|
||||
lang: string,
|
||||
namespace: string,
|
||||
) => Promise<Record<string, string>>;
|
||||
|
||||
export function I18nProvider({
|
||||
settings,
|
||||
children,
|
||||
resolver,
|
||||
}: React.PropsWithChildren<{
|
||||
settings: InitOptions;
|
||||
resolver: Resolver;
|
||||
}>) {
|
||||
useI18nClient(settings, resolver);
|
||||
|
||||
return children;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name useI18nClient
|
||||
* @description A hook that initializes the i18n client.
|
||||
* @param settings
|
||||
* @param resolver
|
||||
*/
|
||||
function useI18nClient(settings: InitOptions, resolver: Resolver) {
|
||||
if (
|
||||
!i18nInstance ||
|
||||
i18nInstance.language !== settings.lng ||
|
||||
i18nInstance.options.ns?.length !== settings.ns?.length
|
||||
) {
|
||||
throw loadI18nInstance(settings, resolver);
|
||||
}
|
||||
|
||||
return i18nInstance;
|
||||
}
|
||||
|
||||
async function loadI18nInstance(settings: InitOptions, resolver: Resolver) {
|
||||
i18nInstance = await initializeI18nClient(settings, resolver);
|
||||
}
|
||||
Reference in New Issue
Block a user