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