docs: function translateProps(node, props, options = {}, overrideKey) {
    if (!props) return props;
  
    i18next.options.translateAttributes.forEach((item) => {
      if (item.ele && node.tagName !== item.ele) return;
      if (item.cond && item.cond.length === 2) {
        const condValue =
          getPath(props, item.cond[0]) || getPath(props.attributes, item.cond[0]);
        if (!condValue || condValue !== item.cond[1]) return;
      }
  
      let wasOnAttr = false;
      let value = getPath(props, item.attr);
      if (!value) {
        value = getPath(props.attributes, item.attr);
        if (value) wasOnAttr = true;
      }
      if (value) {
        setPath(
          wasOnAttr ? props.attributes : props,
          item.attr,
          translate(
            value,
            { ...options },
            overrideKey ? `${overrideKey}.${item.attr}` : ''
          )
        );
      }
    });
  
    replaceInside.forEach((attr) => {
      let value = getPath(props, attr);
      if (value) {
        value = value.replace(/\{\{/g, '%7B%7B').replace(/\}\}/g, '%7D%7D');
      } // fix for safari
      if (value && value.indexOf('%7B') > -1) {
        const arr = [];
  
        value.split(REGEXP).reduce((mem, match, index) => {
          if (match.length === 0) return mem;
  
          if (!index || index % 2 === 0) {
            mem.push(match);
          } else {
            mem.push(translate(
                match,
                { ...options },
                overrideKey ? `${overrideKey}.${attr}` : ''
              ));
          }
          return mem;
        }, arr);
        if (arr.length) setPath(props, attr, arr.join(''));
      }
    });
  
    return props;
  }