@gasket/plugin-intl
Version:
NodeJS script to build localization files.
69 lines (68 loc) • 2.55 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, /**
* Get the preferred locale from the request headers.
* @type {import('../internal.d.ts').getPreferredLocale}
*/ "default", {
enumerable: true,
get: function() {
return getPreferredLocale;
}
});
const _debug = /*#__PURE__*/ _interop_require_default(require("debug"));
const _configureutils = require("./configure-utils.cjs");
const _negotiator = /*#__PURE__*/ _interop_require_default(require("negotiator"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debugLog = (0, _debug.default)('gasket:plugin:intl:utils');
/**
* Capitalize the first letter of a string.
* @param {string} str - String to capitalize
* @returns {string} capitalized string
*/ function capitalize(str) {
return str[0].toUpperCase() + str.substring(1).toLowerCase();
}
/**
* Ensure consistent locale format coming from accept-language header.
* @example
* - az-AZ
* - az-Arab
* - az-AZ-Latn
* @type {import('../internal.d.ts').formatLocale}
*/ function formatLocale(language) {
const [lang, ...rest] = language ? language.split('-') : [];
return [
lang.toLowerCase(),
...rest.map((o)=>o.length === 2 ? o.toUpperCase() : capitalize(o))
].join('-');
}
/**
* Get the preferred locale from the request headers.
* @type {import('../internal.d.ts').getLocaleFromHeaders}
*/ function getLocaleFromHeaders(gasket, req, locales, defaultLocale) {
let preferredLocale = defaultLocale;
/** @type {string} */ const acceptLanguage = req.headers['accept-language'];
const negotiator = new _negotiator.default(req);
if (acceptLanguage) {
debugLog(`Received accept-language of ${acceptLanguage}`);
try {
// Get highest or highest from locales if configured
preferredLocale = formatLocale(negotiator.language(locales));
debugLog(`Using ${preferredLocale} as starting locale`);
} catch (error) {
gasket.logger.debug(`Unable to parse accept-language header: ${error.message}`);
}
} else {
debugLog(`No accept-language header; starting with default ${preferredLocale}`);
}
return preferredLocale;
}
function getPreferredLocale(gasket, req) {
const { defaultLocale, locales } = (0, _configureutils.getIntlConfig)(gasket);
const preferredLocale = getLocaleFromHeaders(gasket, req, locales, defaultLocale);
return preferredLocale;
}