You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					291 lines
				
				13 KiB
			
		
		
			
		
	
	
					291 lines
				
				13 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.nodesToString = nodesToString; | ||
|  | exports.Trans = Trans; | ||
|  | 
 | ||
|  | var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); | ||
|  | 
 | ||
|  | var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); | ||
|  | 
 | ||
|  | var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
|  | 
 | ||
|  | var _react = require("react"); | ||
|  | 
 | ||
|  | var _htmlParseStringify = _interopRequireDefault(require("html-parse-stringify")); | ||
|  | 
 | ||
|  | var _context = require("./context"); | ||
|  | 
 | ||
|  | var _utils = require("./utils"); | ||
|  | 
 | ||
|  | var _excluded = ["format"], | ||
|  |     _excluded2 = ["children", "count", "parent", "i18nKey", "context", "tOptions", "values", "defaults", "components", "ns", "i18n", "t", "shouldUnescape"]; | ||
|  | 
 | ||
|  | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } | ||
|  | 
 | ||
|  | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
|  | 
 | ||
|  | function hasChildren(node, checkLength) { | ||
|  |   if (!node) return false; | ||
|  |   var base = node.props ? node.props.children : node.children; | ||
|  |   if (checkLength) return base.length > 0; | ||
|  |   return !!base; | ||
|  | } | ||
|  | 
 | ||
|  | function getChildren(node) { | ||
|  |   if (!node) return []; | ||
|  |   return node.props ? node.props.children : node.children; | ||
|  | } | ||
|  | 
 | ||
