139 lines
4.3 KiB
JavaScript
139 lines
4.3 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
var intlLocalematcher = require('@formatjs/intl-localematcher');
|
|
var Negotiator = require('negotiator');
|
|
var utils = require('./utils.js');
|
|
|
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
|
var Negotiator__default = /*#__PURE__*/_interopDefault(Negotiator);
|
|
|
|
function findDomainFromHost(requestHeaders, domains) {
|
|
const host = utils.getHost(requestHeaders);
|
|
if (host) {
|
|
return domains.find(cur => cur.domain === host);
|
|
}
|
|
return undefined;
|
|
}
|
|
function orderLocales(locales) {
|
|
// Workaround for https://github.com/formatjs/formatjs/issues/4469
|
|
return locales.slice().sort((a, b) => b.length - a.length);
|
|
}
|
|
function getAcceptLanguageLocale(requestHeaders, locales, defaultLocale) {
|
|
let locale;
|
|
const languages = new Negotiator__default.default({
|
|
headers: {
|
|
'accept-language': requestHeaders.get('accept-language') || undefined
|
|
}
|
|
}).languages();
|
|
try {
|
|
const orderedLocales = orderLocales(locales);
|
|
locale = intlLocalematcher.match(languages, orderedLocales, defaultLocale);
|
|
} catch (_unused) {
|
|
// Invalid language
|
|
}
|
|
return locale;
|
|
}
|
|
function getLocaleFromCookie(routing, requestCookies) {
|
|
if (routing.localeCookie && requestCookies.has(routing.localeCookie.name)) {
|
|
var _requestCookies$get;
|
|
const value = (_requestCookies$get = requestCookies.get(routing.localeCookie.name)) === null || _requestCookies$get === void 0 ? void 0 : _requestCookies$get.value;
|
|
if (value && routing.locales.includes(value)) {
|
|
return value;
|
|
}
|
|
}
|
|
}
|
|
function resolveLocaleFromPrefix(routing, requestHeaders, requestCookies, pathname) {
|
|
let locale;
|
|
|
|
// Prio 1: Use route prefix
|
|
if (pathname) {
|
|
var _getPathnameMatch;
|
|
locale = (_getPathnameMatch = utils.getPathnameMatch(pathname, routing.locales, routing.localePrefix)) === null || _getPathnameMatch === void 0 ? void 0 : _getPathnameMatch.locale;
|
|
}
|
|
|
|
// Prio 2: Use existing cookie
|
|
if (!locale && routing.localeDetection) {
|
|
locale = getLocaleFromCookie(routing, requestCookies);
|
|
}
|
|
|
|
// Prio 3: Use the `accept-language` header
|
|
if (!locale && routing.localeDetection) {
|
|
locale = getAcceptLanguageLocale(requestHeaders, routing.locales, routing.defaultLocale);
|
|
}
|
|
|
|
// Prio 4: Use default locale
|
|
if (!locale) {
|
|
locale = routing.defaultLocale;
|
|
}
|
|
return locale;
|
|
}
|
|
function resolveLocaleFromDomain(routing, requestHeaders, requestCookies, pathname) {
|
|
const domains = routing.domains;
|
|
const domain = findDomainFromHost(requestHeaders, domains);
|
|
if (!domain) {
|
|
return {
|
|
locale: resolveLocaleFromPrefix(routing, requestHeaders, requestCookies, pathname)
|
|
};
|
|
}
|
|
let locale;
|
|
|
|
// Prio 1: Use route prefix
|
|
if (pathname) {
|
|
var _getPathnameMatch2;
|
|
const prefixLocale = (_getPathnameMatch2 = utils.getPathnameMatch(pathname, routing.locales, routing.localePrefix)) === null || _getPathnameMatch2 === void 0 ? void 0 : _getPathnameMatch2.locale;
|
|
if (prefixLocale) {
|
|
if (utils.isLocaleSupportedOnDomain(prefixLocale, domain)) {
|
|
locale = prefixLocale;
|
|
} else {
|
|
// Causes a redirect to a domain that supports the locale
|
|
return {
|
|
locale: prefixLocale,
|
|
domain
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
// Prio 2: Use existing cookie
|
|
if (!locale && routing.localeDetection) {
|
|
const cookieLocale = getLocaleFromCookie(routing, requestCookies);
|
|
if (cookieLocale) {
|
|
if (utils.isLocaleSupportedOnDomain(cookieLocale, domain)) {
|
|
locale = cookieLocale;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Prio 3: Use the `accept-language` header
|
|
if (!locale && routing.localeDetection) {
|
|
const headerLocale = getAcceptLanguageLocale(requestHeaders, domain.locales || routing.locales, domain.defaultLocale);
|
|
if (headerLocale) {
|
|
locale = headerLocale;
|
|
}
|
|
}
|
|
|
|
// Prio 4: Use default locale
|
|
if (!locale) {
|
|
locale = domain.defaultLocale;
|
|
}
|
|
return {
|
|
locale,
|
|
domain
|
|
};
|
|
}
|
|
function resolveLocale(routing, requestHeaders, requestCookies, pathname) {
|
|
if (routing.domains) {
|
|
return resolveLocaleFromDomain(routing, requestHeaders, requestCookies, pathname);
|
|
} else {
|
|
return {
|
|
locale: resolveLocaleFromPrefix(routing, requestHeaders, requestCookies, pathname)
|
|
};
|
|
}
|
|
}
|
|
|
|
exports.default = resolveLocale;
|
|
exports.getAcceptLanguageLocale = getAcceptLanguageLocale;
|