import React, {Suspense, Fragment} from 'react';
import i18n from './i18n';
import WrapRoot from './wrap-root';
import getLangFromPath from './utils/getLangFromPath';
import {i18nextOptions as defaultI18nextOptions} from './defaultOptions';
import {PluginOptions, ResourceBundle} from './types';
import {I18nextProvider} from 'react-i18next';
import preferDefault from './utils/preferDefault';
import {globalResourceBundleName} from './utils/const';
const getInitialLang = (pathname: string, options: PluginOptions) => {
const pathLang = getLangFromPath(pathname);
if (options.languages.includes(pathLang)) return pathLang;
if (options.languages.includes(navigator.language)) return navigator.language;
return options.defaultLng || 'en';
};
export const wrapRootElement = ({element}: any, options: PluginOptions) => {
const initialLang = getInitialLang(window.location.pathname, options);
const i18nextOptions = options.i18next || {};
i18n.init({
...defaultI18nextOptions,
...i18nextOptions,
lng: initialLang
});
const Fallback: React.ComponentType = preferDefault(
require(process.env.GATSBY_SUSPENSE_FALLBACK || '')
);
const MaybeSuspense = typeof document !== 'undefined' ? Suspense : Fragment;
if (options.embedTranslations) {
const resourceBundle: ResourceBundle[] = JSON.parse(
window[globalResourceBundleName]
);
resourceBundle.forEach(rb => {
Object.entries(rb.namespaces).forEach(([ns, bundle]) => {
i18n.addResourceBundle(rb.lang, ns, bundle);
});
});
}
return (
}>
{element}
);
};