|  | function hasValidReactChildren(children) { | ||
|  |   if (Object.prototype.toString.call(children) !== '[object Array]') return false; | ||
|  |   return children.every(function (child) { | ||
|  |     return (0, _react.isValidElement)(child); | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | function getAsArray(data) { | ||
|  |   return Array.isArray(data) ? data : [data]; | ||
|  | } | ||
|  | 
 | ||
|  | function mergeProps(source, target) { | ||
|  |   var newTarget = _objectSpread({}, target); | ||
|  | 
 | ||
|  |   newTarget.props = Object.assign(source.props, target.props); | ||
|  |   return newTarget; | ||
|  | } | ||
|  | 
 | ||
|  | function nodesToString(children, i18nOptions) { | ||
|  |   if (!children) return ''; | ||
|  |   var stringNode = ''; | ||
|  |   var childrenArray = getAsArray(children); | ||
|  |   var keepArray = i18nOptions.transSupportBasicHtmlNodes && i18nOptions.transKeepBasicHtmlNodesFor ? i18nOptions.transKeepBasicHtmlNodesFor : []; | ||
|  |   childrenArray.forEach(function (child, childIndex) { | ||
|  |     if (typeof child === 'string') { | ||
|  |       stringNode += "".concat(child); | ||
|  |     } else if ((0, _react.isValidElement)(child)) { | ||
|  |       var childPropsCount = Object.keys(child.props).length; | ||
|  |       var shouldKeepChild = keepArray.indexOf(child.type) > -1; | ||
|  |       var childChildren = child.props.children; | ||
|  | 
 | ||
|  |       if (!childChildren && shouldKeepChild && childPropsCount === 0) { | ||
|  |         stringNode += "<".concat(child.type, "/>"); | ||
|  |       } else if (!childChildren && (!shouldKeepChild || childPropsCount !== 0)) { | ||
|  |         stringNode += "<".concat(childIndex, "></").concat(childIndex, ">"); | ||
|  |       } else if (child.props.i18nIsDynamicList) { | ||
|  |         stringNode += "<".concat(childIndex, "></").concat(childIndex, ">"); | ||
|  |       } else if (shouldKeepChild && childPropsCount === 1 && typeof childChildren === 'string') { | ||
|  |         stringNode += "<".concat(child.type, ">").concat(childChildren, "</").concat(child.type, ">"); | ||
|  |       } else { | ||
|  |         var content = nodesToString(childChildren, i18nOptions); | ||
|  |         stringNode += "<".concat(childIndex, ">").concat(content, "</").concat(childIndex, ">"); | ||
|  |       } | ||
|  |     } else if (child === null) { | ||
|  |       (0, _utils.warn)("Trans: the passed in value is invalid - seems you passed in a null child."); | ||
|  |     } else if ((0, _typeof2["default"])(child) === 'object') { | ||
|  |       var format = child.format, | ||
|  |           clone = (0, _objectWithoutProperties2["default"])(child, _excluded); | ||
|  |       var keys = Object.keys(clone); | ||
|  | 
 | ||
|  |       if (keys.length === 1) { | ||
|  |         var value = format ? "".concat(keys[0], ", ").concat(format) : keys[0]; | ||
|  |         stringNode += "{{".concat(value, "}}"); | ||
|  |       } else { | ||
|  |         (0, _utils.warn)("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.", child); | ||
|  |       } | ||
|  |     } else { | ||
|  |       (0, _utils.warn)("Trans: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.", child); | ||
|  |     } | ||
|  |   }); | ||
|  |   return stringNode; | ||
|  | } | ||
|  | 
 | ||
|  | function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) { | ||
|  |   if (targetString === '') return []; | ||
|  |   var keepArray = i18nOptions.transKeepBasicHtmlNodesFor || []; | ||
|  |   var emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.join('|')).test(targetString); | ||
|  |   if (!children && !emptyChildrenButNeedsHandling) return [targetString]; | ||
|  |   var data = {}; | ||
|  | 
 | ||
|  |   function getData(childs) { | ||
|  |     var childrenArray = getAsArray(childs); | ||
|  |     childrenArray.forEach(function (child) { | ||
|  |       if (typeof child === 'string') return; | ||
|  |       if (hasChildren(child)) getData(getChildren(child));else if ((0, _typeof2["default"])(child) === 'object' && !(0, _react.isValidElement)(child)) Object.assign(data, child); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   getData(children); | ||
|  | 
 | ||
|  |   var ast = _htmlParseStringify["default"].parse("<0>".concat(targetString, "</0>")); | ||
|  | 
 | ||
|  |   var opts = _objectSpread(_objectSpread({}, data), combinedTOpts); | ||
|  | 
 | ||
|  |   function renderInner(child, node, rootReactNode) { | ||
|  |     var childs = getChildren(child); | ||
|  |     var mappedChildren = mapAST(childs, node.children, rootReactNode); | ||
|  |     return hasValidReactChildren(childs) && mappedChildren.length === 0 ? childs : mappedChildren; | ||
|  |   } | ||
|  | 
 | ||
|  |   function pushTranslatedJSX(child, inner, mem, i, isVoid) { | ||
|  |     if (child.dummy) child.children = inner; | ||
|  |     mem.push((0, _react.cloneElement)(child, _objectSpread(_objectSpread({}, child.props), {}, { | ||
|  |       key: i | ||
|  |     }), isVoid ? undefined : inner)); | ||
|  |   } | ||
|  | 
 | ||
|  |   function mapAST(reactNode, astNode, rootReactNode) { | ||
|  |     var reactNodes = getAsArray(reactNode); | ||
|  |     var astNodes = getAsArray(astNode); | ||
|  |     return astNodes.reduce(function (mem, node, i) { | ||
|  |       var translationContent = node.children && node.children[0] && node.children[0].content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language); | ||
|  | 
 | ||
|  |       if (node.type === 'tag') { | ||
|  |         var tmp = reactNodes[parseInt(node.name, 10)]; | ||
|  |         if (!tmp && rootReactNode.length === 1 && rootReactNode[0][node.name]) tmp = rootReactNode[0][node.name]; | ||
|  |         if (!tmp) tmp = {}; | ||
|  |         var child = Object.keys(node.attrs).length !== 0 ? mergeProps({ | ||
|  |           props: node.attrs | ||
|  |         }, tmp) : tmp; | ||
|  |         var isElement = (0, _react.isValidElement)(child); | ||
|  |         var isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement; | ||
|  |         var isEmptyTransWithHTML = emptyChildrenButNeedsHandling && (0, _typeof2["default"])(child) === 'object' && child.dummy && !isElement; | ||
|  |         var isKnownComponent = (0, _typeof2["default"])(children) === 'object' && children !== null && Object.hasOwnProperty.call(children, node.name); | ||
|  | 
 | ||
|  |         if (typeof child === 'string') { | ||
|  |           var value = i18n.services.interpolator.interpolate(child, opts, i18n.language); | ||
|  |           mem.push(value); | ||
|  |         } else if (hasChildren(child) || isValidTranslationWithChildren) { | ||
|  |             var inner = renderInner(child, node, rootReactNode); | ||
|  |             pushTranslatedJSX(child, inner, mem, i); | ||
|  |           } else if (isEmptyTransWithHTML) { | ||
|  |           var _inner = mapAST(reactNodes, node.children, rootReactNode); | ||
|  | 
 | ||
|  |           mem.push((0, _react.cloneElement)(child, _objectSpread(_objectSpread({}, child.props), {}, { | ||
|  |             key: i | ||
|  |           }), _inner)); | ||
|  |         } else if (Number.isNaN(parseFloat(node.name))) { | ||
|  |           if (isKnownComponent) { | ||
|  |             var _inner2 = renderInner(child, node, rootReactNode); | ||
|  | 
 | ||
|  |             pushTranslatedJSX(child, _inner2, mem, i, node.voidElement); | ||
|  |           } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) { | ||
|  |             if (node.voidElement) { | ||
|  |               mem.push((0, _react.createElement)(node.name, { | ||
|  |                 key: "".concat(node.name, "-").concat(i) | ||
|  |               })); | ||
|  |             } else { | ||
|  |               var _inner3 = mapAST(reactNodes, node.children, rootReactNode); | ||
|  | 
 | ||
|  |               mem.push((0, _react.createElement)(node.name, { | ||
|  |                 key: "".concat(node.name, "-").concat(i) | ||
|  |               }, _inner3)); | ||
|  |             } | ||
|  |           } else if (node.voidElement) { | ||
|  |             mem.push("<".concat(node.name, " />")); | ||
|  |           } else { | ||
|  |             var _inner4 = mapAST(reactNodes, node.children, rootReactNode); | ||
|  | 
 | ||
|  |             mem.push("<".concat(node.name, ">").concat(_inner4, "</").concat(node.name, ">")); | ||
|  |           } | ||
|  |         } else if ((0, _typeof2["default"])(child) === 'object' && !isElement) { | ||
|  |           var content = node.children[0] ? translationContent : null; | ||
|  |           if (content) mem.push(content); | ||
|  |         } else if (node.children.length === 1 && translationContent) { | ||
|  |           mem.push((0, _react.cloneElement)(child, _objectSpread(_objectSpread({}, child.props), {}, { | ||
|  |             key: i | ||
|  |           }), translationContent)); | ||
|  |         } else { | ||
|  |           mem.push((0, _react.cloneElement)(child, _objectSpread(_objectSpread({}, child.props), {}, { | ||
|  |             key: i | ||
|  |           }))); | ||
|  |         } | ||
|  |       } else if (node.type === 'text') { | ||
|  |         var wrapTextNodes = i18nOptions.transWrapTextNodes; | ||
|  | 
 | ||
|  |         var _content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language); | ||
|  | 
 | ||
|  |         if (wrapTextNodes) { | ||
|  |           mem.push((0, _react.createElement)(wrapTextNodes, { | ||
|  |             key: "".concat(node.name, "-").concat(i) | ||
|  |           }, _content)); | ||
|  |         } else { | ||
|  |           mem.push(_content); | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       return mem; | ||
|  |     }, []); | ||
|  |   } | ||
|  | 
 | ||
|  |   var result = mapAST([{ | ||
|  |     dummy: true, | ||
|  |     children: children || [] | ||
|  |   }], ast, getAsArray(children || [])); | ||
|  |   return getChildren(result[0]); | ||
|  | } | ||
|  | 
 | ||
|  | function Trans(_ref) { | ||
|  |   var children = _ref.children, | ||
|  |       count = _ref.count, | ||
|  |       parent = _ref.parent, | ||
|  |       i18nKey = _ref.i18nKey, | ||
|  |       context = _ref.context, | ||
|  |       _ref$tOptions = _ref.tOptions, | ||
|  |       tOptions = _ref$tOptions === void 0 ? {} : _ref$tOptions, | ||
|  |       values = _ref.values, | ||
|  |       defaults = _ref.defaults, | ||
|  |       components = _ref.components, | ||
|  |       ns = _ref.ns, | ||
|  |       i18nFromProps = _ref.i18n, | ||
|  |       tFromProps = _ref.t, | ||
|  |       shouldUnescape = _ref.shouldUnescape, | ||
|  |       additionalProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded2); | ||
|  | 
 | ||
|  |   var _ref2 = (0, _react.useContext)(_context.I18nContext) || {}, | ||
|  |       i18nFromContext = _ref2.i18n, | ||
|  |       defaultNSFromContext = _ref2.defaultNS; | ||
|  | 
 | ||
|  |   var i18n = i18nFromProps || i18nFromContext || (0, _context.getI18n)(); | ||
|  | 
 | ||
|  |   if (!i18n) { | ||
|  |     (0, _utils.warnOnce)('You will need to pass in an i18next instance by using i18nextReactModule'); | ||
|  |     return children; | ||
|  |   } | ||
|  | 
 | ||
|  |   var t = tFromProps || i18n.t.bind(i18n) || function (k) { | ||
|  |     return k; | ||
|  |   }; | ||
|  | 
 | ||
|  |   if (context) tOptions.context = context; | ||
|  | 
 | ||
|  |   var reactI18nextOptions = _objectSpread(_objectSpread({}, (0, _context.getDefaults)()), i18n.options && i18n.options.react); | ||
|  | 
 | ||
|  |   var namespaces = ns || t.ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS; | ||
|  |   namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation']; | ||
|  |   var defaultValue = defaults || nodesToString(children, reactI18nextOptions) || reactI18nextOptions.transEmptyNodeValue || i18nKey; | ||
|  |   var hashTransKey = reactI18nextOptions.hashTransKey; | ||
|  |   var key = i18nKey || (hashTransKey ? hashTransKey(defaultValue) : defaultValue); | ||
|  |   var interpolationOverride = values ? tOptions.interpolation : { | ||
|  |     interpolation: _objectSpread(_objectSpread({}, tOptions.interpolation), {}, { | ||
|  |       prefix: '#$?', | ||
|  |       suffix: '?$#' | ||
|  |     }) | ||
|  |   }; | ||
|  | 
 | ||
|  |   var combinedTOpts = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tOptions), {}, { | ||
|  |     count: count | ||
|  |   }, values), interpolationOverride), {}, { | ||
|  |     defaultValue: defaultValue, | ||
|  |     ns: namespaces | ||
|  |   }); | ||
|  | 
 | ||
|  |   var translation = key ? t(key, combinedTOpts) : defaultValue; | ||
|  |   var content = renderNodes(components || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape); | ||
|  |   var useAsParent = parent !== undefined ? parent : reactI18nextOptions.defaultTransParent; | ||
|  |   return useAsParent ? (0, _react.createElement)(useAsParent, additionalProps, content) : content; | ||
|  | } |