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
JavaScript
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
};