UNPKG

next-language-detector

Version:

This package helps to handle language detection in next.js when using static servers only.

97 lines (94 loc) 4.27 kB
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties'; import I18NextLanguageDetector from 'i18next-browser-languagedetector'; var _excluded = ["supportedLngs", "fallbackLng", "order"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var capitalize = function capitalize(string) { return string.charAt(0).toUpperCase() + string.slice(1); }; var formatLanguageCode = function formatLanguageCode(code) { if (typeof code === 'string' && code.indexOf('-') > -1) { var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab']; var p = code.split('-'); if (p.length === 2) { p[0] = p[0].toLowerCase(); p[1] = p[1].toUpperCase(); if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); } else if (p.length === 3) { p[0] = p[0].toLowerCase(); if (p[1].length === 2) p[1] = p[1].toUpperCase(); if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase(); if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase()); } return p.join('-'); } return code; }; var getLanguagePartFromCode = function getLanguagePartFromCode(code) { if (!code || code.indexOf('-') < 0) return code; var p = code.split('-'); return formatLanguageCode(p[0]); }; var makeGetBestMatchFromCodes = function makeGetBestMatchFromCodes(_ref) { var supportedLngs = _ref.supportedLngs, fallbackLng = _ref.fallbackLng; return function (codes) { if (!codes) return null; var isSupportedCode = function isSupportedCode(code) { return !supportedLngs || !supportedLngs.length || supportedLngs.indexOf(code) > -1; }; var found; codes.forEach(function (code) { if (found) return; var cleanedLng = formatLanguageCode(code); if (!supportedLngs || isSupportedCode(cleanedLng)) found = cleanedLng; }); if (!found && supportedLngs) { codes.forEach(function (code) { if (found) return; var lngOnly = getLanguagePartFromCode(code); if (isSupportedCode(lngOnly)) { found = lngOnly; return; } found = supportedLngs.find(function (supportedLng) { if (supportedLng.indexOf(lngOnly) === 0) return supportedLng; return undefined; }); }); } if (!found) found = fallbackLng; return found; }; }; function LanguageDetector() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, supportedLngs = _ref2.supportedLngs, fallbackLng = _ref2.fallbackLng, _ref2$order = _ref2.order, order = _ref2$order === void 0 ? ['querystring', 'cookie', 'localStorage', 'sessionStorage', 'navigator', 'htmlTag'] : _ref2$order, rest = _objectWithoutProperties(_ref2, _excluded); var getBestMatchFromCodes = makeGetBestMatchFromCodes({ supportedLngs: supportedLngs, fallbackLng: fallbackLng }); var languageDetector = new I18NextLanguageDetector({ languageUtils: { getBestMatchFromCodes: getBestMatchFromCodes } }, _objectSpread({ order: order }, rest)); return { detect: function detect(order) { var detectedLngs = languageDetector.detect(order); return getBestMatchFromCodes(detectedLngs); }, cache: function cache(lng, caches) { return languageDetector.cacheUserLanguage(lng, caches); } }; } export { LanguageDetector as default };