UNPKG

@prezly/theme-kit-core

Version:

Data layer and utility library for developing Prezly themes with JavaScript

76 lines (70 loc) 4.17 kB
"use strict"; 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)); }