Files
v10/dist/dev/i18n/context.js

36 lines
1.2 KiB
JavaScript

"use client";
import { createTranslator, getI18nTranslations, onI18nRegistryChange } from "@videojs/core/i18n";
import { createContext, useContext, useEffect, useMemo, useReducer } from "react";
//#region src/i18n/context.tsx
/** React context carrying the active translator and locale. @public */
const I18nContext = createContext(null);
const LocaleRootContext = createContext(void 0);
/**
* Returns the translator for the nearest `I18nProvider`, or English defaults when none is mounted.
*
* @public
*/
function useTranslator() {
const ctx = useContext(I18nContext);
const [registryEpoch, invalidateRegistry] = useReducer((epoch) => epoch + 1, 0);
useEffect(() => {
return onI18nRegistryChange(() => invalidateRegistry());
}, []);
const fallback = useMemo(() => {
return createTranslator(getI18nTranslations("en"), "en");
}, [registryEpoch]);
if (!ctx) return fallback;
return ctx.translator;
}
/**
* Returns the active BCP 47 locale tag from the nearest `I18nProvider`, or `'en'` when none is mounted.
*
* @public
*/
function useLocale() {
return useContext(I18nContext)?.locale ?? "en";
}
//#endregion
export { I18nContext, LocaleRootContext, useLocale, useTranslator };
//# sourceMappingURL=context.js.map