@prezly/theme-kit-core
Version:
Data layer and utility library for developing Prezly themes with JavaScript
76 lines (70 loc) • 4.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getAlternateLanguageLinks = getAlternateLanguageLinks;
var _themeKitIntl = require("@prezly/theme-kit-intl");
var _isNotUndefined = require("@technically/is-not-undefined");
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; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
// We use english locale as fallback since English is the most common language
var EN = 'en';
var X_DEFAULT = 'x-default';
var ALLOWED_FALLBACKS = {
en_US: 'en',
en_GB: 'en',
fr_FR: 'fr',
fr_CA: 'fr'
};
function getAlternateLanguageLinks(availableLanguages, generateTranslationUrl) {
var _links$EN;
var defaultLanguage = availableLanguages.find(lang => lang.is_default);
// Generate the translation URLs map for the exact locale codes
var translations = Object.fromEntries(availableLanguages.map(lang => [lang.code, generateTranslationUrl(lang.code)]));
// Initialize the links map with the existing translations
var links = _objectSpread({}, translations);
// Add selected languages as possible region-independent translations, if not present yet.
Object.entries(ALLOWED_FALLBACKS).forEach(_ref => {
var _links$langCode;
var [preferredFallbackLocale, langCode] = _ref;
links[langCode] = (_links$langCode = links[langCode]) !== null && _links$langCode !== void 0 ? _links$langCode : links[preferredFallbackLocale];
});
// Add any same-language version as region-independent fallback, if not present yet.
availableLanguages.forEach(lang => {
var _links$langCode2;
var {
code: localeCode,
lang: langCode
} = _themeKitIntl.Locale.from(lang.code);
links[langCode] = (_links$langCode2 = links[langCode]) !== null && _links$langCode2 !== void 0 ? _links$langCode2 : links[localeCode];
});
// Determine `x-default` version
links[X_DEFAULT] = // First we try to find region independent English locale (en)
// If the story has just region independent `en` translation we will use it as default hreflang
(_links$EN = links[EN]) !== null && _links$EN !== void 0 ? _links$EN :
// If there are no English translations at all we will use the default language (provided by the server)
defaultLanguage ? links[defaultLanguage.code] : undefined;
return Object.entries(links).map(_ref2 => {
var [hrefLang, href] = _ref2;
if (!href) {
// some of the fallbacks logic above can result in undefined Urls present in the map
return undefined;
}
if (hrefLang === X_DEFAULT) {
// `x-default` is not a valid locale code, so we can't pass it to the `Locale.from()` call.
return {
hrefLang: X_DEFAULT,
href,
type: 'x-default'
};
}
return {
hrefLang: _themeKitIntl.Locale.from(hrefLang).isoCode,
href,
type: translations[hrefLang] ? 'exact' : 'alias'
};
}).filter(_isNotUndefined.isNotUndefined).sort((a, b) => a.hrefLang.localeCompare(b.hrefLang));
}