react-i18next 13.0.3 → 13.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +4 -0
- package/.prettierignore +3 -0
- package/CHANGELOG.md +4 -0
- package/dist/amd/react-i18next.js +824 -805
- package/dist/amd/react-i18next.min.js +1 -1
- package/dist/commonjs/TransWithoutContext.js +30 -23
- package/dist/es/TransWithoutContext.js +28 -23
- package/dist/es/package.json +1 -1
- package/dist/umd/react-i18next.js +827 -808
- package/dist/umd/react-i18next.min.js +1 -1
- package/index.d.ts +8 -0
- package/package.json +8 -7
- package/react-i18next.js +827 -808
- package/react-i18next.min.js +1 -1
- package/src/TransWithoutContext.js +34 -17
- package/src/unescape.js +2 -1
package/react-i18next.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).ReactI18next={},e.React)}(this,(function(e,n){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var s=t({area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),i=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function r(e){var n={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},t=e.match(/<\/?([^\s]+?)[/\s>]/);if(t&&(n.name=t[1],(s[t[1]]||"/"===e.charAt(e.length-2))&&(n.voidElement=!0),n.name.startsWith("!--"))){var r=e.indexOf("--\x3e");return{type:"comment",comment:-1!==r?e.slice(4,r):""}}for(var o=new RegExp(i),a=null;null!==(a=o.exec(e));)if(a[0].trim())if(a[1]){var c=a[1].trim(),l=[c,""];c.indexOf("=")>-1&&(l=c.split("=")),n.attrs[l[0]]=l[1],o.lastIndex--}else a[2]&&(n.attrs[a[2]]=a[3].trim().substring(1,a[3].length-1));return n}var o=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,a=/^\s*$/,c=Object.create(null);function l(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(l,"")+"</"+n.name+">";case"comment":return e+"\x3c!--"+n.comment+"--\x3e"}}var u={parse:function(e,n){n||(n={}),n.components||(n.components=c);var t,s=[],i=[],l=-1,u=!1;if(0!==e.indexOf("<")){var p=e.indexOf("<");s.push({type:"text",content:-1===p?e:e.substring(0,p)})}return e.replace(o,(function(o,c){if(u){if(o!=="</"+t.name+">")return;u=!1}var p,d="/"!==o.charAt(1),f=o.startsWith("\x3c!--"),g=c+o.length,h=e.charAt(g);if(f){var m=r(o);return l<0?(s.push(m),s):((p=i[l]).children.push(m),s)}if(d&&(l++,"tag"===(t=r(o)).type&&n.components[t.name]&&(t.type="component",u=!0),t.voidElement||u||!h||"<"===h||t.children.push({type:"text",content:e.slice(g,e.indexOf("<",g))}),0===l&&s.push(t),(p=i[l-1])&&p.children.push(t),i[l]=t),(!d||t.voidElement)&&(l>-1&&(t.voidElement||t.name===o.slice(2,-1))&&(l--,t=-1===l?s:i[l]),!u&&"<"!==h&&h)){p=-1===l?s:i[l].children;var y=e.indexOf("<",g),v=e.slice(g,-1===y?void 0:y);a.test(v)&&(v=" "),(y>-1&&l+p.length>=0||" "!==v)&&p.push({type:"text",content:v})}})),s},stringify:function(e){return e.reduce((function(e,n){return e+l("",n)}),"")}};function p(){if(console&&console.warn){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];"string"==typeof n[0]&&(n[0]=`react-i18next:: ${n[0]}`),console.warn(...n)}}const d={};function f(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];"string"==typeof n[0]&&d[n[0]]||("string"==typeof n[0]&&(d[n[0]]=new Date),p(...n))}const g=(e,n)=>()=>{if(e.isInitialized)n();else{const t=()=>{setTimeout((()=>{e.off("initialized",t)}),0),n()};e.on("initialized",t)}};function h(e,n,t){e.loadNamespaces(n,g(e,t))}function m(e,n,t,s){"string"==typeof t&&(t=[t]),t.forEach((n=>{e.options.ns.indexOf(n)<0&&e.options.ns.push(n)})),e.loadLanguages(n,g(e,s))}function y(e){return e.displayName||e.name||("string"==typeof e&&e.length>0?e:"Unknown")}const v=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,b={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},x=e=>b[e];let E,N={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:e=>e.replace(v,x)};function O(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};N={...N,...e}}function $(){return N}function w(e){E=e}function k(){return E}function I(e,n){if(!e)return!1;const t=e.props?e.props.children:e.children;return n?t.length>0:!!t}function S(e){return e?e.props?e.props.children:e.children:[]}function j(e){return Array.isArray(e)?e:[e]}function R(e,t){if(!e)return"";let s="";const i=j(e),r=t.transSupportBasicHtmlNodes&&t.transKeepBasicHtmlNodesFor?t.transKeepBasicHtmlNodesFor:[];return i.forEach(((e,i)=>{if("string"==typeof e)s+=`${e}`;else if(n.isValidElement(e)){const n=Object.keys(e.props).length,o=r.indexOf(e.type)>-1,a=e.props.children;if(!a&&o&&0===n)s+=`<${e.type}/>`;else if(a||o&&0===n)if(e.props.i18nIsDynamicList)s+=`<${i}></${i}>`;else if(o&&1===n&&"string"==typeof a)s+=`<${e.type}>${a}</${e.type}>`;else{const e=R(a,t);s+=`<${i}>${e}</${i}>`}else s+=`<${i}></${i}>`}else if(null===e)p("Trans: the passed in value is invalid - seems you passed in a null child.");else if("object"==typeof e){const{format:n,...t}=e,i=Object.keys(t);if(1===i.length){const e=n?`${i[0]}, ${n}`:i[0];s+=`{{${e}}}`}else p("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.",e)}else p("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}}.",e)})),s}function C(e,t,s,i,r,o){if(""===t)return[];const a=i.transKeepBasicHtmlNodesFor||[],c=t&&new RegExp(a.join("|")).test(t);if(!e&&!c&&!o)return[t];const l={};!function e(t){j(t).forEach((t=>{"string"!=typeof t&&(I(t)?e(S(t)):"object"!=typeof t||n.isValidElement(t)||Object.assign(l,t))}))}(e);const p=u.parse(`<0>${t}</0>`),d={...l,...r};function f(e,t,s){const i=S(e),r=h(i,t.children,s);return function(e){return"[object Array]"===Object.prototype.toString.call(e)&&e.every((e=>n.isValidElement(e)))}(i)&&0===r.length?i:r}function g(e,t,s,i,r){e.dummy&&(e.children=t),s.push(n.cloneElement(e,{...e.props,key:i},r?void 0:t))}function h(t,r,l){const u=j(t);return j(r).reduce(((t,r,p)=>{const m=r.children&&r.children[0]&&r.children[0].content&&s.services.interpolator.interpolate(r.children[0].content,d,s.language);if("tag"===r.type){let o=u[parseInt(r.name,10)];!o&&1===l.length&&l[0][r.name]&&(o=l[0][r.name]),o||(o={});const y=0!==Object.keys(r.attrs).length?function(e,n){const t={...n};return t.props=Object.assign(e.props,n.props),t}({props:r.attrs},o):o,v=n.isValidElement(y),b=v&&I(r,!0)&&!r.voidElement,x=c&&"object"==typeof y&&y.dummy&&!v,E="object"==typeof e&&null!==e&&Object.hasOwnProperty.call(e,r.name);if("string"==typeof y){const e=s.services.interpolator.interpolate(y,d,s.language);t.push(e)}else if(I(y)||b){g(y,f(y,r,l),t,p)}else if(x){const e=h(u,r.children,l);t.push(n.cloneElement(y,{...y.props,key:p},e))}else if(Number.isNaN(parseFloat(r.name)))if(E){g(y,f(y,r,l),t,p,r.voidElement)}else if(i.transSupportBasicHtmlNodes&&a.indexOf(r.name)>-1)if(r.voidElement)t.push(n.createElement(r.name,{key:`${r.name}-${p}`}));else{const e=h(u,r.children,l);t.push(n.createElement(r.name,{key:`${r.name}-${p}`},e))}else if(r.voidElement)t.push(`<${r.name} />`);else{const e=h(u,r.children,l);t.push(`<${r.name}>${e}</${r.name}>`)}else if("object"!=typeof y||v)1===r.children.length&&m?t.push(n.cloneElement(y,{...y.props,key:p},m)):t.push(n.cloneElement(y,{...y.props,key:p}));else{const e=r.children[0]?m:null;e&&t.push(e)}}else if("text"===r.type){const e=i.transWrapTextNodes,a=o?i.unescape(s.services.interpolator.interpolate(r.content,d,s.language)):s.services.interpolator.interpolate(r.content,d,s.language);e?t.push(n.createElement(e,{key:`${r.name}-${p}`},a)):t.push(a)}return t}),[])}return S(h([{dummy:!0,children:e||[]}],p,j(e||[]))[0])}function T(e){let{children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a={},values:c,defaults:l,components:u,ns:p,i18n:d,t:g,shouldUnescape:h,...m}=e;const y=d||k();if(!y)return f("You will need to pass in an i18next instance by using i18nextReactModule"),t;const v=g||y.t.bind(y)||(e=>e);o&&(a.context=o);const b={...$(),...y.options&&y.options.react};let x=p||v.ns||y.options&&y.options.defaultNS;x="string"==typeof x?[x]:x||["translation"];const E=l||R(t,b)||b.transEmptyNodeValue||r,{hashTransKey:N}=b,O=r||(N?N(E):E),w=c?a.interpolation:{interpolation:{...a.interpolation,prefix:"#$?",suffix:"?$#"}},I={...a,count:s,...c,...w,defaultValue:E,ns:x},S=C(u||t,O?v(O,I):E,y,b,I,h),j=void 0!==i?i:b.defaultTransParent;return j?n.createElement(j,m,S):S}const P={type:"3rdParty",init(e){O(e.options.react),w(e)}},L=n.createContext();class z{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach((e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)}))}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}function A(e){return n=>new Promise((t=>{const s=B();e.getInitialProps?e.getInitialProps(n).then((e=>{t({...e,...s})})):t(s)}))}function B(){const e=k(),n=e.reportNamespaces?e.reportNamespaces.getUsedNamespaces():[],t={},s={};return e.languages.forEach((t=>{s[t]={},n.forEach((n=>{s[t][n]=e.getResourceBundle(t,n)||{}}))})),t.initialI18nStore=s,t.initialLanguage=e.language,t}const U=(e,t)=>{const s=n.useRef();return n.useEffect((()=>{s.current=t?s.current:e}),[e,t]),s.current};function V(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{i18n:s}=t,{i18n:i,defaultNS:r}=n.useContext(L)||{},o=s||i||k();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new z),!o){f("You will need to pass in an i18next instance by using initReactI18next");const e=(e,n)=>"string"==typeof n?n:n&&"object"==typeof n&&"string"==typeof n.defaultValue?n.defaultValue:Array.isArray(e)?e[e.length-1]:e,n=[e,{},!1];return n.t=e,n.i18n={},n.ready=!1,n}o.options.react&&void 0!==o.options.react.wait&&f("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...$(),...o.options.react,...t},{useSuspense:c,keyPrefix:l}=a;let u=e||r||o.options&&o.options.defaultNS;u="string"==typeof u?[u]:u||["translation"],o.reportNamespaces.addUsedNamespaces&&o.reportNamespaces.addUsedNamespaces(u);const p=(o.isInitialized||o.initializedStoreOnce)&&u.every((e=>function(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.languages&&n.languages.length?void 0!==n.options.ignoreJSONStructure?n.hasLoadedNamespace(e,{lng:t.lng,precheck:(n,s)=>{if(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!s(n.isLanguageChangingTo,e))return!1}}):function(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const s=n.languages[0],i=!!n.options&&n.options.fallbackLng,r=n.languages[n.languages.length-1];if("cimode"===s.toLowerCase())return!0;const o=(e,t)=>{const s=n.services.backendConnector.state[`${e}|${t}`];return-1===s||2===s};return!(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!o(n.isLanguageChangingTo,e)||!n.hasResourceBundle(s,e)&&n.services.backendConnector.backend&&(!n.options.resources||n.options.partialBundledLanguages)&&(!o(s,e)||i&&!o(r,e)))}(e,n,t):(f("i18n.languages were undefined or empty",n.languages),!0)}(e,o,a)));function d(){return o.getFixedT(t.lng||null,"fallback"===a.nsMode?u:u[0],l)}const[g,y]=n.useState(d);let v=u.join();t.lng&&(v=`${t.lng}${v}`);const b=U(v),x=n.useRef(!0);n.useEffect((()=>{const{bindI18n:e,bindI18nStore:n}=a;function s(){x.current&&y(d)}return x.current=!0,p||c||(t.lng?m(o,t.lng,u,(()=>{x.current&&y(d)})):h(o,u,(()=>{x.current&&y(d)}))),p&&b&&b!==v&&x.current&&y(d),e&&o&&o.on(e,s),n&&o&&o.store.on(n,s),()=>{x.current=!1,e&&o&&e.split(" ").forEach((e=>o.off(e,s))),n&&o&&n.split(" ").forEach((e=>o.store.off(e,s)))}}),[o,v]);const E=n.useRef(!0);n.useEffect((()=>{x.current&&!E.current&&y(d),E.current=!1}),[o,l]);const N=[g,o,p];if(N.t=g,N.i18n=o,N.ready=p,p)return N;if(!p&&!c)return N;throw new Promise((e=>{t.lng?m(o,t.lng,u,(()=>e())):h(o,u,(()=>e()))}))}function F(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{i18n:i}=s,{i18n:r}=n.useContext(L)||{},o=i||r||k();o.options&&o.options.isClone||(e&&!o.initializedStoreOnce&&(o.services.resourceStore.data=e,o.options.ns=Object.values(e).reduce(((e,n)=>(Object.keys(n).forEach((n=>{e.indexOf(n)<0&&e.push(n)})),e)),o.options.ns),o.initializedStoreOnce=!0,o.isInitialized=!0),t&&!o.initializedLanguageOnce&&(o.changeLanguage(t),o.initializedLanguageOnce=!0))}e.I18nContext=L,e.I18nextProvider=function(e){let{i18n:t,defaultNS:s,children:i}=e;const r=n.useMemo((()=>({i18n:t,defaultNS:s})),[t,s]);return n.createElement(L.Provider,{value:r},i)},e.Trans=function(e){let{children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a={},values:c,defaults:l,components:u,ns:p,i18n:d,t:f,shouldUnescape:g,...h}=e;const{i18n:m,defaultNS:y}=n.useContext(L)||{},v=d||m||k(),b=f||v&&v.t.bind(v);return T({children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a,values:c,defaults:l,components:u,ns:p||b&&b.ns||y||v&&v.options&&v.options.defaultNS,i18n:v,t:f,shouldUnescape:g,...h})},e.TransWithoutContext=T,e.Translation=function(e){const{ns:n,children:t,...s}=e,[i,r,o]=V(n,s);return t(i,{i18n:r,lng:r.language},o)},e.composeInitialProps=A,e.date=()=>"",e.getDefaults=$,e.getI18n=k,e.getInitialProps=B,e.initReactI18next=P,e.number=()=>"",e.plural=()=>"",e.select=()=>"",e.selectOrdinal=()=>"",e.setDefaults=O,e.setI18n=w,e.time=()=>"",e.useSSR=F,e.useTranslation=V,e.withSSR=function(){return function(e){function t(t){let{initialI18nStore:s,initialLanguage:i,...r}=t;return F(s,i),n.createElement(e,{...r})}return t.getInitialProps=A(e),t.displayName=`withI18nextSSR(${y(e)})`,t.WrappedComponent=e,t}},e.withTranslation=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(s){function i(i){let{forwardedRef:r,...o}=i;const[a,c,l]=V(e,{...o,keyPrefix:t.keyPrefix}),u={...o,t:a,i18n:c,tReady:l};return t.withRef&&r?u.ref=r:!t.withRef&&r&&(u.forwardedRef=r),n.createElement(s,u)}i.displayName=`withI18nextTranslation(${y(s)})`,i.WrappedComponent=s;return t.withRef?n.forwardRef(((e,t)=>n.createElement(i,Object.assign({},e,{forwardedRef:t})))):i}}}));
|
|
1
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).ReactI18next={},e.React)}(this,(function(e,n){"use strict";function t(){return t=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])}return e},t.apply(this,arguments)}function s(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var i=s({area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),r=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function o(e){var n={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},t=e.match(/<\/?([^\s]+?)[/\s>]/);if(t&&(n.name=t[1],(i[t[1]]||"/"===e.charAt(e.length-2))&&(n.voidElement=!0),n.name.startsWith("!--"))){var s=e.indexOf("--\x3e");return{type:"comment",comment:-1!==s?e.slice(4,s):""}}for(var o=new RegExp(r),a=null;null!==(a=o.exec(e));)if(a[0].trim())if(a[1]){var c=a[1].trim(),l=[c,""];c.indexOf("=")>-1&&(l=c.split("=")),n.attrs[l[0]]=l[1],o.lastIndex--}else a[2]&&(n.attrs[a[2]]=a[3].trim().substring(1,a[3].length-1));return n}var a=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,c=/^\s*$/,l=Object.create(null);function u(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(u,"")+"</"+n.name+">";case"comment":return e+"\x3c!--"+n.comment+"--\x3e"}}var p={parse:function(e,n){n||(n={}),n.components||(n.components=l);var t,s=[],i=[],r=-1,u=!1;if(0!==e.indexOf("<")){var p=e.indexOf("<");s.push({type:"text",content:-1===p?e:e.substring(0,p)})}return e.replace(a,(function(a,l){if(u){if(a!=="</"+t.name+">")return;u=!1}var p,d="/"!==a.charAt(1),f=a.startsWith("\x3c!--"),g=l+a.length,h=e.charAt(g);if(f){var m=o(a);return r<0?(s.push(m),s):((p=i[r]).children.push(m),s)}if(d&&(r++,"tag"===(t=o(a)).type&&n.components[t.name]&&(t.type="component",u=!0),t.voidElement||u||!h||"<"===h||t.children.push({type:"text",content:e.slice(g,e.indexOf("<",g))}),0===r&&s.push(t),(p=i[r-1])&&p.children.push(t),i[r]=t),(!d||t.voidElement)&&(r>-1&&(t.voidElement||t.name===a.slice(2,-1))&&(r--,t=-1===r?s:i[r]),!u&&"<"!==h&&h)){p=-1===r?s:i[r].children;var y=e.indexOf("<",g),b=e.slice(g,-1===y?void 0:y);c.test(b)&&(b=" "),(y>-1&&r+p.length>=0||" "!==b)&&p.push({type:"text",content:b})}})),s},stringify:function(e){return e.reduce((function(e,n){return e+u("",n)}),"")}};function d(){if(console&&console.warn){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];"string"==typeof n[0]&&(n[0]=`react-i18next:: ${n[0]}`),console.warn(...n)}}const f={};function g(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];"string"==typeof n[0]&&f[n[0]]||("string"==typeof n[0]&&(f[n[0]]=new Date),d(...n))}const h=(e,n)=>()=>{if(e.isInitialized)n();else{const t=()=>{setTimeout((()=>{e.off("initialized",t)}),0),n()};e.on("initialized",t)}};function m(e,n,t){e.loadNamespaces(n,h(e,t))}function y(e,n,t,s){"string"==typeof t&&(t=[t]),t.forEach((n=>{e.options.ns.indexOf(n)<0&&e.options.ns.push(n)})),e.loadLanguages(n,h(e,s))}function b(e){return e.displayName||e.name||("string"==typeof e&&e.length>0?e:"Unknown")}const v=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,x={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},N=e=>x[e];let E,O={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:e=>e.replace(v,N)};function $(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};O={...O,...e}}function w(){return O}function I(e){E=e}function S(){return E}function j(e,n){if(!e)return!1;const t=e.props?e.props.children:e.children;return n?t.length>0:!!t}function k(e){if(!e)return[];const n=e.props?e.props.children:e.children;return e.props?.i18nIsDynamicList?R(n):n}function R(e){return Array.isArray(e)?e:[e]}function C(e,t){if(!e)return"";let s="";const i=R(e),r=t.transSupportBasicHtmlNodes&&t.transKeepBasicHtmlNodesFor?t.transKeepBasicHtmlNodesFor:[];return i.forEach(((e,i)=>{if("string"==typeof e)s+=`${e}`;else if(n.isValidElement(e)){const n=Object.keys(e.props).length,o=r.indexOf(e.type)>-1,a=e.props.children;if(!a&&o&&0===n)s+=`<${e.type}/>`;else if(a||o&&0===n)if(e.props.i18nIsDynamicList)s+=`<${i}></${i}>`;else if(o&&1===n&&"string"==typeof a)s+=`<${e.type}>${a}</${e.type}>`;else{const e=C(a,t);s+=`<${i}>${e}</${i}>`}else s+=`<${i}></${i}>`}else if(null===e)d("Trans: the passed in value is invalid - seems you passed in a null child.");else if("object"==typeof e){const{format:n,...t}=e,i=Object.keys(t);if(1===i.length){const e=n?`${i[0]}, ${n}`:i[0];s+=`{{${e}}}`}else d("react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.",e)}else d("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}}.",e)})),s}function T(e,s,i,r,o,a){if(""===s)return[];const c=r.transKeepBasicHtmlNodesFor||[],l=s&&new RegExp(c.map((e=>`<${e}`)).join("|")).test(s);if(!e&&!l&&!a)return[s];const u={};!function e(t){R(t).forEach((t=>{"string"!=typeof t&&(j(t)?e(k(t)):"object"!=typeof t||n.isValidElement(t)||Object.assign(u,t))}))}(e);const d=p.parse(`<0>${s}</0>`),f={...u,...o};function g(e,t,s){const i=k(e),r=m(i,t.children,s);return function(e){return"[object Array]"===Object.prototype.toString.call(e)&&e.every((e=>n.isValidElement(e)))}(i)&&0===r.length?i:r}function h(e,s,i,r,o){e.dummy?(e.children=s,i.push(n.cloneElement(e,{key:r},o?void 0:s))):i.push(...n.Children.map([e],(e=>{const i={...e.props};return delete i.i18nIsDynamicList,n.createElement(e.type,t({},i,{key:r,ref:e.ref},o?{}:{children:s}))})))}function m(t,s,o){const u=R(t);return R(s).reduce(((t,s,p)=>{const d=s.children&&s.children[0]&&s.children[0].content&&i.services.interpolator.interpolate(s.children[0].content,f,i.language);if("tag"===s.type){let a=u[parseInt(s.name,10)];1===o.length&&(a||=o[0][s.name]),a||={};const y=0!==Object.keys(s.attrs).length?function(e,n){const t={...n};return t.props=Object.assign(e.props,n.props),t}({props:s.attrs},a):a,b=n.isValidElement(y),v=b&&j(s,!0)&&!s.voidElement,x=l&&"object"==typeof y&&y.dummy&&!b,N="object"==typeof e&&null!==e&&Object.hasOwnProperty.call(e,s.name);if("string"==typeof y){const e=i.services.interpolator.interpolate(y,f,i.language);t.push(e)}else if(j(y)||v){h(y,g(y,s,o),t,p)}else if(x){h(y,m(u,s.children,o),t,p)}else if(Number.isNaN(parseFloat(s.name)))if(N){h(y,g(y,s,o),t,p,s.voidElement)}else if(r.transSupportBasicHtmlNodes&&c.indexOf(s.name)>-1)if(s.voidElement)t.push(n.createElement(s.name,{key:`${s.name}-${p}`}));else{const e=m(u,s.children,o);t.push(n.createElement(s.name,{key:`${s.name}-${p}`},e))}else if(s.voidElement)t.push(`<${s.name} />`);else{const e=m(u,s.children,o);t.push(`<${s.name}>${e}</${s.name}>`)}else if("object"!=typeof y||b)h(y,d,t,p,1!==s.children.length||!d);else{const e=s.children[0]?d:null;e&&t.push(e)}}else if("text"===s.type){const e=r.transWrapTextNodes,o=a?r.unescape(i.services.interpolator.interpolate(s.content,f,i.language)):i.services.interpolator.interpolate(s.content,f,i.language);e?t.push(n.createElement(e,{key:`${s.name}-${p}`},o)):t.push(o)}return t}),[])}return k(m([{dummy:!0,children:e||[]}],d,R(e||[]))[0])}function L(e){let{children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a={},values:c,defaults:l,components:u,ns:p,i18n:d,t:f,shouldUnescape:h,...m}=e;const y=d||S();if(!y)return g("You will need to pass in an i18next instance by using i18nextReactModule"),t;const b=f||y.t.bind(y)||(e=>e);o&&(a.context=o);const v={...w(),...y.options&&y.options.react};let x=p||b.ns||y.options&&y.options.defaultNS;x="string"==typeof x?[x]:x||["translation"];const N=l||C(t,v)||v.transEmptyNodeValue||r,{hashTransKey:E}=v,O=r||(E?E(N):N),$=c?a.interpolation:{interpolation:{...a.interpolation,prefix:"#$?",suffix:"?$#"}},I={...a,count:s,...c,...$,defaultValue:N,ns:x},j=T(u||t,O?b(O,I):N,y,v,I,h),k=void 0!==i?i:v.defaultTransParent;return k?n.createElement(k,m,j):j}const P={type:"3rdParty",init(e){$(e.options.react),I(e)}},z=n.createContext();class A{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach((e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)}))}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}function B(e){return n=>new Promise((t=>{const s=U();e.getInitialProps?e.getInitialProps(n).then((e=>{t({...e,...s})})):t(s)}))}function U(){const e=S(),n=e.reportNamespaces?e.reportNamespaces.getUsedNamespaces():[],t={},s={};return e.languages.forEach((t=>{s[t]={},n.forEach((n=>{s[t][n]=e.getResourceBundle(t,n)||{}}))})),t.initialI18nStore=s,t.initialLanguage=e.language,t}const V=(e,t)=>{const s=n.useRef();return n.useEffect((()=>{s.current=t?s.current:e}),[e,t]),s.current};function F(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{i18n:s}=t,{i18n:i,defaultNS:r}=n.useContext(z)||{},o=s||i||S();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new A),!o){g("You will need to pass in an i18next instance by using initReactI18next");const e=(e,n)=>"string"==typeof n?n:n&&"object"==typeof n&&"string"==typeof n.defaultValue?n.defaultValue:Array.isArray(e)?e[e.length-1]:e,n=[e,{},!1];return n.t=e,n.i18n={},n.ready=!1,n}o.options.react&&void 0!==o.options.react.wait&&g("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...w(),...o.options.react,...t},{useSuspense:c,keyPrefix:l}=a;let u=e||r||o.options&&o.options.defaultNS;u="string"==typeof u?[u]:u||["translation"],o.reportNamespaces.addUsedNamespaces&&o.reportNamespaces.addUsedNamespaces(u);const p=(o.isInitialized||o.initializedStoreOnce)&&u.every((e=>function(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.languages&&n.languages.length?void 0!==n.options.ignoreJSONStructure?n.hasLoadedNamespace(e,{lng:t.lng,precheck:(n,s)=>{if(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!s(n.isLanguageChangingTo,e))return!1}}):function(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const s=n.languages[0],i=!!n.options&&n.options.fallbackLng,r=n.languages[n.languages.length-1];if("cimode"===s.toLowerCase())return!0;const o=(e,t)=>{const s=n.services.backendConnector.state[`${e}|${t}`];return-1===s||2===s};return!(t.bindI18n&&t.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!o(n.isLanguageChangingTo,e)||!n.hasResourceBundle(s,e)&&n.services.backendConnector.backend&&(!n.options.resources||n.options.partialBundledLanguages)&&(!o(s,e)||i&&!o(r,e)))}(e,n,t):(g("i18n.languages were undefined or empty",n.languages),!0)}(e,o,a)));function d(){return o.getFixedT(t.lng||null,"fallback"===a.nsMode?u:u[0],l)}const[f,h]=n.useState(d);let b=u.join();t.lng&&(b=`${t.lng}${b}`);const v=V(b),x=n.useRef(!0);n.useEffect((()=>{const{bindI18n:e,bindI18nStore:n}=a;function s(){x.current&&h(d)}return x.current=!0,p||c||(t.lng?y(o,t.lng,u,(()=>{x.current&&h(d)})):m(o,u,(()=>{x.current&&h(d)}))),p&&v&&v!==b&&x.current&&h(d),e&&o&&o.on(e,s),n&&o&&o.store.on(n,s),()=>{x.current=!1,e&&o&&e.split(" ").forEach((e=>o.off(e,s))),n&&o&&n.split(" ").forEach((e=>o.store.off(e,s)))}}),[o,b]);const N=n.useRef(!0);n.useEffect((()=>{x.current&&!N.current&&h(d),N.current=!1}),[o,l]);const E=[f,o,p];if(E.t=f,E.i18n=o,E.ready=p,p)return E;if(!p&&!c)return E;throw new Promise((e=>{t.lng?y(o,t.lng,u,(()=>e())):m(o,u,(()=>e()))}))}function K(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{i18n:i}=s,{i18n:r}=n.useContext(z)||{},o=i||r||S();o.options&&o.options.isClone||(e&&!o.initializedStoreOnce&&(o.services.resourceStore.data=e,o.options.ns=Object.values(e).reduce(((e,n)=>(Object.keys(n).forEach((n=>{e.indexOf(n)<0&&e.push(n)})),e)),o.options.ns),o.initializedStoreOnce=!0,o.isInitialized=!0),t&&!o.initializedLanguageOnce&&(o.changeLanguage(t),o.initializedLanguageOnce=!0))}e.I18nContext=z,e.I18nextProvider=function(e){let{i18n:t,defaultNS:s,children:i}=e;const r=n.useMemo((()=>({i18n:t,defaultNS:s})),[t,s]);return n.createElement(z.Provider,{value:r},i)},e.Trans=function(e){let{children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a={},values:c,defaults:l,components:u,ns:p,i18n:d,t:f,shouldUnescape:g,...h}=e;const{i18n:m,defaultNS:y}=n.useContext(z)||{},b=d||m||S(),v=f||b&&b.t.bind(b);return L({children:t,count:s,parent:i,i18nKey:r,context:o,tOptions:a,values:c,defaults:l,components:u,ns:p||v&&v.ns||y||b&&b.options&&b.options.defaultNS,i18n:b,t:f,shouldUnescape:g,...h})},e.TransWithoutContext=L,e.Translation=function(e){const{ns:n,children:t,...s}=e,[i,r,o]=F(n,s);return t(i,{i18n:r,lng:r.language},o)},e.composeInitialProps=B,e.date=()=>"",e.getDefaults=w,e.getI18n=S,e.getInitialProps=U,e.initReactI18next=P,e.number=()=>"",e.plural=()=>"",e.select=()=>"",e.selectOrdinal=()=>"",e.setDefaults=$,e.setI18n=I,e.time=()=>"",e.useSSR=K,e.useTranslation=F,e.withSSR=function(){return function(e){function t(t){let{initialI18nStore:s,initialLanguage:i,...r}=t;return K(s,i),n.createElement(e,{...r})}return t.getInitialProps=B(e),t.displayName=`withI18nextSSR(${b(e)})`,t.WrappedComponent=e,t}},e.withTranslation=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(s){function i(i){let{forwardedRef:r,...o}=i;const[a,c,l]=F(e,{...o,keyPrefix:t.keyPrefix}),u={...o,t:a,i18n:c,tReady:l};return t.withRef&&r?u.ref=r:!t.withRef&&r&&(u.forwardedRef=r),n.createElement(s,u)}i.displayName=`withI18nextTranslation(${b(s)})`,i.WrappedComponent=s;return t.withRef?n.forwardRef(((e,t)=>n.createElement(i,Object.assign({},e,{forwardedRef:t})))):i}}}));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isValidElement, cloneElement, createElement } from 'react';
|
|
1
|
+
import React, { isValidElement, cloneElement, createElement, Children } from 'react';
|
|
2
2
|
import HTML from 'html-parse-stringify';
|
|
3
3
|
import { warn, warnOnce } from './utils.js';
|
|
4
4
|
import { getDefaults } from './defaults.js';
|
|
@@ -13,7 +13,8 @@ function hasChildren(node, checkLength) {
|
|
|
13
13
|
|
|
14
14
|
function getChildren(node) {
|
|
15
15
|
if (!node) return [];
|
|
16
|
-
|
|
16
|
+
const children = node.props ? node.props.children : node.children;
|
|
17
|
+
return node.props?.i18nIsDynamicList ? getAsArray(children) : children;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
function hasValidReactChildren(children) {
|
|
@@ -110,7 +111,7 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
110
111
|
// check if contains tags we need to replace from html string to react nodes
|
|
111
112
|
const keepArray = i18nOptions.transKeepBasicHtmlNodesFor || [];
|
|
112
113
|
const emptyChildrenButNeedsHandling =
|
|
113
|
-
targetString && new RegExp(keepArray.join('|')).test(targetString);
|
|
114
|
+
targetString && new RegExp(keepArray.map((keep) => `<${keep}`).join('|')).test(targetString);
|
|
114
115
|
|
|
115
116
|
// no need to replace tags in the targetstring
|
|
116
117
|
if (!children && !emptyChildrenButNeedsHandling && !shouldUnescape) return [targetString];
|
|
@@ -138,13 +139,22 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
138
139
|
function renderInner(child, node, rootReactNode) {
|
|
139
140
|
const childs = getChildren(child);
|
|
140
141
|
const mappedChildren = mapAST(childs, node.children, rootReactNode);
|
|
141
|
-
// console.warn('INNER', node.name, node, child, childs, node.children, mappedChildren);
|
|
142
142
|
return hasValidReactChildren(childs) && mappedChildren.length === 0 ? childs : mappedChildren;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
function pushTranslatedJSX(child, inner, mem, i, isVoid) {
|
|
146
|
-
if (child.dummy)
|
|
147
|
-
|
|
146
|
+
if (child.dummy) {
|
|
147
|
+
child.children = inner; // needed on preact!
|
|
148
|
+
mem.push(cloneElement(child, { key: i }, isVoid ? undefined : inner));
|
|
149
|
+
} else {
|
|
150
|
+
mem.push(
|
|
151
|
+
...Children.map([child], (c) => {
|
|
152
|
+
const props = { ...c.props };
|
|
153
|
+
delete props.i18nIsDynamicList;
|
|
154
|
+
return <c.type {...props} key={i} ref={c.ref} {...(isVoid ? {} : { children: inner })} />;
|
|
155
|
+
}),
|
|
156
|
+
);
|
|
157
|
+
}
|
|
148
158
|
}
|
|
149
159
|
|
|
150
160
|
// reactNode (the jsx root element or child)
|
|
@@ -162,11 +172,15 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
162
172
|
i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language);
|
|
163
173
|
|
|
164
174
|
if (node.type === 'tag') {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
175
|
+
// regular array (components or children)
|
|
176
|
+
let tmp = reactNodes[parseInt(node.name, 10)];
|
|
177
|
+
|
|
178
|
+
// trans components is an object
|
|
179
|
+
if (rootReactNode.length === 1) tmp ||= rootReactNode[0][node.name];
|
|
180
|
+
|
|
181
|
+
// neither
|
|
182
|
+
tmp ||= {};
|
|
183
|
+
|
|
170
184
|
const child =
|
|
171
185
|
Object.keys(node.attrs).length !== 0 ? mergeProps({ props: node.attrs }, tmp) : tmp;
|
|
172
186
|
|
|
@@ -182,7 +196,6 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
182
196
|
typeof children === 'object' &&
|
|
183
197
|
children !== null &&
|
|
184
198
|
Object.hasOwnProperty.call(children, node.name);
|
|
185
|
-
// console.warn('CHILD', node.name, node, isElement, child);
|
|
186
199
|
|
|
187
200
|
if (typeof child === 'string') {
|
|
188
201
|
const value = i18n.services.interpolator.interpolate(child, opts, i18n.language);
|
|
@@ -202,7 +215,7 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
202
215
|
node.children,
|
|
203
216
|
rootReactNode,
|
|
204
217
|
);
|
|
205
|
-
|
|
218
|
+
pushTranslatedJSX(child, inner, mem, i);
|
|
206
219
|
} else if (Number.isNaN(parseFloat(node.name))) {
|
|
207
220
|
if (isKnownComponent) {
|
|
208
221
|
const inner = renderInner(child, node, rootReactNode);
|
|
@@ -238,12 +251,16 @@ function renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, s
|
|
|
238
251
|
// in the translation AST while having an object in reactNodes
|
|
239
252
|
// -> push the content no need to interpolate again
|
|
240
253
|
if (content) mem.push(content);
|
|
241
|
-
} else
|
|
254
|
+
} else {
|
|
242
255
|
// If component does not have children, but translation - has
|
|
243
256
|
// with this in component could be components={[<span class='make-beautiful'/>]} and in translation - 'some text <0>some highlighted message</0>'
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
257
|
+
pushTranslatedJSX(
|
|
258
|
+
child,
|
|
259
|
+
translationContent,
|
|
260
|
+
mem,
|
|
261
|
+
i,
|
|
262
|
+
node.children.length !== 1 || !translationContent,
|
|
263
|
+
);
|
|
247
264
|
}
|
|
248
265
|
} else if (node.type === 'text') {
|
|
249
266
|
const wrapTextNodes = i18nOptions.transWrapTextNodes;
|
package/src/unescape.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// unescape common html entities
|
|
2
2
|
|
|
3
|
-
const matchHtmlEntity =
|
|
3
|
+
const matchHtmlEntity =
|
|
4
|
+
/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;
|
|
4
5
|
|
|
5
6
|
const htmlEntities = {
|
|
6
7
|
'&': '&',
|