diff --git a/CHANGELOG.md b/CHANGELOG.md index afefa8342..efbc53895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### 10.12.2 + +- Trans: do not replace html tags in translation strings that are not in the transKeepBasicHtmlNodesFor array [919](https://github.com/i18next/react-i18next/issues/919) + ### 10.12.1 - Set ready flag to false when i18n instance has not been initialised [918](https://github.com/i18next/react-i18next/pull/918) diff --git a/react-i18next.js b/react-i18next.js index 97146116b..ce8d14fb1 100644 --- a/react-i18next.js +++ b/react-i18next.js @@ -523,7 +523,9 @@ } else if (typeof child === 'object') { var clone = _objectSpread2({}, child); - var format = clone.format; + var { + format + } = clone; delete clone.format; var keys = Object.keys(clone); @@ -598,19 +600,29 @@ mem.push(React__default.cloneElement(child, _objectSpread2({}, child.props, { key: i }), _inner)); - } else if (isNaN(node.name) && i18nOptions.transSupportBasicHtmlNodes) { - if (node.voidElement) { - mem.push(React__default.createElement(node.name, { - key: "".concat(node.name, "-").concat(i) - })); + } else if (isNaN(node.name)) { + if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) { + if (node.voidElement) { + mem.push(React__default.createElement(node.name, { + key: "".concat(node.name, "-").concat(i) + })); + } else { + var _inner2 = mapAST(reactNodes + /* wrong but we need something */ + , node.children); + + mem.push(React__default.createElement(node.name, { + key: "".concat(node.name, "-").concat(i) + }, _inner2)); + } + } else if (node.voidElement) { + mem.push("<".concat(node.name, " />")); } else { - var _inner2 = mapAST(reactNodes + var _inner3 = mapAST(reactNodes /* wrong but we need something */ , node.children); - mem.push(React__default.createElement(node.name, { - key: "".concat(node.name, "-").concat(i) - }, _inner2)); + mem.push("<".concat(node.name, ">").concat(_inner3, "")); } } else if (typeof child === 'object' && !isElement) { var content = node.children[0] ? translationContent : null; // v1 diff --git a/react-i18next.min.js b/react-i18next.min.js index 34b9fac1c..ab8123006 100644 --- a/react-i18next.min.js +++ b/react-i18next.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e=e||self).ReactI18next={},e.React)}(this,function(e,t){"use strict";var n="default"in t?t.default:t;function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,menuitem:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},s=/([\w-]+)|=|(['"])([.\s\S]*?)\2/g,l=/(?:|<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>)/g,u=Object.create?Object.create(null):{};function p(e,t,n,r,a){var i=t.indexOf("<",r),o=t.slice(r,-1===i?void 0:i);/^\s*$/.test(o)&&(o=" "),(!a&&i>-1&&n+e.length>=0||" "!==o)&&e.push({type:"text",content:o})}function f(e,t){switch(t.type){case"text":return e+t.content;case"tag":return e+="<"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'="'+e[n]+'"');return t.length?" "+t.join(" "):""}(t.attrs):"")+(t.voidElement?"/>":">"),t.voidElement?e:e+t.children.reduce(f,"")+""}}var d,g,h={parse:function(e,t){t||(t={}),t.components||(t.components=u);var n,r=[],a=-1,i=[],o={},f=!1;return e.replace(l,function(l,u){if(f){if(l!=="")return;f=!1}var d,g="/"!==l.charAt(1),h=0===l.indexOf("\x3c!--"),m=u+l.length,y=e.charAt(m);g&&!h&&(a++,"tag"===(n=function(e){var t,n=0,r=!0,a={type:"tag",name:"",voidElement:!1,attrs:{},children:[]};return e.replace(s,function(i){if("="===i)return r=!0,void n++;r?0===n?((c[i]||"/"===e.charAt(e.length-2))&&(a.voidElement=!0),a.name=i):(a.attrs[t]=i.replace(/^['"]|['"]$/g,""),t=void 0):(t&&(a.attrs[t]=t),t=i),n++,r=!1}),a}(l)).type&&t.components[n.name]&&(n.type="component",f=!0),n.voidElement||f||!y||"<"===y||p(n.children,e,a,m,t.ignoreWhitespace),o[n.tagName]=n,0===a&&r.push(n),(d=i[a-1])&&d.children.push(n),i[a]=n),(h||!g||n.voidElement)&&(h||a--,!f&&"<"!==y&&y&&p(d=-1===a?r:i[a].children,e,a,m,t.ignoreWhitespace))}),!r.length&&e.length&&p(r,e,0,0,t.ignoreWhitespace),r},stringify:function(e){return e.reduce(function(e,t){return e+f("",t)},"")}},m={bindI18n:"languageChanging languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0},y=n.createContext();function v(){return g}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};m=i({},m,{},e)}function O(){return m}class j{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}function S(e){d=e}function w(){return d}var E={type:"3rdParty",init(e){b(e.options.react),S(e)}};function N(e){return t=>new Promise(n=>{var r=x();e.getInitialProps?e.getInitialProps(t).then(e=>{n(i({},e,{},r))}):n(r)})}function x(){var e=w(),t=e.reportNamespaces?e.reportNamespaces.getUsedNamespaces():[],n={},r={};return e.languages.forEach(n=>{r[n]={},t.forEach(t=>{r[n][t]=e.getResourceBundle(n,t)||{}})}),n.initialI18nStore=r,n.initialLanguage=e.language,n}function I(){if(console&&console.warn){for(var e=arguments.length,t=new Array(e),n=0;n{if(e.isInitialized)n();else{var t=()=>{setTimeout(()=>{e.off("initialized",t)},0),n()};e.on("initialized",t)}})}function C(e){return e.displayName||e.name||("string"==typeof e&&e.length>0?e:"Unknown")}function A(e){return e&&(e.children||e.props&&e.props.children)}function T(e){return e?e&&e.children?e.children:e.props&&e.props.children:[]}function z(e,t,r,a,o){if(""===t)return[];var c=a.transKeepBasicHtmlNodesFor||[],s=t&&new RegExp(c.join("|")).test(t);if(!e&&!s)return[t];var l={};!function e(t){"[object Array]"!==Object.prototype.toString.call(t)&&(t=[t]),t.forEach(t=>{"string"!=typeof t&&(A(t)?e(T(t)):"object"!=typeof t||n.isValidElement(t)||Object.assign(l,t))})}(e),t=r.services.interpolator.interpolate(t,i({},l,{},o),r.language);var u=function e(t,r){return"[object Array]"!==Object.prototype.toString.call(t)&&(t=[t]),"[object Array]"!==Object.prototype.toString.call(r)&&(r=[r]),r.reduce((r,o,c)=>{var l=o.children&&o.children[0]&&o.children[0].content;if("tag"===o.type){var u=t[parseInt(o.name,10)]||{},p=n.isValidElement(u);if("string"==typeof u)r.push(u);else if(A(u)){var f=T(u),d=e(f,o.children),g=function(e){return"[object Array]"===Object.prototype.toString.call(e)&&e.every(e=>n.isValidElement(e))}(f)&&0===d.length?f:d;u.dummy&&(u.children=g),r.push(n.cloneElement(u,i({},u.props,{key:c}),g))}else if(s&&"object"==typeof u&&u.dummy&&!p){var h=e(t,o.children);r.push(n.cloneElement(u,i({},u.props,{key:c}),h))}else if(isNaN(o.name)&&a.transSupportBasicHtmlNodes)if(o.voidElement)r.push(n.createElement(o.name,{key:"".concat(o.name,"-").concat(c)}));else{var m=e(t,o.children);r.push(n.createElement(o.name,{key:"".concat(o.name,"-").concat(c)},m))}else if("object"!=typeof u||p)1===o.children.length&&l?r.push(n.cloneElement(u,i({},u.props,{key:c}),l)):r.push(n.cloneElement(u,i({},u.props,{key:c})));else{var y=o.children[0]?l:null;y&&r.push(y)}}else"text"===o.type&&r.push(o.content);return r},[])}([{dummy:!0,children:e}],h.parse("<0>".concat(t,"")));return T(u[0])}function L(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{i18n:r}=n,{i18n:a,defaultNS:o}=v()&&t.useContext(y)||{},c=r||a||w();if(c&&!c.reportNamespaces&&(c.reportNamespaces=new j),!c){P("You will need pass in an i18next instance by using initReactI18next");var s=[e=>e,{},!1];return s.t=e=>e,s.i18n={},s.ready=!1,s}var l=i({},O(),{},c.options.react),{useSuspense:u=l.useSuspense}=n,p=e||o||c.options&&c.options.defaultNS;p="string"==typeof p?[p]:p||["translation"],c.reportNamespaces.addUsedNamespaces&&c.reportNamespaces.addUsedNamespaces(p);var f=(c.isInitialized||c.initializedStoreOnce)&&p.every(e=>(function(e,t){if(!t.languages||!t.languages.length)return P("i18n.languages were undefined or empty",t.languages),!0;var n=t.languages[0],r=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===n.toLowerCase())return!0;var i=(e,n)=>{var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!!t.hasResourceBundle(n,e)||(!t.services.backendConnector.backend||!(!i(n,e)||r&&!i(a,e)))})(e,c));function d(){return{t:c.getFixedT(null,"fallback"===l.nsMode?p:p[0])}}var[g,h]=t.useState(d());t.useEffect(()=>{var e=!0,{bindI18n:t,bindI18nStore:n}=l;function r(){e&&h(d())}return f||u||R(c,p,()=>{e&&h(d())}),t&&c&&c.on(t,r),n&&c&&c.store.on(n,r),()=>{e=!1,t&&c&&t.split(" ").forEach(e=>c.off(e,r)),n&&c&&n.split(" ").forEach(e=>c.store.off(e,r))}},[p.join()]);var m=[g.t,c,f];if(m.t=g.t,m.i18n=c,m.ready=f,f)return m;if(!f&&!u)return m;throw new Promise(e=>{R(c,p,()=>{h(d()),e()})})}function D(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{i18n:a}=r,{i18n:i}=v()?t.useContext(y):{},o=a||i||w();o.options&&o.options.isClone||(e&&!o.initializedStoreOnce&&(o.services.resourceStore.data=e,o.initializedStoreOnce=!0),n&&!o.initializedLanguageOnce&&(o.changeLanguage(n),o.initializedLanguageOnce=!0))}e.I18nContext=y,e.I18nextProvider=function(e){var{i18n:t,defaultNS:r,children:a}=e;return g=!0,n.createElement(y.Provider,{value:{i18n:t,defaultNS:r}},a)},e.Trans=function(e){var{children:r,count:a,parent:c,i18nKey:s,tOptions:l,values:u,defaults:p,components:f,ns:d,i18n:g,t:h}=e,m=o(e,["children","count","parent","i18nKey","tOptions","values","defaults","components","ns","i18n","t"]),{i18n:b,defaultNS:j}=v()&&t.useContext(y)||{},S=g||b||w();if(!S)return P("You will need pass in an i18next instance by using i18nextReactModule"),r;var E=h||S.t.bind(S)||(e=>e),N=i({},O(),{},S.options&&S.options.react),x=void 0!==c?c:N.defaultTransParent,k=d||E.ns||j||S.options&&S.options.defaultNS;k="string"==typeof k?[k]:k||["translation"];var R=p||function e(t,r,a,o){if(!r)return"";"[object Array]"!==Object.prototype.toString.call(r)&&(r=[r]);var c=o.transKeepBasicHtmlNodesFor||[];return r.forEach((r,a)=>{var s="".concat(a);if("string"==typeof r)t="".concat(t).concat(r);else if(A(r)){var l=c.indexOf(r.type)>-1&&1===Object.keys(r.props).length&&"string"==typeof A(r)?r.type:s;t=r.props&&r.props.i18nIsDynamicList?"".concat(t,"<").concat(l,">"):"".concat(t,"<").concat(l,">").concat(e("",T(r),a+1,o),"")}else if(n.isValidElement(r))t=c.indexOf(r.type)>-1&&0===Object.keys(r.props).length?"".concat(t,"<").concat(r.type,"/>"):"".concat(t,"<").concat(s,">");else if("object"==typeof r){var u=i({},r),p=u.format;delete u.format;var f=Object.keys(u);p&&1===f.length?t="".concat(t,"{{").concat(f[0],", ").concat(p,"}}"):1===f.length?t="".concat(t,"{{").concat(f[0],"}}"):I("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.",r)}else I("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}}.",r)}),t}("",r,0,N)||N.transEmptyNodeValue,{hashTransKey:C}=N,L=s||(C?C(R):R),D=i({},l,{},u,{},u?{}:{interpolation:{prefix:"#$?",suffix:"?$#"}},{defaultValue:R,count:a,ns:k}),B=L?E(L,D):R;return x?n.createElement(x,m,z(f||r,B,S,N,D)):z(f||r,B,S,N,D)},e.Translation=function(e){var{ns:t,children:n}=e,r=o(e,["ns","children"]),[a,i,c]=L(t,r);return n(a,{i18n:i,lng:i.language},c)},e.composeInitialProps=N,e.getDefaults=O,e.getI18n=w,e.getInitialProps=x,e.initReactI18next=E,e.setDefaults=b,e.setI18n=S,e.useSSR=D,e.useTranslation=L,e.withSSR=function(){return function(e){function t(t){var{initialI18nStore:r,initialLanguage:a}=t,c=o(t,["initialI18nStore","initialLanguage"]);return D(r,a),n.createElement(e,i({},c))}return t.getInitialProps=N(e),t.displayName="withI18nextSSR(".concat(C(e),")"),t.WrappedComponent=e,t}},e.withTranslation=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(r){function a(a,o){var[c,s,l]=L(e,a),u=i({},a,{t:c,i18n:s,tReady:l});return t.withRef&&o&&(u.ref=o),n.createElement(r,u)}return a.displayName="withI18nextTranslation(".concat(C(r),")"),a.WrappedComponent=r,t.withRef?n.forwardRef(a):a}},Object.defineProperty(e,"__esModule",{value:!0})}); +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e=e||self).ReactI18next={},e.React)}(this,function(e,n){"use strict";var t="default"in n?n.default:n;function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,menuitem:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},s=/([\w-]+)|=|(['"])([.\s\S]*?)\2/g,l=/(?:|<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>)/g,u=Object.create?Object.create(null):{};function p(e,n,t,r,a){var i=n.indexOf("<",r),o=n.slice(r,-1===i?void 0:i);/^\s*$/.test(o)&&(o=" "),(!a&&i>-1&&t+e.length>=0||" "!==o)&&e.push({type:"text",content:o})}function f(e,n){switch(n.type){case"text":return e+n.content;case"tag":return e+="<"+n.name+(n.attrs?function(e){var n=[];for(var t in e)n.push(t+'="'+e[t]+'"');return n.length?" "+n.join(" "):""}(n.attrs):"")+(n.voidElement?"/>":">"),n.voidElement?e:e+n.children.reduce(f,"")+""}}var d,g,m={parse:function(e,n){n||(n={}),n.components||(n.components=u);var t,r=[],a=-1,i=[],o={},f=!1;return e.replace(l,function(l,u){if(f){if(l!=="")return;f=!1}var d,g="/"!==l.charAt(1),m=0===l.indexOf("\x3c!--"),h=u+l.length,y=e.charAt(h);g&&!m&&(a++,"tag"===(t=function(e){var n,t=0,r=!0,a={type:"tag",name:"",voidElement:!1,attrs:{},children:[]};return e.replace(s,function(i){if("="===i)return r=!0,void t++;r?0===t?((c[i]||"/"===e.charAt(e.length-2))&&(a.voidElement=!0),a.name=i):(a.attrs[n]=i.replace(/^['"]|['"]$/g,""),n=void 0):(n&&(a.attrs[n]=n),n=i),t++,r=!1}),a}(l)).type&&n.components[t.name]&&(t.type="component",f=!0),t.voidElement||f||!y||"<"===y||p(t.children,e,a,h,n.ignoreWhitespace),o[t.tagName]=t,0===a&&r.push(t),(d=i[a-1])&&d.children.push(t),i[a]=t),(m||!g||t.voidElement)&&(m||a--,!f&&"<"!==y&&y&&p(d=-1===a?r:i[a].children,e,a,h,n.ignoreWhitespace))}),!r.length&&e.length&&p(r,e,0,0,n.ignoreWhitespace),r},stringify:function(e){return e.reduce(function(e,n){return e+f("",n)},"")}},h={bindI18n:"languageChanging languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0},y=t.createContext();function v(){return g}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h=i({},h,{},e)}function O(){return h}class j{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}function S(e){d=e}function E(){return d}var w={type:"3rdParty",init(e){b(e.options.react),S(e)}};function N(e){return n=>new Promise(t=>{var r=x();e.getInitialProps?e.getInitialProps(n).then(e=>{t(i({},e,{},r))}):t(r)})}function x(){var e=E(),n=e.reportNamespaces?e.reportNamespaces.getUsedNamespaces():[],t={},r={};return e.languages.forEach(t=>{r[t]={},n.forEach(n=>{r[t][n]=e.getResourceBundle(t,n)||{}})}),t.initialI18nStore=r,t.initialLanguage=e.language,t}function I(){if(console&&console.warn){for(var e=arguments.length,n=new Array(e),t=0;t{if(e.isInitialized)t();else{var n=()=>{setTimeout(()=>{e.off("initialized",n)},0),t()};e.on("initialized",n)}})}function C(e){return e.displayName||e.name||("string"==typeof e&&e.length>0?e:"Unknown")}function A(e){return e&&(e.children||e.props&&e.props.children)}function T(e){return e?e&&e.children?e.children:e.props&&e.props.children:[]}function z(e,n,r,a,o){if(""===n)return[];var c=a.transKeepBasicHtmlNodesFor||[],s=n&&new RegExp(c.join("|")).test(n);if(!e&&!s)return[n];var l={};!function e(n){"[object Array]"!==Object.prototype.toString.call(n)&&(n=[n]),n.forEach(n=>{"string"!=typeof n&&(A(n)?e(T(n)):"object"!=typeof n||t.isValidElement(n)||Object.assign(l,n))})}(e),n=r.services.interpolator.interpolate(n,i({},l,{},o),r.language);var u=function e(n,r){return"[object Array]"!==Object.prototype.toString.call(n)&&(n=[n]),"[object Array]"!==Object.prototype.toString.call(r)&&(r=[r]),r.reduce((r,o,l)=>{var u=o.children&&o.children[0]&&o.children[0].content;if("tag"===o.type){var p=n[parseInt(o.name,10)]||{},f=t.isValidElement(p);if("string"==typeof p)r.push(p);else if(A(p)){var d=T(p),g=e(d,o.children),m=function(e){return"[object Array]"===Object.prototype.toString.call(e)&&e.every(e=>t.isValidElement(e))}(d)&&0===g.length?d:g;p.dummy&&(p.children=m),r.push(t.cloneElement(p,i({},p.props,{key:l}),m))}else if(s&&"object"==typeof p&&p.dummy&&!f){var h=e(n,o.children);r.push(t.cloneElement(p,i({},p.props,{key:l}),h))}else if(isNaN(o.name))if(a.transSupportBasicHtmlNodes&&c.indexOf(o.name)>-1)if(o.voidElement)r.push(t.createElement(o.name,{key:"".concat(o.name,"-").concat(l)}));else{var y=e(n,o.children);r.push(t.createElement(o.name,{key:"".concat(o.name,"-").concat(l)},y))}else if(o.voidElement)r.push("<".concat(o.name," />"));else{var v=e(n,o.children);r.push("<".concat(o.name,">").concat(v,""))}else if("object"!=typeof p||f)1===o.children.length&&u?r.push(t.cloneElement(p,i({},p.props,{key:l}),u)):r.push(t.cloneElement(p,i({},p.props,{key:l})));else{var b=o.children[0]?u:null;b&&r.push(b)}}else"text"===o.type&&r.push(o.content);return r},[])}([{dummy:!0,children:e}],m.parse("<0>".concat(n,"")));return T(u[0])}function L(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{i18n:r}=t,{i18n:a,defaultNS:o}=v()&&n.useContext(y)||{},c=r||a||E();if(c&&!c.reportNamespaces&&(c.reportNamespaces=new j),!c){P("You will need pass in an i18next instance by using initReactI18next");var s=[e=>e,{},!1];return s.t=e=>e,s.i18n={},s.ready=!1,s}var l=i({},O(),{},c.options.react),{useSuspense:u=l.useSuspense}=t,p=e||o||c.options&&c.options.defaultNS;p="string"==typeof p?[p]:p||["translation"],c.reportNamespaces.addUsedNamespaces&&c.reportNamespaces.addUsedNamespaces(p);var f=(c.isInitialized||c.initializedStoreOnce)&&p.every(e=>(function(e,n){if(!n.languages||!n.languages.length)return P("i18n.languages were undefined or empty",n.languages),!0;var t=n.languages[0],r=!!n.options&&n.options.fallbackLng,a=n.languages[n.languages.length-1];if("cimode"===t.toLowerCase())return!0;var i=(e,t)=>{var r=n.services.backendConnector.state["".concat(e,"|").concat(t)];return-1===r||2===r};return!!n.hasResourceBundle(t,e)||(!n.services.backendConnector.backend||!(!i(t,e)||r&&!i(a,e)))})(e,c));function d(){return{t:c.getFixedT(null,"fallback"===l.nsMode?p:p[0])}}var[g,m]=n.useState(d());n.useEffect(()=>{var e=!0,{bindI18n:n,bindI18nStore:t}=l;function r(){e&&m(d())}return f||u||R(c,p,()=>{e&&m(d())}),n&&c&&c.on(n,r),t&&c&&c.store.on(t,r),()=>{e=!1,n&&c&&n.split(" ").forEach(e=>c.off(e,r)),t&&c&&t.split(" ").forEach(e=>c.store.off(e,r))}},[p.join()]);var h=[g.t,c,f];if(h.t=g.t,h.i18n=c,h.ready=f,f)return h;if(!f&&!u)return h;throw new Promise(e=>{R(c,p,()=>{m(d()),e()})})}function D(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{i18n:a}=r,{i18n:i}=v()?n.useContext(y):{},o=a||i||E();o.options&&o.options.isClone||(e&&!o.initializedStoreOnce&&(o.services.resourceStore.data=e,o.initializedStoreOnce=!0),t&&!o.initializedLanguageOnce&&(o.changeLanguage(t),o.initializedLanguageOnce=!0))}e.I18nContext=y,e.I18nextProvider=function(e){var{i18n:n,defaultNS:r,children:a}=e;return g=!0,t.createElement(y.Provider,{value:{i18n:n,defaultNS:r}},a)},e.Trans=function(e){var{children:r,count:a,parent:c,i18nKey:s,tOptions:l,values:u,defaults:p,components:f,ns:d,i18n:g,t:m}=e,h=o(e,["children","count","parent","i18nKey","tOptions","values","defaults","components","ns","i18n","t"]),{i18n:b,defaultNS:j}=v()&&n.useContext(y)||{},S=g||b||E();if(!S)return P("You will need pass in an i18next instance by using i18nextReactModule"),r;var w=m||S.t.bind(S)||(e=>e),N=i({},O(),{},S.options&&S.options.react),x=void 0!==c?c:N.defaultTransParent,k=d||w.ns||j||S.options&&S.options.defaultNS;k="string"==typeof k?[k]:k||["translation"];var R=p||function e(n,r,a,o){if(!r)return"";"[object Array]"!==Object.prototype.toString.call(r)&&(r=[r]);var c=o.transKeepBasicHtmlNodesFor||[];return r.forEach((r,a)=>{var s="".concat(a);if("string"==typeof r)n="".concat(n).concat(r);else if(A(r)){var l=c.indexOf(r.type)>-1&&1===Object.keys(r.props).length&&"string"==typeof A(r)?r.type:s;n=r.props&&r.props.i18nIsDynamicList?"".concat(n,"<").concat(l,">"):"".concat(n,"<").concat(l,">").concat(e("",T(r),a+1,o),"")}else if(t.isValidElement(r))n=c.indexOf(r.type)>-1&&0===Object.keys(r.props).length?"".concat(n,"<").concat(r.type,"/>"):"".concat(n,"<").concat(s,">");else if("object"==typeof r){var u=i({},r),{format:p}=u;delete u.format;var f=Object.keys(u);p&&1===f.length?n="".concat(n,"{{").concat(f[0],", ").concat(p,"}}"):1===f.length?n="".concat(n,"{{").concat(f[0],"}}"):I("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.",r)}else I("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}}.",r)}),n}("",r,0,N)||N.transEmptyNodeValue,{hashTransKey:C}=N,L=s||(C?C(R):R),D=i({},l,{},u,{},u?{}:{interpolation:{prefix:"#$?",suffix:"?$#"}},{defaultValue:R,count:a,ns:k}),B=L?w(L,D):R;return x?t.createElement(x,h,z(f||r,B,S,N,D)):z(f||r,B,S,N,D)},e.Translation=function(e){var{ns:n,children:t}=e,r=o(e,["ns","children"]),[a,i,c]=L(n,r);return t(a,{i18n:i,lng:i.language},c)},e.composeInitialProps=N,e.getDefaults=O,e.getI18n=E,e.getInitialProps=x,e.initReactI18next=w,e.setDefaults=b,e.setI18n=S,e.useSSR=D,e.useTranslation=L,e.withSSR=function(){return function(e){function n(n){var{initialI18nStore:r,initialLanguage:a}=n,c=o(n,["initialI18nStore","initialLanguage"]);return D(r,a),t.createElement(e,i({},c))}return n.getInitialProps=N(e),n.displayName="withI18nextSSR(".concat(C(e),")"),n.WrappedComponent=e,n}},e.withTranslation=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(r){function a(a,o){var[c,s,l]=L(e,a),u=i({},a,{t:c,i18n:s,tReady:l});return n.withRef&&o&&(u.ref=o),t.createElement(r,u)}return a.displayName="withI18nextTranslation(".concat(C(r),")"),a.WrappedComponent=r,n.withRef?t.forwardRef(a):a}},Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/src/Trans.js b/src/Trans.js index 018f8eed9..4aa699a05 100644 --- a/src/Trans.js +++ b/src/Trans.js @@ -58,7 +58,7 @@ export function nodesToString(mem, children, index, i18nOptions) { } } else if (typeof child === 'object') { const clone = { ...child }; - const format = clone.format; + const { format } = clone; delete clone.format; const keys = Object.keys(clone); @@ -148,13 +148,21 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts) { // so we just need to map the inner stuff const inner = mapAST(reactNodes /* wrong but we need something */, node.children); mem.push(React.cloneElement(child, { ...child.props, key: i }, inner)); - } else if (isNaN(node.name) && i18nOptions.transSupportBasicHtmlNodes) { - if (node.voidElement) { - mem.push(React.createElement(node.name, { key: `${node.name}-${i}` })); + } else if (isNaN(node.name)) { + if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) { + if (node.voidElement) { + mem.push(React.createElement(node.name, { key: `${node.name}-${i}` })); + } else { + const inner = mapAST(reactNodes /* wrong but we need something */, node.children); + + mem.push(React.createElement(node.name, { key: `${node.name}-${i}` }, inner)); + } + } else if (node.voidElement) { + mem.push(`<${node.name} />`); } else { const inner = mapAST(reactNodes /* wrong but we need something */, node.children); - mem.push(React.createElement(node.name, { key: `${node.name}-${i}` }, inner)); + mem.push(`<${node.name}>${inner}`); } } else if (typeof child === 'object' && !isElement) { const content = node.children[0] ? translationContent : null; diff --git a/test/i18n.js b/test/i18n.js index 051e5f236..1d0bdd25c 100644 --- a/test/i18n.js +++ b/test/i18n.js @@ -19,6 +19,8 @@ i18n.init({ transTest1_noParent: '<0>Go <1>there.', transTest1_customHtml: 'Go
<1>there.', transTest1_customHtml2: 'Go
there.', + transTest1_customHtml3: + 'Go