UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

242 lines (241 loc) 8.58 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.combineWithExternalTranslations = combineWithExternalTranslations; exports.default = useTranslation; exports.formatMessage = formatMessage; exports.renderMessage = renderMessage; exports.useAdditionalUtils = useAdditionalUtils; var _hasOwn = _interopRequireDefault(require("core-js-pure/stable/object/has-own.js")); var _react = _interopRequireWildcard(require("react")); var _Context = _interopRequireDefault(require("./Context.js")); var _index = _interopRequireDefault(require("./locales/index.js")); var _componentHelper = require("./component-helper.js"); var _br; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function useTranslation(messages, args) { const { locale, translation } = (0, _react.useContext)(_Context.default); const { translations: contextTranslations } = (0, _react.useContext)(_Context.default); const { assignUtils } = useAdditionalUtils(); const { extMessages, fallbackLocale, baseOverride, warnLabel } = (0, _react.useMemo)(() => { var _arg$fallbackLocale; const defaultLocaleKeys = Object.keys(_index.default); const defaultLocale = defaultLocaleKeys[0]; const arg = (0, _componentHelper.isObject)(messages) && ('messages' in messages || 'fallbackLocale' in messages) ? messages : { messages }; return { extMessages: arg.messages, fallbackLocale: (_arg$fallbackLocale = arg.fallbackLocale) !== null && _arg$fallbackLocale !== void 0 ? _arg$fallbackLocale : defaultLocale, baseOverride: arg.base, warnLabel: arg.warnLabel || 'useTranslation' }; }, [messages]); return (0, _react.useMemo)(() => { var _ref; const id = typeof messages === 'string' ? messages : undefined; if (id) { return formatMessage(id, args, translation); } let translationLocale = locale; if (locale.startsWith('en-') && !Object.keys(_index.default).some(l => l === locale)) { translationLocale = 'en-GB'; } const base = assignUtils(combineWithExternalTranslations({ translation: baseOverride || translation, messages: extMessages, locale: translationLocale })); if (!fallbackLocale) { return base; } const explicitMessages = extMessages; let hasExplicitCurrent = false; let currentMessages = undefined; if (explicitMessages && (0, _hasOwn.default)(explicitMessages, locale)) { hasExplicitCurrent = true; currentMessages = explicitMessages[locale]; } else if (contextTranslations && (0, _hasOwn.default)(contextTranslations, locale)) { hasExplicitCurrent = true; currentMessages = contextTranslations[locale]; } const fallbackMessages = (_ref = (explicitMessages === null || explicitMessages === void 0 ? void 0 : explicitMessages[fallbackLocale]) || (contextTranslations === null || contextTranslations === void 0 ? void 0 : contextTranslations[fallbackLocale]) || _index.default[fallbackLocale]) !== null && _ref !== void 0 ? _ref : undefined; if (!fallbackMessages || !hasExplicitCurrent) { return base; } const currentHasContent = (0, _componentHelper.isObject)(currentMessages) && Object.keys(currentMessages).length > 0; if (!currentHasContent) { warnMissing(locale, warnLabel); const obj = generateTranslationKeyReferences('', fallbackMessages); return withUtils(base, obj); } const { result, hasMissing } = mergeMissingKeys(base, fallbackMessages); if (hasMissing) { warnMissing(locale, warnLabel); return withUtils(base, result); } return base; }, [messages, locale, assignUtils, baseOverride, translation, extMessages, fallbackLocale, contextTranslations, args, warnLabel]); } function withUtils(base, obj) { return Object.assign({}, base, obj, { formatMessage: base.formatMessage, renderMessage: base.renderMessage, countries: base.countries }); } function mergeMissingKeys(target, source) { const resultLocal = { ...target }; let hasMissing = false; const keys = Object.keys(source); for (const key of keys) { const sourceValue = source[key]; const targetValue = resultLocal[key]; if ((0, _componentHelper.isObject)(sourceValue)) { if (!targetValue) { resultLocal[key] = generateTranslationKeyReferences(key, sourceValue); hasMissing = true; } else if ((0, _componentHelper.isObject)(targetValue)) { const nested = mergeMissingKeys(targetValue, sourceValue); resultLocal[key] = nested.result; if (nested.hasMissing) { hasMissing = true; } } } else if (targetValue === undefined) { resultLocal[key] = key; hasMissing = true; } } return { result: resultLocal, hasMissing }; } function generateTranslationKeyReferences(baseKey, sourceValue) { if (!(0, _componentHelper.isObject)(sourceValue)) { return baseKey ? baseKey : sourceValue; } const result = {}; const entries = Object.entries(sourceValue); for (const [key, value] of entries) { const translationKey = baseKey ? `${baseKey}.${key}` : key; result[key] = (0, _componentHelper.isObject)(value) ? generateTranslationKeyReferences(translationKey, value) : translationKey; } return result; } function warnMissing(locale, label = 'useTranslation') { (0, _componentHelper.warn)(`${label}: No translations found for locale "${locale}"!`); } function useAdditionalUtils() { const translationsRef = (0, _react.useRef)(); const fM = (0, _react.useCallback)((id, args) => { return formatMessage(id, args, translationsRef.current); }, []); const rM = (0, _react.useCallback)(message => { return renderMessage(message); }, []); const assignUtils = (0, _react.useCallback)(translations => { translationsRef.current = translations; Object.assign(translations, { formatMessage: fM, renderMessage: rM }); return translations; }, [fM, rM]); return { assignUtils }; } function combineWithExternalTranslations({ translation, messages, locale }) { let combined = { ...translation }; if (messages) { if (Object.keys(_index.default).some(locale => messages[locale])) { if (messages[locale]) { combined = messages[locale]; } } for (const key in messages) { combined[key] = { ...translation[key], ...messages[key] }; } } return combined; } function formatMessage(id, args, messages) { let str = undefined; if (typeof id === 'string') { var _id$includes; let found = false; if (messages[id]) { str = messages[id]; found = true; } else if (id !== null && id !== void 0 && (_id$includes = id.includes) !== null && _id$includes !== void 0 && _id$includes.call(id, '.')) { const keys = id.split('.'); for (const key of keys) { if (messages[key]) { messages = messages[key]; } else { break; } } if (typeof messages === 'string') { str = messages; found = true; } } if (!found && typeof id === 'string') { str = id; } } else if (typeof id === 'function') { str = id(messages); } if (typeof str === 'string') { for (const t in args) { const regex = new RegExp(`{${t}}`, 'g'); str = str.replace(regex, args[t]); } } return str !== null && str !== void 0 ? str : id; } function renderMessage(text) { let element = text; if (typeof text === 'string') { element = text.split('{br}'); } if (Array.isArray(element)) { return element.map((item, index) => _react.default.createElement(_react.Fragment, { key: index }, item, _br || (_br = _react.default.createElement("br", null)))); } return text; } //# sourceMappingURL=useTranslation.js.map