UNPKG

next-i18next-static-site

Version:

i18next solution for static sites build with Next.js (static HTML export / next export)

215 lines (213 loc) 7.03 kB
var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); // src/index.tsx import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import Cookies from "js-cookie"; import i18next from "i18next"; import { initReactI18next, useTranslation, withTranslation, Translation, Trans } from "react-i18next"; var env = { languages: ["en"], defaultLanguage: "en", namespaces: ["common"], defaultNamespace: "common" }; try { if (process.env.NEXT_PUBLIC_I18N_LANGUAGES) { env.languages = JSON.parse(process.env.NEXT_PUBLIC_I18N_LANGUAGES); } else { throw new Error("NEXT_PUBLIC_I18N_LANGUAGES not set"); } if (process.env.NEXT_PUBLIC_I18N_DEFAULT_LANGUAGE) { env.defaultLanguage = process.env.NEXT_PUBLIC_I18N_DEFAULT_LANGUAGE; } else { throw new Error("NEXT_PUBLIC_I18N_DEFAULT_LANGUAGE not set"); } if (process.env.NEXT_PUBLIC_I18N_NAMESPACES) { env.namespaces = JSON.parse(process.env.NEXT_PUBLIC_I18N_NAMESPACES); } else { throw new Error("NEXT_PUBLIC_I18N_NAMESPACES not set"); } if (process.env.NEXT_PUBLIC_I18N_DEFAULT_NAMESPACE) { env.defaultNamespace = process.env.NEXT_PUBLIC_I18N_DEFAULT_NAMESPACE; } else { throw new Error("NEXT_PUBLIC_I18N_DEFAULT_NAMESPACE not set"); } if (process.env.NEXT_PUBLIC_I18N_OPTIONS) { try { env.options = JSON.parse(process.env.NEXT_PUBLIC_I18N_OPTIONS); } catch (err) { throw new Error("NEXT_PUBLIC_I18N_OPTIONS malformed"); } } } catch (err) { console.log(err); } var defaultConfig = { allowHydration: true, languages: ["en"], defaultLanguage: "en", namespaces: ["common"], defaultNamespace: "common", cookieName: "lang", // optional set cookie options, reference:[MDN Set-Cookie docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) cookieOptions: { expires: 365, path: "/" } }; var config = __spreadProps(__spreadValues(__spreadValues({}, defaultConfig), env.options), { languages: env.languages, defaultLanguage: env.defaultLanguage, namespaces: env.namespaces, defaultNamespace: env.defaultNamespace }); var languages = config.languages; var defaultLanguage = config.defaultLanguage; var namespaces = config.namespaces; var defaultNamespace = config.defaultNamespace; var defaultNamespace2 = config.defaultNamespace; var cookieName = config.cookieName; var createI18nextInstance = (options) => { const plugins = [ // initReactI18next ]; plugins.map((plugin) => i18next.use(plugin)); plugins.map((plugin) => i18next.use(plugin)); i18next.init(__spreadValues(__spreadValues({ resources: options.locales, cleanCode: true, lng: options.language, supportedLngs: config.languages, fallbackLng: options.language ? options.language : config.defaultLanguage, ns: config.namespaces, // String or array of namespaces to load defaultNS: config.defaultNamespace, // Default namespace used if not passed to translation function interpolation: { escapeValue: false // Not needed for react as it escapes by default }, react: { useSuspense: false // Not compatible with SSR }, load: "languageOnly" }, config), options)); return i18next; }; var globalI18nextInstance = null; var i18nextInstance = (options) => { if (!globalI18nextInstance) { globalI18nextInstance = createI18nextInstance(options); return globalI18nextInstance; } else { globalI18nextInstance.changeLanguage(options.language); return globalI18nextInstance; } }; var loaded = false; var I18nProvider = (props) => { var _a; const [hydration, setHydration] = useState(false); const options = __spreadValues(__spreadValues({}, config), props.i18n); if (!((_a = props.i18n) == null ? void 0 : _a.locales)) { throw new Error("locales object was not passed into I18nProvider"); } const router = useRouter(); const { asPath, query } = router; const slug = asPath.split("/")[1]; const langSlug = config.languages.includes(slug) && slug; const language = (query.lang || langSlug || config.defaultLanguage).toString(); const pathLocale = (query.lang || langSlug).toString(); if (pathLocale && pathLocale !== "false") { Cookies.set(config.cookieName, pathLocale, config.cookieOptions); } if (!loaded) { i18nextInstance(__spreadProps(__spreadValues({}, props.i18n), { language })); } const { i18n: i18n2 } = useTranslation(); useEffect(() => { i18n2.services.resourceStore.data = props.i18n.locales; i18n2.changeLanguage(language); }, [i18n2, language, props.i18n.locales]); useEffect(() => { loaded = true; i18n2.changeLanguage(language); }, [i18n2, language]); useEffect(() => { const hasWindow = typeof window !== "undefined"; if (hasWindow && options.allowHydration) { setHydration(true); } }, [options.allowHydration]); return hydration ? props.children : null; }; function getAllLanguageSlugs() { return config.languages.map((lang) => { return { params: { lang } }; }); } function getLanguage(lang) { return config.languages.includes(lang) ? lang : config.defaultLanguage; } var useLanguageDetection = () => { const router = useRouter(); useEffect(() => { let cookieLocale = Cookies.get(cookieName) || void 0; let browserLocale = (navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language) || void 0; if (browserLocale) { browserLocale = browserLocale.slice(0, 2); } if (cookieLocale && languages.includes(cookieLocale)) { router.push("/" + cookieLocale); } else if (browserLocale && languages.includes(browserLocale)) { router.push("/" + browserLocale); } else { router.push("/" + defaultLanguage); } }, [router, defaultLanguage]); return null; }; var languageDetection = () => { throw Error("Rename languageDetection() to useLanguageDetection()"); }; export { I18nProvider, Trans, Translation, cookieName, defaultLanguage, defaultNamespace, defaultNamespace2, getAllLanguageSlugs, getLanguage, i18nextInstance, languageDetection, languages, namespaces, useLanguageDetection, useTranslation, withTranslation };