diff --git a/assets/css/gifting/shortcode-checkout.css b/assets/css/gifting/shortcode-checkout.css index ee0751b..7b6778f 100644 --- a/assets/css/gifting/shortcode-checkout.css +++ b/assets/css/gifting/shortcode-checkout.css @@ -34,6 +34,10 @@ margin-bottom: 20px; } +.woocommerce-cart-form__cart-item .wcsg_add_recipient_fields_container label { + margin-bottom: 4px; +} + .wcsg_add_recipient_fields_container .wcsg_add_recipient_fields .woocommerce_subscriptions_gifting_recipient_email { padding: 0; margin-bottom: 20px; diff --git a/assets/js/admin/writepanel.js b/assets/js/admin/writepanel.js new file mode 100644 index 0000000..6b91bd0 --- /dev/null +++ b/assets/js/admin/writepanel.js @@ -0,0 +1,31 @@ +/* global wc_subscription_downloads_product */ +jQuery( document ).ready( function ( $ ) { + function subscriptionDownloadsChosen() { + $( 'select.subscription-downloads-ids' ).ajaxChosen({ + method: 'GET', + url: wc_subscription_downloads_product.ajax_url, + dataType: 'json', + afterTypeDelay: 100, + minTermLength: 1, + data: { + action: 'wc_subscription_downloads_search', + security: wc_subscription_downloads_product.security + } + }, function ( data ) { + + var orders = {}; + + $.each( data, function ( i, val ) { + orders[i] = val; + }); + + return orders; + }); + } + + subscriptionDownloadsChosen(); + + $( 'body' ).on( 'woocommerce_variations_added', function () { + subscriptionDownloadsChosen(); + }); +}); diff --git a/build/index-rtl.css b/build/index-rtl.css index d3b5d2a..2a35d66 100644 --- a/build/index-rtl.css +++ b/build/index-rtl.css @@ -1,2 +1,3 @@ -.wcs-recurring-totals-panel{padding:1em 0 0;position:relative}.wcs-recurring-totals-panel:after{border-style:solid;border-width:1px 0;bottom:0;content:"";display:block;right:0;opacity:.3;pointer-events:none;position:absolute;left:0;top:0}.wcs-recurring-totals-panel+.wcs-recurring-totals-panel:after{border-top-width:0}.wcs-recurring-totals-panel .wc-block-components-panel .wc-block-components-totals-item{padding-right:0;padding-left:0}.wcs-recurring-totals-panel .wc-block-components-totals-item__label:first-letter{text-transform:capitalize}.wcs-recurring-totals-panel .wcs-recurring-totals-panel__title .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals-panel__title{margin:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__button,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:focus,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:hover{font-size:.875em}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:first-child{margin-top:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:last-child{margin-bottom:0}.wcs-recurring-totals-panel__details .wcs-recurring-totals-panel__details-total .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals__subscription-length{float:left} +.wcs-recurring-totals-panel{padding:1em 0 0;position:relative}.wcs-recurring-totals-panel:after{border-style:solid;border-width:1px 0;bottom:0;content:"";display:block;right:0;opacity:.3;pointer-events:none;position:absolute;left:0;top:0}.wcs-recurring-totals-panel+.wcs-recurring-totals-panel:after{border-top-width:0}.wcs-recurring-totals-panel .wc-block-components-panel .wc-block-components-totals-item{padding-right:0;padding-left:0}.wcs-recurring-totals-panel .wc-block-components-totals-item__label:first-letter{text-transform:capitalize}.wcs-recurring-totals-panel .wcs-recurring-totals-panel__title .wc-block-components-totals-item__label{font-weight:500}.wcs-recurring-totals-panel__title{margin:0}.wc-block-components-main .wcs-recurring-totals-panel__details{padding:0 16px}.wcs-recurring-totals-panel__details .wc-block-components-panel__button,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:focus,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:hover{font-size:.875em}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:first-child{margin-top:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:last-child{margin-bottom:0}.wcs-recurring-totals-panel__details .wcs-recurring-totals-panel__details-total .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals__subscription-length{float:left} +.wc-block-components-local-pickup-rates-control .wc-block-components-local-pickup-select:not(:last-child){margin-bottom:16px} diff --git a/build/index.asset.php b/build/index.asset.php index 1673159..dc8fe25 100644 --- a/build/index.asset.php +++ b/build/index.asset.php @@ -1 +1 @@ - array('react', 'wc-blocks-checkout', 'wc-blocks-data-store', 'wc-price-format', 'wc-settings', 'wp-data', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => '76dd98c6a2badbfb9781'); + array('react', 'wc-blocks-checkout', 'wc-blocks-data-store', 'wc-price-format', 'wc-settings', 'wp-data', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => 'ac38e67791839651a41a'); diff --git a/build/index.css b/build/index.css index edbae96..6f9a722 100644 --- a/build/index.css +++ b/build/index.css @@ -1,2 +1,3 @@ -.wcs-recurring-totals-panel{padding:1em 0 0;position:relative}.wcs-recurring-totals-panel:after{border-style:solid;border-width:1px 0;bottom:0;content:"";display:block;left:0;opacity:.3;pointer-events:none;position:absolute;right:0;top:0}.wcs-recurring-totals-panel+.wcs-recurring-totals-panel:after{border-top-width:0}.wcs-recurring-totals-panel .wc-block-components-panel .wc-block-components-totals-item{padding-left:0;padding-right:0}.wcs-recurring-totals-panel .wc-block-components-totals-item__label:first-letter{text-transform:capitalize}.wcs-recurring-totals-panel .wcs-recurring-totals-panel__title .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals-panel__title{margin:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__button,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:focus,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:hover{font-size:.875em}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:first-child{margin-top:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:last-child{margin-bottom:0}.wcs-recurring-totals-panel__details .wcs-recurring-totals-panel__details-total .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals__subscription-length{float:right} +.wcs-recurring-totals-panel{padding:1em 0 0;position:relative}.wcs-recurring-totals-panel:after{border-style:solid;border-width:1px 0;bottom:0;content:"";display:block;left:0;opacity:.3;pointer-events:none;position:absolute;right:0;top:0}.wcs-recurring-totals-panel+.wcs-recurring-totals-panel:after{border-top-width:0}.wcs-recurring-totals-panel .wc-block-components-panel .wc-block-components-totals-item{padding-left:0;padding-right:0}.wcs-recurring-totals-panel .wc-block-components-totals-item__label:first-letter{text-transform:capitalize}.wcs-recurring-totals-panel .wcs-recurring-totals-panel__title .wc-block-components-totals-item__label{font-weight:500}.wcs-recurring-totals-panel__title{margin:0}.wc-block-components-main .wcs-recurring-totals-panel__details{padding:0 16px}.wcs-recurring-totals-panel__details .wc-block-components-panel__button,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:focus,.wcs-recurring-totals-panel__details .wc-block-components-panel__button:hover{font-size:.875em}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:first-child{margin-top:0}.wcs-recurring-totals-panel__details .wc-block-components-panel__content>.wc-block-components-totals-item:last-child{margin-bottom:0}.wcs-recurring-totals-panel__details .wcs-recurring-totals-panel__details-total .wc-block-components-totals-item__label{font-weight:700}.wcs-recurring-totals__subscription-length{float:right} +.wc-block-components-local-pickup-rates-control .wc-block-components-local-pickup-select:not(:last-child){margin-bottom:16px} diff --git a/build/index.js b/build/index.js index 2b2ffd0..fed1387 100644 --- a/build/index.js +++ b/build/index.js @@ -1,4 +1,4 @@ -(()=>{"use strict";var e={20:(e,s,i)=>{var n=i(609),t=Symbol.for("react.element"),r=Symbol.for("react.fragment"),o=Object.prototype.hasOwnProperty,c=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,s,i){var n,r={},l=null,p=null;for(n in void 0!==i&&(l=""+i),void 0!==s.key&&(l=""+s.key),void 0!==s.ref&&(p=s.ref),s)o.call(s,n)&&!a.hasOwnProperty(n)&&(r[n]=s[n]);if(e&&e.defaultProps)for(n in s=e.defaultProps)void 0===r[n]&&(r[n]=s[n]);return{$$typeof:t,type:e,key:l,ref:p,props:r,_owner:c.current}}s.Fragment=r,s.jsx=l,s.jsxs=l},609:e=>{e.exports=window.React},848:(e,s,i)=>{e.exports=i(20)}},s={};const i=window.wp.plugins,n=window.wc.blocksCheckout,t=window.wp.i18n,r=window.wc.priceFormat,o=window.wc.wcSettings,c=window.wp.data,a=window.wc.wcBlocksData;function l(e){return{day:(0,t._nx)("day","days",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),week:(0,t._nx)("week","weeks",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),month:(0,t._nx)("month","months",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),year:(0,t._nx)("year","years",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions")}}function p({billing_interval:e,billing_period:s},i,n){const r=l(e)[s];return i=i.trim(),1===e?`${n} ${i} ${r}`:(0,t.sprintf)( +(()=>{"use strict";var e={20:(e,s,i)=>{var t=i(609),n=Symbol.for("react.element"),r=Symbol.for("react.fragment"),o=Object.prototype.hasOwnProperty,c=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,s,i){var t,r={},l=null,p=null;for(t in void 0!==i&&(l=""+i),void 0!==s.key&&(l=""+s.key),void 0!==s.ref&&(p=s.ref),s)o.call(s,t)&&!a.hasOwnProperty(t)&&(r[t]=s[t]);if(e&&e.defaultProps)for(t in s=e.defaultProps)void 0===r[t]&&(r[t]=s[t]);return{$$typeof:n,type:e,key:l,ref:p,props:r,_owner:c.current}}s.Fragment=r,s.jsx=l,s.jsxs=l},609:e=>{e.exports=window.React},848:(e,s,i)=>{e.exports=i(20)}},s={};function i(t){var n=s[t];if(void 0!==n)return n.exports;var r=s[t]={exports:{}};return e[t](r,r.exports,i),r.exports}const t=window.wp.plugins,n=window.wc.blocksCheckout,r=window.wp.i18n,o=window.wc.priceFormat,c=window.wc.wcSettings,a=window.wp.data,l=window.wc.wcBlocksData;function p(e){return{day:(0,r._nx)("day","days",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),week:(0,r._nx)("week","weeks",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),month:(0,r._nx)("month","months",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions"),year:(0,r._nx)("year","years",e,"Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular.","woocommerce-subscriptions")}}function u({billing_interval:e,billing_period:s},i,t){const n=p(e)[s];return i=i.trim(),1===e?`${t} ${i} ${n}`:(0,r.sprintf)( /* * translators: %1$s is the price of the product. %2$s is the separator used e.g "every" or "/", * %3$d is the length, %4$s is week, month, year @@ -7,30 +7,30 @@ * translators: %1$s is the price of the product. %2$s is the separator used e.g "every" or "/", * %3$d is the length, %4$s is week, month, year */ -(0,t.__)("%1$s %2$s %3$d %4$s","woocommerce-subscriptions"),n,i,e,r)}function u({subscriptionLength:e,billingInterval:s}){return e===s}const d=(0,o.getSetting)("countryData",{}),g=(0,o.getSetting)("countries",{}),m={...Object.fromEntries(Object.keys(d).filter((e=>!0===d[e].allowBilling)).map((e=>[e,g[e]||""]))),...Object.fromEntries(Object.keys(d).filter((e=>!0===d[e].allowShipping)).map((e=>[e,g[e]||""])))},_=Object.fromEntries(Object.keys(m).map((e=>[e,d[e].locale||{}]))),b={address:["first_name","last_name","company","address_1","address_2","city","postcode","country","state","phone"],contact:["email"],order:[]},h=Object.entries(_).reduce(((e,[s,i])=>(e[s]=Object.entries(i).reduce(((e,[s,i])=>(e[s]=(e=>{const s={};return void 0!==e.label&&(s.label=e.label),void 0!==e.required&&(s.required=e.required),void 0!==e.hidden&&(s.hidden=e.hidden),void 0===e.label||e.optionalLabel||(s.optionalLabel=(0,t.sprintf)(/* translators: %s Field label. */ /* translators: %s Field label. */ -(0,t.__)("%s (optional)","woocommerce-subscriptions"),e.label)),void 0!==e.optionalLabel&&(s.optionalLabel=e.optionalLabel),e.index&&("number"==typeof e.index&&(s.index=e.index),"string"==typeof e.index&&(s.index=parseInt(e.index,10))),e.hidden&&(s.required=!1),s})(i),e)),{}),e)),{}),w=["state","country","postcode","city"],y=e=>e.some((e=>!!e.shipping_rates.length)),f=(0,o.getSetting)("collectableMethodIds",[]),v=(0,o.getSetting)("localPickupEnabled",!1);var x=function i(n){var t=s[n];if(void 0!==t)return t.exports;var r=s[n]={exports:{}};return e[n](r,r.exports,i),r.exports}(848);const k=(0,o.getSetting)("displayCartPricesIncludingTax",!1),S=({currency:e,values:s,isLoading:i})=>{const{total_discount:r,total_discount_tax:o}=s,c=parseInt(r,10);if(!c)return null;const a=parseInt(o,10),l=k?c+a:c;return(0,x.jsx)(n.TotalsItem,{className:"wc-block-components-totals-discount",currency:e,label:(0,t.__)("Discount","woocommerce-subscriptions"),value:-1*l,showSkeleton:i})},j=({values:e,currency:s,shippingRatePackages:i,isLoading:n,needsShipping:r,calculatedShipping:l,shippingAddress:p})=>{const u=(0,c.useSelect)((e=>e(a.checkoutStore).prefersCollection()));if(!r||!l)return null;const d=(_=((e,s)=>e.map((e=>({...e,shipping_rates:e.shipping_rates.filter((e=>{const i=(n=e.method_id,!!v&&(Array.isArray(n)?!!n.find((e=>f.includes(e))):f.includes(n)));var n;return s?i:!i}))}))))(i,null!=u&&u),!!y(_)&&_.every((e=>e.shipping_rates.every((e=>!e.selected||(e=>f.includes(e.method_id))(e)))))),g=!!(m=p).country&&((e,s,i="")=>{const n=i&&void 0!==h[i]?h[i]:{};return e.map((e=>({key:e,...s&&e in s?s[e]:{},...n&&e in n?n[e]:{}}))).sort(((e,s)=>e.index-s.index))})((0,o.getSetting)("addressFieldsLocations",b).address,o.defaultFields,m.country).filter((({key:e})=>w.includes(e))).every((({key:e,hidden:s,required:i})=>!0===s||!1===i||e in m&&""!==m[e]));var m,_;return(0,x.jsx)(I,{label:d?(0,t.__)("Pickup","woocommerce-subscriptions"):(0,t.__)("Delivery","woocommerce-subscriptions"),placeholder:(0,x.jsx)("span",{className:"wc-block-components-shipping-placeholder__value",children:g?(0,t.__)("No available delivery option","woocommerce-subscriptions"):(0,t.__)("Enter address to calculate","woocommerce-subscriptions")}),isLoading:n,shippingRatePackages:i,currency:s,values:e})},I=({values:e,currency:s,shippingRatePackages:i,label:r,placeholder:c,isLoading:a})=>{const l=i?.flatMap((e=>e.shipping_rates)).find((({selected:e})=>e))?.name,p=!!y(u=i)&&u.some((e=>e.shipping_rates.some((e=>e.selected))));var u;const d=!p||i?.length>1?r:(0,t.__)("Shipping","woocommerce-subscriptions"),g=k?parseInt(e.total_shipping,10)+parseInt(e.total_shipping_tax,10):parseInt(e.total_shipping,10),m=0===g&&(0,o.isWcVersion)("9.0",">=")?(0,x.jsx)("strong",{children:(0,t.__)("Free","woocommerce-subscriptions")}):g;return(0,x.jsx)(n.TotalsItem,{value:p?m:c,label:d,currency:s,showSkeleton:a,description:!!l&&(0,t.sprintf)( +(0,r.__)("%1$s %2$s %3$d %4$s","woocommerce-subscriptions"),t,i,e,n)}function d({subscriptionLength:e,billingInterval:s}){return e===s}const g=(0,c.getSetting)("countryData",{}),m=(0,c.getSetting)("countries",{}),_={...Object.fromEntries(Object.keys(g).filter((e=>!0===g[e].allowBilling)).map((e=>[e,m[e]||""]))),...Object.fromEntries(Object.keys(g).filter((e=>!0===g[e].allowShipping)).map((e=>[e,m[e]||""])))},h=Object.fromEntries(Object.keys(_).map((e=>[e,g[e].locale||{}]))),b={address:["first_name","last_name","company","address_1","address_2","city","postcode","country","state","phone"],contact:["email"],order:[]},w=Object.entries(h).reduce(((e,[s,i])=>(e[s]=Object.entries(i).reduce(((e,[s,i])=>(e[s]=(e=>{const s={};return void 0!==e.label&&(s.label=e.label),void 0!==e.required&&(s.required=e.required),void 0!==e.hidden&&(s.hidden=e.hidden),void 0===e.label||e.optionalLabel||(s.optionalLabel=(0,r.sprintf)(/* translators: %s Field label. */ /* translators: %s Field label. */ +(0,r.__)("%s (optional)","woocommerce-subscriptions"),e.label)),void 0!==e.optionalLabel&&(s.optionalLabel=e.optionalLabel),e.index&&("number"==typeof e.index&&(s.index=e.index),"string"==typeof e.index&&(s.index=parseInt(e.index,10))),e.hidden&&(s.required=!1),s})(i),e)),{}),e)),{}),y=["state","country","postcode","city"],f=e=>e.some((e=>!!e.shipping_rates.length)),v=(0,c.getSetting)("collectableMethodIds",[]),x=(0,c.getSetting)("localPickupEnabled",!1);var k=i(848);const S=(0,c.getSetting)("displayCartPricesIncludingTax",!1),L=({currency:e,values:s,isLoading:i})=>{const{total_discount:t,total_discount_tax:o}=s,c=parseInt(t,10);if(!c)return null;const a=parseInt(o,10),l=S?c+a:c;return(0,k.jsx)(n.TotalsItem,{className:"wc-block-components-totals-discount",currency:e,label:(0,r.__)("Discount","woocommerce-subscriptions"),value:-1*l,showSkeleton:i})},j=({values:e,currency:s,shippingRatePackages:i,isLoading:t,needsShipping:n,calculatedShipping:o,shippingAddress:p})=>{const u=(0,a.useSelect)((e=>e(l.checkoutStore).prefersCollection()));if(!n||!o)return null;const d=(_=((e,s)=>e.map((e=>({...e,shipping_rates:e.shipping_rates.filter((e=>{const i=(t=e.method_id,!!x&&(Array.isArray(t)?!!t.find((e=>v.includes(e))):v.includes(t)));var t;return s?i:!i}))}))))(i,null!=u&&u),!!f(_)&&_.every((e=>e.shipping_rates.every((e=>!e.selected||(e=>v.includes(e.method_id))(e)))))),g=!!(m=p).country&&((e,s,i="")=>{const t=i&&void 0!==w[i]?w[i]:{};return e.map((e=>({key:e,...s&&e in s?s[e]:{},...t&&e in t?t[e]:{}}))).sort(((e,s)=>e.index-s.index))})((0,c.getSetting)("addressFieldsLocations",b).address,c.defaultFields,m.country).filter((({key:e})=>y.includes(e))).every((({key:e,hidden:s,required:i})=>!0===s||!1===i||e in m&&""!==m[e]));var m,_;return(0,k.jsx)(I,{label:d?(0,r.__)("Pickup","woocommerce-subscriptions"):(0,r.__)("Delivery","woocommerce-subscriptions"),placeholder:(0,k.jsx)("span",{className:"wc-block-components-shipping-placeholder__value",children:g?(0,r.__)("No available delivery option","woocommerce-subscriptions"):(0,r.__)("Enter address to calculate","woocommerce-subscriptions")}),isLoading:t,shippingRatePackages:i,currency:s,values:e})},I=({values:e,currency:s,shippingRatePackages:i,label:t,placeholder:o,isLoading:a})=>{const l=i?.flatMap((e=>e.shipping_rates)).find((({selected:e})=>e))?.name,p=!!f(u=i)&&u.some((e=>e.shipping_rates.some((e=>e.selected))));var u;const d=!p||i?.length>1?t:(0,r.__)("Shipping","woocommerce-subscriptions"),g=S?parseInt(e.total_shipping,10)+parseInt(e.total_shipping_tax,10):parseInt(e.total_shipping,10),m=0===g&&(0,c.isWcVersion)("9.0",">=")?(0,k.jsx)("strong",{children:(0,r.__)("Free","woocommerce-subscriptions")}):g;return(0,k.jsx)(n.TotalsItem,{value:p?m:o,label:d,currency:s,showSkeleton:a,description:!!l&&(0,r.sprintf)( // translators: %s selected shipping rate (ex: flat rate) // translators: %s selected shipping rate (ex: flat rate) -(0,t.__)("via %s","woocommerce-subscriptions"),l)})},L=({nextPaymentDate:e,subscriptionLength:s,billingPeriod:i,billingInterval:n})=>{const r=function({subscriptionLength:e,billingPeriod:s}){const i=l(e);return(0,t.sprintf)("For %1$d %2$s",e,i[s],"woocommerce-subscriptions")}({subscriptionLength:s,billingPeriod:i}),o=u({subscriptionLength:s,billingInterval:n})?(0,t.sprintf)(/* Translators: %1$s is a date. */ /* Translators: %1$s is a date. */ -(0,t.__)("Due: %1$s","woocommerce-subscriptions"),e):(0,t.sprintf)(/* Translators: %1$s is a date. */ /* Translators: %1$s is a date. */ -(0,t.__)("Starting: %1$s","woocommerce-subscriptions"),e);return(0,x.jsxs)("span",{children:[!!e&&o," ",!!s&&s>=n&&(0,x.jsx)("span",{className:"wcs-recurring-totals__subscription-length",children:r})]})},P=({currency:e,billingInterval:s,billingPeriod:i,nextPaymentDate:r,subscriptionLength:o,totals:c,isLoading:a})=>{const l=u({billingInterval:s,subscriptionLength:o})?(0,t.__)("Total","woocommerce-subscriptions"):function({billingInterval:e,billingPeriod:s}){switch(e){case 1:if("day"===s)return(0,t.__)("Daily recurring total","woocommerce-subscriptions");if("week"===s)return(0,t.__)("Weekly recurring total","woocommerce-subscriptions");if("month"===s)return(0,t.__)("Monthly recurring total","woocommerce-subscriptions");if("year"===s)return(0,t.__)("Yearly recurring total","woocommerce-subscriptions");break;case 2:return(0,t.sprintf)(/* translators: %1$s is week, month, year */ /* translators: %1$s is week, month, year */ -(0,t.__)("Recurring total every 2nd %1$s","woocommerce-subscriptions"),s);case 3:return(0,t.sprintf)(/* Translators: %1$s is week, month, year */ /* Translators: %1$s is week, month, year */ -(0,t.__)("Recurring total every 3rd %1$s","woocommerce-subscriptions"),s);default:return(0,t.sprintf)(/* Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year */ /* Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year */ -(0,t.__)("Recurring total every %1$dth %2$s","woocommerce-subscriptions"),e,s)}}({billingInterval:s,billingPeriod:i});return(0,x.jsx)(n.TotalsItem,{className:"wcs-recurring-totals-panel__title",currency:e,label:l,value:c,showSkeleton:a,description:(0,x.jsx)(L,{nextPaymentDate:r,subscriptionLength:o,billingInterval:s,billingPeriod:i})})},O=({subscription:e,needsShipping:s,calculatedShipping:i,shippingAddress:o})=>{const{isLoading:l}=(()=>{const{cartIsLoading:e,isLoadingRates:s,hasPendingItemsOperations:i,isApplyingCoupon:n,isRemovingCoupon:t}=(0,c.useSelect)((e=>{const s=e(a.cartStore);return{cartIsLoading:!s.hasFinishedResolution("getCartData",[]),isLoadingRates:s.isAddressFieldsForShippingRatesUpdating(),hasPendingItemsOperations:s.hasPendingItemsOperations(),isApplyingCoupon:s.isApplyingCoupon(),isRemovingCoupon:s.isRemovingCoupon()}}),[]),r=(0,c.useSelect)((e=>e(a.checkoutStore).isCalculating()),[]);return{isLoading:e||s||n||t||r||i}})(),{totals:p,billing_interval:u,billing_period:d,next_payment_date:g,subscription_length:m,shipping_rates:_}=e;if(!g)return null;const b=(0,r.getCurrencyFromPriceResponse)(p);return(0,x.jsxs)("div",{className:"wcs-recurring-totals-panel",children:[(0,x.jsx)(P,{billingInterval:u,billingPeriod:d,nextPaymentDate:g,subscriptionLength:m,totals:parseInt(p.total_price,10),currency:b,isLoading:l}),(0,x.jsxs)(n.Panel,{className:"wcs-recurring-totals-panel__details",initialOpen:!1,title:(0,t.__)("Details","woocommerce-subscriptions"),children:[(0,x.jsxs)(n.TotalsWrapper,{children:[(0,x.jsx)(n.Subtotal,{currency:b,values:p,showSkeleton:l}),(0,x.jsx)(S,{currency:b,values:p,isLoading:l})]}),(0,x.jsx)(n.TotalsWrapper,{className:"wc-block-components-totals-shipping",children:(0,x.jsx)(j,{currency:b,needsShipping:s,calculatedShipping:i,values:p,shippingAddress:o,shippingRatePackages:_,isLoading:l})}),!k&&(0,x.jsx)(n.TotalsWrapper,{children:(0,x.jsx)(n.TotalsTaxes,{currency:b,values:p})}),(0,x.jsx)(n.TotalsWrapper,{children:(0,x.jsx)(n.TotalsItem,{className:"wcs-recurring-totals-panel__details-total",currency:b,label:(0,t.__)("Total","woocommerce-subscriptions"),value:parseInt(p.total_price,10),showSkeleton:l})})]})]})},R=({extensions:e,cart:s})=>{const{subscriptions:i}=e,{cartNeedsShipping:n,cartHasCalculatedShipping:t,shippingAddress:r}=s;return i&&0!==i.length?i.map((({key:e,...s})=>(0,x.jsx)(O,{subscription:s,needsShipping:n,calculatedShipping:t,shippingAddress:r},e))):null},C=window.wp.element,$=({extensions:e,collapsible:s,collapse:i,showItems:n,noResultsMessage:t,renderOption:r,components:o,context:c})=>{const{subscriptions:a=[]}=e,{ShippingRatesControlPackage:l}=o,p=(0,C.useMemo)((()=>Object.values(a).map((e=>e.shipping_rates)).filter(Boolean).flat()),[a]),u=(0,C.useMemo)((()=>p.length>1||i),[p.length,i]),d=(0,C.useMemo)((()=>p.length>1||n),[p.length,n]);return p.filter((e=>!e.match_initial_rates&&e.needs_shipping)).map((({package_id:e,...i})=>(0,x.jsx)(l,{packageId:e,packageData:i,collapsible:s,collapse:u,showItems:d,noResultsMessage:t,renderOption:r,highlightChecked:"woocommerce/checkout"===c},e)))};(0,i.registerPlugin)("woocommerce-subscriptions",{render:()=>(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(n.ExperimentalOrderShippingPackages,{children:(0,x.jsx)($,{})}),(0,x.jsx)(n.ExperimentalOrderMeta,{children:(0,x.jsx)(R,{})})]}),scope:"woocommerce-checkout"}),(0,n.registerCheckoutFilters)("woocommerce-subscriptions",{totalLabel:(e,{subscriptions:s})=>s?.length>0?(0,t.__)("Total due today","woocommerce-subscriptions"):e,subtotalPriceFormat:(e,{subscriptions:s})=>{if(s?.billing_period&&s?.billing_interval){const{billing_interval:i,subscription_length:n}=s;return u({subscriptionLength:n,billingInterval:i})?p(s,1===n? +(0,r.__)("via %s","woocommerce-subscriptions"),l)})},P=({nextPaymentDate:e,subscriptionLength:s,billingPeriod:i,billingInterval:t})=>{const n=function({subscriptionLength:e,billingPeriod:s}){const i=p(e);return(0,r.sprintf)("For %1$d %2$s",e,i[s],"woocommerce-subscriptions")}({subscriptionLength:s,billingPeriod:i}),o=d({subscriptionLength:s,billingInterval:t})?(0,r.sprintf)(/* Translators: %1$s is a date. */ /* Translators: %1$s is a date. */ +(0,r.__)("Due: %1$s","woocommerce-subscriptions"),e):(0,r.sprintf)(/* Translators: %1$s is a date. */ /* Translators: %1$s is a date. */ +(0,r.__)("Starting: %1$s","woocommerce-subscriptions"),e);return(0,k.jsxs)("span",{children:[!!e&&o," ",!!s&&s>=t&&(0,k.jsx)("span",{className:"wcs-recurring-totals__subscription-length",children:n})]})},O=({currency:e,billingInterval:s,billingPeriod:i,nextPaymentDate:t,subscriptionLength:o,totals:c,isLoading:a})=>{const l=d({billingInterval:s,subscriptionLength:o})?(0,r.__)("Total","woocommerce-subscriptions"):function({billingInterval:e,billingPeriod:s}){switch(e){case 1:if("day"===s)return(0,r.__)("Daily recurring total","woocommerce-subscriptions");if("week"===s)return(0,r.__)("Weekly recurring total","woocommerce-subscriptions");if("month"===s)return(0,r.__)("Monthly recurring total","woocommerce-subscriptions");if("year"===s)return(0,r.__)("Yearly recurring total","woocommerce-subscriptions");break;case 2:return(0,r.sprintf)(/* translators: %1$s is week, month, year */ /* translators: %1$s is week, month, year */ +(0,r.__)("Recurring total every 2nd %1$s","woocommerce-subscriptions"),s);case 3:return(0,r.sprintf)(/* Translators: %1$s is week, month, year */ /* Translators: %1$s is week, month, year */ +(0,r.__)("Recurring total every 3rd %1$s","woocommerce-subscriptions"),s);default:return(0,r.sprintf)(/* Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year */ /* Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year */ +(0,r.__)("Recurring total every %1$dth %2$s","woocommerce-subscriptions"),e,s)}}({billingInterval:s,billingPeriod:i});return(0,k.jsx)(n.TotalsItem,{className:"wcs-recurring-totals-panel__title",currency:e,label:l,value:c,showSkeleton:a,description:(0,k.jsx)(P,{nextPaymentDate:t,subscriptionLength:o,billingInterval:s,billingPeriod:i})})},C=({subscription:e,needsShipping:s,calculatedShipping:i,shippingAddress:t})=>{const{isLoading:c}=(()=>{const{cartIsLoading:e,isLoadingRates:s,hasPendingItemsOperations:i,isApplyingCoupon:t,isRemovingCoupon:n}=(0,a.useSelect)((e=>{const s=e(l.cartStore);return{cartIsLoading:!s.hasFinishedResolution("getCartData",[]),isLoadingRates:s.isAddressFieldsForShippingRatesUpdating(),hasPendingItemsOperations:s.hasPendingItemsOperations(),isApplyingCoupon:s.isApplyingCoupon(),isRemovingCoupon:s.isRemovingCoupon()}}),[]),r=(0,a.useSelect)((e=>e(l.checkoutStore).isCalculating()),[]);return{isLoading:e||s||t||n||r||i}})(),{totals:p,billing_interval:u,billing_period:d,next_payment_date:g,subscription_length:m,shipping_rates:_}=e;if(!g)return null;const h=(0,o.getCurrencyFromPriceResponse)(p);return(0,k.jsxs)("div",{className:"wcs-recurring-totals-panel",children:[(0,k.jsx)(O,{billingInterval:u,billingPeriod:d,nextPaymentDate:g,subscriptionLength:m,totals:parseInt(p.total_price,10),currency:h,isLoading:c}),(0,k.jsxs)(n.Panel,{className:"wcs-recurring-totals-panel__details",initialOpen:!1,title:(0,r.__)("Details","woocommerce-subscriptions"),children:[(0,k.jsxs)(n.TotalsWrapper,{children:[(0,k.jsx)(n.Subtotal,{currency:h,values:p,showSkeleton:c}),(0,k.jsx)(L,{currency:h,values:p,isLoading:c})]}),(0,k.jsx)(n.TotalsWrapper,{className:"wc-block-components-totals-shipping",children:(0,k.jsx)(j,{currency:h,needsShipping:s,calculatedShipping:i,values:p,shippingAddress:t,shippingRatePackages:_,isLoading:c})}),!S&&(0,k.jsx)(n.TotalsWrapper,{children:(0,k.jsx)(n.TotalsTaxes,{currency:h,values:p})}),(0,k.jsx)(n.TotalsWrapper,{children:(0,k.jsx)(n.TotalsItem,{className:"wcs-recurring-totals-panel__details-total",currency:h,label:(0,r.__)("Total","woocommerce-subscriptions"),value:parseInt(p.total_price,10),showSkeleton:c})})]})]})},R=({extensions:e,cart:s})=>{const{subscriptions:i}=e,{cartNeedsShipping:t,cartHasCalculatedShipping:n,shippingAddress:r}=s;return i&&0!==i.length?i.map((({key:e,...s})=>(0,k.jsx)(C,{subscription:s,needsShipping:t,calculatedShipping:n,shippingAddress:r},e))):null},D=window.wp.element,$=(0,c.getSetting)("collectableMethodIds",[]),T=({extensions:e,collapsible:s,collapse:i,showItems:t,noResultsMessage:n,renderOption:r,components:o,context:c})=>{const{subscriptions:a=[]}=e,{ShippingRatesControlPackage:l}=o,p=(0,D.useMemo)((()=>Object.values(a).map((e=>e.shipping_rates)).filter(Boolean).flat()),[a]),u=(0,D.useMemo)((()=>p.length>1||i),[p.length,i]),d=(0,D.useMemo)((()=>p.length>1||t),[p.length,t]);return p.filter((e=>!e.match_initial_rates&&e.needs_shipping)).map((({package_id:e,...i})=>(i.shipping_rates=i.shipping_rates.filter((e=>!$.includes(e.method_id))),(0,k.jsx)(l,{packageId:e,packageData:i,collapsible:s,collapse:u,showItems:d,noResultsMessage:n,renderOption:r,highlightChecked:"woocommerce/checkout"===c},e))))};var E=i(609);const F=(0,c.getSetting)("collectableMethodIds",[]),N=({packageId:e,packageData:s,showItems:i,renderPickupLocation:t,pickupLocations:n,packageCount:r,LocalPickupSelect:o})=>{var c;const{selectShippingRate:p}=(0,a.useDispatch)(l.cartStore),[u,d]=(0,E.useState)(null!==(c=s.shipping_rates.find((e=>e.selected))?.rate_id)&&void 0!==c?c:s.shipping_rates[0]?.rate_id);return(0,D.useEffect)((()=>{u&&p(u,e)}),[]),(0,k.jsx)(o,{title:s.name,packageData:s,selectedOption:null!=u?u:"",showItems:i,renderPickupLocation:t,pickupLocations:n,packageCount:r,onChange:s=>{d(s),p(s,e)}})},M=({extensions:e,showItems:s,renderPickupLocation:i,components:t})=>{const{subscriptions:n=[]}=e,{LocalPickupSelect:r}=t,o=(0,D.useMemo)((()=>Object.values(n).map((e=>e.shipping_rates)).filter(Boolean).flat()),[n]),c=(0,D.useMemo)((()=>o.length>1||s),[o.length,s]);return o.filter((e=>!e.match_initial_rates)).map((({package_id:e,...s})=>(s.shipping_rates=s.shipping_rates.filter((e=>F.includes(e.method_id))),(0,k.jsx)(N,{packageId:e,packageData:s,showItems:c,renderPickupLocation:i,pickupLocations:s.shipping_rates,packageCount:o.length,LocalPickupSelect:r},e))))};(0,t.registerPlugin)("woocommerce-subscriptions",{render:()=>(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(n.ExperimentalOrderShippingPackages,{children:(0,k.jsx)(T,{})}),(0,k.jsx)(n.ExperimentalOrderLocalPickupPackages,{children:(0,k.jsx)(M,{})}),(0,k.jsx)(n.ExperimentalOrderMeta,{children:(0,k.jsx)(R,{})})]}),scope:"woocommerce-checkout"}),(0,n.registerCheckoutFilters)("woocommerce-subscriptions",{totalLabel:(e,{subscriptions:s})=>s?.length>0?(0,r.__)("Total due today","woocommerce-subscriptions"):e,subtotalPriceFormat:(e,{subscriptions:s})=>{if(s?.billing_period&&s?.billing_interval){const{billing_interval:i,subscription_length:t}=s;return d({subscriptionLength:t,billingInterval:i})?u(s,1===t? // translators: the word used to describe billing frequency, e.g. "for" 1 day or "for" 1 month. // translators: the word used to describe billing frequency, e.g. "for" 1 day or "for" 1 month. -(0,t.__)("for 1","woocommerce-subscriptions"): +(0,r.__)("for 1","woocommerce-subscriptions"): // translators: the word used to describe billing frequency, e.g. "for" 6 days or "for" 2 weeks. // translators: the word used to describe billing frequency, e.g. "for" 6 days or "for" 2 weeks. -(0,t.__)("for","woocommerce-subscriptions"),e):p(s, +(0,r.__)("for","woocommerce-subscriptions"),e):u(s, // translators: the word used to describe billing frequency, e.g. "every" 6 days or "every" 2 weeks. // translators: the word used to describe billing frequency, e.g. "every" 6 days or "every" 2 weeks. -(0,t.__)("every","woocommerce-subscriptions"),e)}return e},saleBadgePriceFormat:(e,{subscriptions:s})=>s?.billing_period&&s?.billing_interval?p(s,"/",e):e,itemName:(e,{subscriptions:s})=>s?.is_resubscribe?(0,t.sprintf)( +(0,r.__)("every","woocommerce-subscriptions"),e)}return e},saleBadgePriceFormat:(e,{subscriptions:s})=>s?.billing_period&&s?.billing_interval?u(s,"/",e):e,itemName:(e,{subscriptions:s})=>s?.is_resubscribe?(0,r.sprintf)( // translators: %s Product name. // translators: %s Product name. -(0,t.__)("%s (resubscription)","woocommerce-subscriptions"),e):s?.switch_type?(0,t.sprintf)( +(0,r.__)("%s (resubscription)","woocommerce-subscriptions"),e):s?.switch_type?(0,r.sprintf)( // translators: %1$s Product name, %2$s Switch type (upgraded, downgraded, or crossgraded). // translators: %1$s Product name, %2$s Switch type (upgraded, downgraded, or crossgraded). -(0,t.__)("%1$s (%2$s)","woocommerce-subscriptions"),e,function(e){switch(e){case"upgraded":return(0,t.__)("Upgrade","woocommerce-subscriptions");case"downgraded":return(0,t.__)("Downgrade","woocommerce-subscriptions");case"crossgraded":return(0,t.__)("Crossgrade","woocommerce-subscriptions");default:return""}}(s.switch_type)):e,cartItemPrice:(e,{subscriptions:s},{context:i})=>s?.sign_up_fees?"cart"===i?(0,t.sprintf)(/* translators: %s is the subscription price to pay immediately (ie: $10). */ /* translators: %s is the subscription price to pay immediately (ie: $10). */ -(0,t.__)("Due today %s","woocommerce-subscriptions"),e):(0,t.sprintf)(/* translators: %s is the subscription price to pay immediately (ie: $10). */ /* translators: %s is the subscription price to pay immediately (ie: $10). */ -(0,t.__)("%s due today","woocommerce-subscriptions"),e):e,placeOrderButtonLabel:e=>{const s=(0,o.getSetting)("subscriptions_data");return s?.place_order_override?s?.place_order_override:e}})})(); \ No newline at end of file +(0,r.__)("%1$s (%2$s)","woocommerce-subscriptions"),e,function(e){switch(e){case"upgraded":return(0,r.__)("Upgrade","woocommerce-subscriptions");case"downgraded":return(0,r.__)("Downgrade","woocommerce-subscriptions");case"crossgraded":return(0,r.__)("Crossgrade","woocommerce-subscriptions");default:return""}}(s.switch_type)):e,cartItemPrice:(e,{subscriptions:s},{context:i})=>s?.sign_up_fees?"cart"===i?(0,r.sprintf)(/* translators: %s is the subscription price to pay immediately (ie: $10). */ /* translators: %s is the subscription price to pay immediately (ie: $10). */ +(0,r.__)("Due today %s","woocommerce-subscriptions"),e):(0,r.sprintf)(/* translators: %s is the subscription price to pay immediately (ie: $10). */ /* translators: %s is the subscription price to pay immediately (ie: $10). */ +(0,r.__)("%s due today","woocommerce-subscriptions"),e):e,placeOrderButtonLabel:e=>{const s=(0,c.getSetting)("subscriptions_data");return s?.place_order_override?s?.place_order_override:e}})})(); \ No newline at end of file diff --git a/build/wcsg-blocks-integration-rtl.css b/build/wcsg-blocks-integration-rtl.css index 6e270d3..69168a0 100644 --- a/build/wcsg-blocks-integration-rtl.css +++ b/build/wcsg-blocks-integration-rtl.css @@ -1 +1 @@ -.wcsg-gifting-to-container-editing{display:flex;gap:5px;margin-top:12px}.wcsg-gifting-to-container-editing .wc-block-components-text-input{flex-grow:1;margin-top:0}.wcsg-gifting-to-container-editing .wp-element-button.gifting-update-button:not(.is-link){min-height:unset;padding:0 var(--xs,20px)}.wcsg-gifting-to-container-editing .components-base-control__field{margin-bottom:0}.wcsg-gifting-to-container-editing .wc-block-components-text-input input:-webkit-autofill{padding-top:.5em}.wcsg-gifting-to-container-editing .has-error .components-text-control__input{color:var(--wc-red,#cc1818)}.wp-block-woocommerce-mini-cart-contents .wcsg-gifting-to-container-editing{flex-direction:column}.wp-block-woocommerce-mini-cart-contents .gifting-update-button{height:40px}.wcsg-gifting-to-container-view{align-items:center;display:flex;flex-wrap:wrap;gap:5px;max-width:100%}.wcsg-gifting-to-container-view span{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word;gap:5px}.wcsg-gifting-to-container-view .components-button.is-link{color:var(--wp--preset--color--contrast);flex-shrink:0;font-size:medium}.wc-block-checkout,.wc-block-components-product-details__gifting-to{align-items:center;display:flex;flex-wrap:wrap;max-width:100%}.wc-block-checkout .wc-block-components-product-details__name:after,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__name:after{content:" "}.wc-block-checkout .wc-block-components-product-details__value,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__value{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word}.wcsg-block-recipient-container .components-checkbox-control__label{font-size:medium}.wc-block-cart .wc-block-components-product-details__gifting-to,.wc-block-cart .wc-block-components-product-details__gifting-to-hidden,.wc-block-cart .wc-block-components-product-details__item-key,.wc-block-checkout .wc-block-components-product-details__gifting-to-hidden,.wc-block-checkout .wc-block-components-product-details__item-key,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to-hidden,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__item-key{display:none} +.wcsg-gifting-to-container-editing{display:flex;gap:5px;margin-top:10px;min-width:210px}.wcsg-gifting-to-container-editing .wc-block-components-text-input{flex-grow:1;margin-top:0}.wcsg-gifting-to-container-editing .wp-element-button.gifting-update-button:not(.is-link){min-height:unset;padding:0 var(--xs,20px)}.wcsg-gifting-to-container-editing .components-base-control__field{margin-bottom:0}.wcsg-gifting-to-container-editing .wc-block-components-text-input input:-webkit-autofill{padding-top:.5em}.wcsg-gifting-to-container-editing .has-error .components-text-control__input{color:var(--wc-red,#cc1818)}.wp-block-woocommerce-mini-cart-contents .wcsg-gifting-to-container-editing{flex-direction:column}.wp-block-woocommerce-mini-cart-contents .gifting-update-button{height:40px}.wcsg-gifting-to-container-view{align-items:center;display:flex;flex-wrap:wrap;gap:5px;max-width:100%}.wcsg-gifting-to-container-view span{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word;gap:5px}.wcsg-gifting-to-container-view .components-button.is-link{color:var(--wp--preset--color--contrast);flex-shrink:0;font-size:medium}.wc-block-checkout,.wc-block-components-product-details__gifting-to{align-items:center;display:flex;flex-wrap:wrap;max-width:100%}.wc-block-checkout .wc-block-components-product-details__name:after,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__name:after{content:" "}.wc-block-checkout .wc-block-components-product-details__value,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__value{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word}.wcsg-block-recipient-container{font-size:var(--wp--preset--font-size--small,14px);line-height:20px}.wcsg-block-recipient-container .components-checkbox-control__label{font-size:var(--wp--preset--font-size--small,14px);margin-bottom:0}.wc-block-cart .wc-block-components-product-details__gifting-to,.wc-block-cart .wc-block-components-product-details__gifting-to-hidden,.wc-block-cart .wc-block-components-product-details__item-key,.wc-block-checkout .wc-block-components-product-details__gifting-to-hidden,.wc-block-checkout .wc-block-components-product-details__item-key,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to-hidden,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__item-key{display:none} diff --git a/build/wcsg-blocks-integration.asset.php b/build/wcsg-blocks-integration.asset.php index 64da8d3..75cd01c 100644 --- a/build/wcsg-blocks-integration.asset.php +++ b/build/wcsg-blocks-integration.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'wc-blocks-checkout', 'wp-components', 'wp-data', 'wp-i18n', 'wp-plugins', 'wp-url'), 'version' => 'e5022699093de48ed96e'); + array('react', 'react-dom', 'wc-blocks-checkout', 'wp-components', 'wp-data', 'wp-i18n', 'wp-plugins', 'wp-url'), 'version' => 'e7869a0a766c0f65ff8a'); diff --git a/build/wcsg-blocks-integration.css b/build/wcsg-blocks-integration.css index 6e270d3..69168a0 100644 --- a/build/wcsg-blocks-integration.css +++ b/build/wcsg-blocks-integration.css @@ -1 +1 @@ -.wcsg-gifting-to-container-editing{display:flex;gap:5px;margin-top:12px}.wcsg-gifting-to-container-editing .wc-block-components-text-input{flex-grow:1;margin-top:0}.wcsg-gifting-to-container-editing .wp-element-button.gifting-update-button:not(.is-link){min-height:unset;padding:0 var(--xs,20px)}.wcsg-gifting-to-container-editing .components-base-control__field{margin-bottom:0}.wcsg-gifting-to-container-editing .wc-block-components-text-input input:-webkit-autofill{padding-top:.5em}.wcsg-gifting-to-container-editing .has-error .components-text-control__input{color:var(--wc-red,#cc1818)}.wp-block-woocommerce-mini-cart-contents .wcsg-gifting-to-container-editing{flex-direction:column}.wp-block-woocommerce-mini-cart-contents .gifting-update-button{height:40px}.wcsg-gifting-to-container-view{align-items:center;display:flex;flex-wrap:wrap;gap:5px;max-width:100%}.wcsg-gifting-to-container-view span{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word;gap:5px}.wcsg-gifting-to-container-view .components-button.is-link{color:var(--wp--preset--color--contrast);flex-shrink:0;font-size:medium}.wc-block-checkout,.wc-block-components-product-details__gifting-to{align-items:center;display:flex;flex-wrap:wrap;max-width:100%}.wc-block-checkout .wc-block-components-product-details__name:after,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__name:after{content:" "}.wc-block-checkout .wc-block-components-product-details__value,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__value{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word}.wcsg-block-recipient-container .components-checkbox-control__label{font-size:medium}.wc-block-cart .wc-block-components-product-details__gifting-to,.wc-block-cart .wc-block-components-product-details__gifting-to-hidden,.wc-block-cart .wc-block-components-product-details__item-key,.wc-block-checkout .wc-block-components-product-details__gifting-to-hidden,.wc-block-checkout .wc-block-components-product-details__item-key,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to-hidden,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__item-key{display:none} +.wcsg-gifting-to-container-editing{display:flex;gap:5px;margin-top:10px;min-width:210px}.wcsg-gifting-to-container-editing .wc-block-components-text-input{flex-grow:1;margin-top:0}.wcsg-gifting-to-container-editing .wp-element-button.gifting-update-button:not(.is-link){min-height:unset;padding:0 var(--xs,20px)}.wcsg-gifting-to-container-editing .components-base-control__field{margin-bottom:0}.wcsg-gifting-to-container-editing .wc-block-components-text-input input:-webkit-autofill{padding-top:.5em}.wcsg-gifting-to-container-editing .has-error .components-text-control__input{color:var(--wc-red,#cc1818)}.wp-block-woocommerce-mini-cart-contents .wcsg-gifting-to-container-editing{flex-direction:column}.wp-block-woocommerce-mini-cart-contents .gifting-update-button{height:40px}.wcsg-gifting-to-container-view{align-items:center;display:flex;flex-wrap:wrap;gap:5px;max-width:100%}.wcsg-gifting-to-container-view span{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word;gap:5px}.wcsg-gifting-to-container-view .components-button.is-link{color:var(--wp--preset--color--contrast);flex-shrink:0;font-size:medium}.wc-block-checkout,.wc-block-components-product-details__gifting-to{align-items:center;display:flex;flex-wrap:wrap;max-width:100%}.wc-block-checkout .wc-block-components-product-details__name:after,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__name:after{content:" "}.wc-block-checkout .wc-block-components-product-details__value,.wc-block-components-product-details__gifting-to .wc-block-components-product-details__value{align-items:center;display:inline-flex;max-width:100%;word-break:break-all;word-wrap:break-word}.wcsg-block-recipient-container{font-size:var(--wp--preset--font-size--small,14px);line-height:20px}.wcsg-block-recipient-container .components-checkbox-control__label{font-size:var(--wp--preset--font-size--small,14px);margin-bottom:0}.wc-block-cart .wc-block-components-product-details__gifting-to,.wc-block-cart .wc-block-components-product-details__gifting-to-hidden,.wc-block-cart .wc-block-components-product-details__item-key,.wc-block-checkout .wc-block-components-product-details__gifting-to-hidden,.wc-block-checkout .wc-block-components-product-details__item-key,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__gifting-to-hidden,.wp-block-woocommerce-mini-cart-contents .wc-block-components-product-details__item-key{display:none} diff --git a/build/wcsg-blocks-integration.js b/build/wcsg-blocks-integration.js index 2dc0abd..6c2d95c 100644 --- a/build/wcsg-blocks-integration.js +++ b/build/wcsg-blocks-integration.js @@ -1 +1 @@ -(()=>{"use strict";var e={20:(e,t,n)=>{var o=n(609),i=Symbol.for("react.element"),c=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,s=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var o,c={},l=null,u=null;for(o in void 0!==n&&(l=""+n),void 0!==t.key&&(l=""+t.key),void 0!==t.ref&&(u=t.ref),t)r.call(t,o)&&!a.hasOwnProperty(o)&&(c[o]=t[o]);if(e&&e.defaultProps)for(o in t=e.defaultProps)void 0===c[o]&&(c[o]=t[o]);return{$$typeof:i,type:e,key:l,ref:u,props:c,_owner:s.current}}t.Fragment=c,t.jsx=l,t.jsxs=l},338:(e,t,n)=>{var o=n(795);t.H=o.createRoot,o.hydrateRoot},609:e=>{e.exports=window.React},795:e=>{e.exports=window.ReactDOM},848:(e,t,n)=>{e.exports=n(20)}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var c=t[o]={exports:{}};return e[o](c,c.exports,n),c.exports}var o=n(338);const i=window.wp.plugins;var c=n(609);const r=window.wp.i18n,s=window.wp.components,a=window.wp.data,l=window.wp.url,u=window.wc.blocksCheckout;var d=n(848);const m=({lineItem:e})=>{const[t,n]=(0,c.useState)(!1),[o,i]=(0,c.useState)(!1),[m,p]=(0,c.useState)(""),[w,_]=(0,c.useState)(!0),g="invalid-gifting-recipient",{setValidationErrors:f,clearValidationError:b}=(0,a.useDispatch)("wc/store/validation"),h=e?.querySelector(".wc-block-components-product-details__item-key .wc-block-components-product-details__value")?.textContent||"",v=(0,a.useSelect)((e=>{if(!h)return null;const t=e("wc/store/cart");if(!t)return null;try{const e=t.getCartData();return e?.items?.find((e=>e.key===h))||null}catch(e){return null}}),[h]),k=(0,c.useMemo)((()=>{if(!v?.item_data)return null;const e=v.item_data.find((e=>"gifting_to_hidden"===e.name));return e?.value||null}),[v]);(0,c.useEffect)((()=>{null!==k&&(p(k),n(!0))}),[k]),(0,c.useEffect)((()=>{if(!e)return;const t=e.querySelector(".wc-block-components-product-details__gifting-to-hidden");if(!t)return;const o=t.querySelector(".wc-block-components-product-details__value");p(o?o.textContent:""),n(!0)}),[e]);const x=e=>{if(!e&&!(0,l.isEmail)(m))return _(!1),void f({[g]:{message:(0,r.__)("Please enter a valid email address","woocommerce-subscriptions"),hidden:!1}});i(!1),_(!0),b(g),(0,u.extensionCartUpdate)({namespace:"wcsg-cart",data:{recipient:!0===e?"":m,itemKey:h}}).then((()=>{i(!1)})).catch((()=>{_(!1),i(!0),f({[g]:{message:(0,r.__)("Please enter a valid email address","woocommerce-subscriptions"),hidden:!1}})}))};return h?(0,d.jsxs)("div",{className:"wcsg-gifting-to-container",children:[(!t||o)&&(0,d.jsx)(s.CheckboxControl,{"aria-label":window.wcSettings.wcsg_subscriptions_data.gifting_checkbox_text||(0,r.__)("This is a gift","woocommerce-subscriptions"),label:window.wcSettings.wcsg_subscriptions_data.gifting_checkbox_text||(0,r.__)("This is a gift","woocommerce-subscriptions"),checked:t,onChange:e=>{n(e),i(e)}}),t&&!o&&(0,d.jsxs)("div",{className:"wcsg-gifting-to-container-view",children:[(0,d.jsxs)("span",{title:(0,r.__)("Gifting to","woocommerce-subscriptions"),children:[(0,r.__)("Gifting to:","woocommerce-subscriptions")," ",!o&&m]}),(0,d.jsx)(s.Button,{variant:"link",onClick:()=>i(!0),children:(0,r.__)("Edit","woocommerce-subscriptions")}),(0,d.jsx)(s.Button,{variant:"link","aria-label":(0,r.__)("Remove gift recipient","woocommerce-subscriptions"),onClick:()=>(n(!1),p(""),void x(!0)),children:(0,r.__)("Remove","woocommerce-subscriptions")})]}),o&&(0,d.jsxs)("div",{className:"wcsg-gifting-to-container-editing",children:[(0,d.jsx)(s.TextControl,{type:"email",className:"wc-block-components-text-input "+(w?"":"has-error"),value:m,onChange:e=>p(e),onFocus:()=>_(!0),placeholder:(0,r.__)("Recipient's email address","woocommerce-subscriptions"),"aria-label":(0,r.__)("Gifting recipient","woocommerce-subscriptions"),role:"textbox"}),(0,d.jsx)("button",{className:"wc-block-components-button wp-element-button gifting-update-button",onClick:()=>x(!1),name:"Update",children:(0,r.__)("Update","woocommerce-subscriptions")})]}),o&&!w&&(0,d.jsx)(u.ValidationInputError,{elementId:g,propertyName:g})]}):null},p=()=>{const{__internalSetUseShippingAsBilling:e,setEditingShippingAddress:t}=(0,a.useDispatch)("wc/store/checkout"),n=(0,a.useSelect)((e=>{const t=e("wc/store/cart");if(!t)return null;try{const e=t.getCartData();return e?.items?.find((e=>e.item_data.find((e=>"gifting_to_hidden"===e.name))))||null}catch(e){return null}}),[]);return(0,c.useEffect)((()=>{n&&(e(!1),t(!0))}),[n,e,t]),(0,d.jsx)(d.Fragment,{})};window.addEventListener("load",(function(){let e=null;function t(){const t=document.querySelectorAll(".wc-block-components-product-metadata");0!==t.length&&(t.length&&e&&e.disconnect(),t.forEach((function(e,t){const n="gifting-recipient-"+t;if(!document.getElementById(n)){const t=document.createElement("div");t.className="wcsg-block-recipient-container",t.id=n,e.parentNode.insertBefore(t,e)}(0,o.H)(document.getElementById(n)).render((0,d.jsx)(m,{lineItem:e}))})))}function n(){setTimeout((()=>{e=new MutationObserver(t),t(),e.observe(document.body,{childList:!0,subtree:!0})}),200)}null!==document.querySelector(".wp-block-woocommerce-checkout")?(0,i.registerPlugin)("woocommerce-checkout-gifting",{render:p,icon:"gift",title:"Checkout Gifting Features",scope:"woocommerce-checkout"}):(n(),document.addEventListener("click",(function(e){e.target.matches(".wc-block-mini-cart__button, .wc-block-mini-cart__button *")&&n()})))}))})(); \ No newline at end of file +(()=>{"use strict";var e={20:(e,t,n)=>{var o=n(609),i=Symbol.for("react.element"),c=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,s=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var o,c={},l=null,u=null;for(o in void 0!==n&&(l=""+n),void 0!==t.key&&(l=""+t.key),void 0!==t.ref&&(u=t.ref),t)r.call(t,o)&&!a.hasOwnProperty(o)&&(c[o]=t[o]);if(e&&e.defaultProps)for(o in t=e.defaultProps)void 0===c[o]&&(c[o]=t[o]);return{$$typeof:i,type:e,key:l,ref:u,props:c,_owner:s.current}}t.Fragment=c,t.jsx=l,t.jsxs=l},338:(e,t,n)=>{var o=n(795);t.H=o.createRoot,o.hydrateRoot},609:e=>{e.exports=window.React},795:e=>{e.exports=window.ReactDOM},848:(e,t,n)=>{e.exports=n(20)}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var c=t[o]={exports:{}};return e[o](c,c.exports,n),c.exports}var o=n(338);const i=window.wp.plugins;var c=n(609);const r=window.wp.i18n,s=window.wp.components,a=window.wp.data,l=window.wp.url,u=window.wc.blocksCheckout;var d=n(848);const m=({lineItem:e,itemKey:t})=>{const[n,o]=(0,c.useState)(!1),[i,m]=(0,c.useState)(!1),[p,w]=(0,c.useState)(""),[_,f]=(0,c.useState)(!0),[g,b]=(0,c.useState)(!1),h=(0,c.useId)(),v="invalid-gifting-recipient",{setValidationErrors:k,clearValidationError:x}=(0,a.useDispatch)("wc/store/validation"),y=(0,a.useSelect)((e=>{if(!t)return null;const n=e("wc/store/cart");if(!n)return null;try{const e=n.getCartData();return e?.items?.find((e=>e.key===t))||null}catch(e){return null}}),[t]),S=(0,c.useMemo)((()=>{if(!y?.item_data)return null;const e=y.item_data.find((e=>"gifting_to_hidden"===e.name));return e?.value||null}),[y]);(0,c.useEffect)((()=>{null!==S&&(w(S),o(!0))}),[S]),(0,c.useEffect)((()=>{if(!e)return;const t=e.querySelector(".wc-block-components-product-details__gifting-to-hidden");if(!t)return;const n=t.querySelector(".wc-block-components-product-details__value");w(n?n.textContent:""),o(!0)}),[e]);const E=e=>{if(!e&&!(0,l.isEmail)(p))return f(!1),void k({[v]:{message:(0,r.__)("Please enter a valid email address","woocommerce-subscriptions"),hidden:!1}});m(!1),f(!0),x(v),(0,u.extensionCartUpdate)({namespace:"wcsg-cart",data:{recipient:!0===e?"":p,itemKey:t}}).then((()=>{m(!1)})).catch((()=>{f(!1),m(!0),k({[v]:{message:(0,r.__)("Please enter a valid email address","woocommerce-subscriptions"),hidden:!1}})}))};return(0,d.jsxs)("div",{className:"wcsg-gifting-to-container",children:[(!n||i)&&(0,d.jsx)(s.CheckboxControl,{"aria-label":window.wcSettings.wcsg_subscriptions_data.gifting_checkbox_text||(0,r.__)("This is a gift","woocommerce-subscriptions"),label:window.wcSettings.wcsg_subscriptions_data.gifting_checkbox_text||(0,r.__)("This is a gift","woocommerce-subscriptions"),checked:n,onChange:e=>{o(e),m(e)}}),n&&!i&&(0,d.jsxs)("div",{className:"wcsg-gifting-to-container-view",children:[(0,d.jsxs)("span",{title:(0,r.__)("Gifting to","woocommerce-subscriptions"),children:[(0,r.__)("Gifting to:","woocommerce-subscriptions")," ",!i&&p]}),(0,d.jsx)(s.Button,{variant:"link",onClick:()=>m(!0),children:(0,r.__)("Edit","woocommerce-subscriptions")}),(0,d.jsx)(s.Button,{variant:"link","aria-label":(0,r.__)("Remove gift recipient","woocommerce-subscriptions"),onClick:()=>(o(!1),w(""),void E(!0)),children:(0,r.__)("Remove","woocommerce-subscriptions")})]}),i&&(0,d.jsxs)("div",{className:"wcsg-gifting-to-container-editing wc-block-components-form",children:[(0,d.jsxs)("div",{className:`wc-block-components-text-input ${_?"":"has-error"} ${g||p?"is-active":""}`,children:[(0,d.jsx)("input",{type:"email",value:p,onChange:e=>w(e.target.value),onFocus:()=>{b(!0),f(!0)},onBlur:()=>{b(!1)},"aria-label":(0,r.__)("Gifting recipient","woocommerce-subscriptions"),id:h,"data-testid":"recipient-input"}),(0,d.jsx)("label",{htmlFor:h,children:(0,r.__)("Recipient's email address","woocommerce-subscriptions")})]}),(0,d.jsx)("button",{className:"wc-block-components-button wp-element-button gifting-update-button",onClick:()=>E(!1),name:"Update",children:(0,r.__)("Update","woocommerce-subscriptions")})]}),i&&!_&&(0,d.jsx)(u.ValidationInputError,{elementId:v,propertyName:v})]})},p=()=>{const{__internalSetUseShippingAsBilling:e,setEditingShippingAddress:t}=(0,a.useDispatch)("wc/store/checkout"),n=(0,a.useSelect)((e=>{const t=e("wc/store/cart");if(!t)return null;try{const e=t.getCartData();return e?.items?.find((e=>e.item_data.find((e=>"gifting_to_hidden"===e.name))))||null}catch(e){return null}}),[]);return(0,c.useEffect)((()=>{n&&(e(!1),t(!0))}),[n,e,t]),(0,d.jsx)(d.Fragment,{})};window.addEventListener("load",(function(){let e=null;function t(){const t=document.querySelectorAll(".wc-block-components-product-metadata");0!==t.length&&(t.length&&e&&e.disconnect(),t.forEach((function(e,t){const n=e?.querySelector(".wc-block-components-product-details__item-key .wc-block-components-product-details__value")?.textContent||"";if(!n)return;const i="gifting-recipient-"+t;if(!document.getElementById(i)){const t=document.createElement("div");t.className="wcsg-block-recipient-container",t.id=i,e.parentNode.insertBefore(t,e)}(0,o.H)(document.getElementById(i)).render((0,d.jsx)(m,{lineItem:e,itemKey:n}))})))}function n(){setTimeout((()=>{e=new MutationObserver(t),t(),e.observe(document.body,{childList:!0,subtree:!0})}),200)}null!==document.querySelector(".wp-block-woocommerce-checkout")?(0,i.registerPlugin)("woocommerce-checkout-gifting",{render:p,icon:"gift",title:"Checkout Gifting Features",scope:"woocommerce-checkout"}):(n(),document.addEventListener("click",(function(e){e.target.matches(".wc-block-mini-cart__button, .wc-block-mini-cart__button *")&&n()})))}))})(); \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index a810baa..aa5bc75 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,19 @@ *** WooCommerce Subscriptions Changelog *** +2025-11-13 - version 8.1.0 +* Fix: Prevent a fatal error that can occur when previewing emails in WooCommerce email settings. +* Fix: Prevent technical subscription-specific discount types from appearing in the coupon edit UI. +* Fix: Add admin notice and debug tool to recreate the payment retry database table when it's missing. +* Fix: Prevent resubscribe and reactivate buttons from showing for subscriptions containing disabled, deleted, draft, or limited products. +* Fix: Prevent error that blocks the subscriptions list from loading when gifted subscriptions are purchased with certain payment methods. +* Fix: Ensure gift recipient email address is displayed in the order confirmation email sent to the purchaser. +* Fix: Prevent pickup location options from displaying incorrectly alongside shipping methods on the Blocks Checkout page. +* Fix: Fix invalid HTML tags that cause fatal errors when using themes with WordPress Interactivity API. +* Fix: Add password reset links to the new account email template for gifted subscription recipients. +* Tweak: Improve the gift recipient email input field on Blocks Cart and Mini Cart to match the style of other checkout fields. +* Dev: Improve housekeeping of output buffers when handling requests to change subscription payment methods. +* Dev: Improve type safety in relation to the `wcs_get_subscription()` function. + 2025-10-15 - version 8.0.0 * Add: Blocks Checkout now displays a single shipping method selection for both initial and recurring carts, similar to Classic Checkout. This can be disabled using the `wcs_cart_totals_shipping_html_price_only` filter. * Fix: Resubscribing to a limited subscription from the product page will now reactivate the existing subscription. diff --git a/includes/api/v1/class-wc-rest-subscriptions-v1-controller.php b/includes/api/v1/class-wc-rest-subscriptions-v1-controller.php index d6dd7f6..7e979a0 100644 --- a/includes/api/v1/class-wc-rest-subscriptions-v1-controller.php +++ b/includes/api/v1/class-wc-rest-subscriptions-v1-controller.php @@ -83,6 +83,10 @@ class WC_REST_Subscriptions_V1_Controller extends WC_REST_Orders_V1_Controller { if ( ! empty( $post->post_type ) && ! empty( $post->ID ) && 'shop_subscription' == $post->post_type ) { $subscription = wcs_get_subscription( $post->ID ); + if ( ! $subscription ) { + return $response; + } + $response->data['billing_period'] = $subscription->get_billing_period(); $response->data['billing_interval'] = $subscription->get_billing_interval(); @@ -292,8 +296,13 @@ class WC_REST_Subscriptions_V1_Controller extends WC_REST_Orders_V1_Controller { return new WP_Error( 'woocommerce_rest_invalid_shop_subscription_id', __( 'Invalid subscription id.', 'woocommerce-subscriptions' ), array( 'status' => 404 ) ); } - $this->post_type = 'shop_order'; - $subscription = wcs_get_subscription( $id ); + $this->post_type = 'shop_order'; + $subscription = wcs_get_subscription( $id ); + + if ( ! $subscription ) { + return new WP_Error( 'woocommerce_rest_invalid_shop_subscription_id', __( 'Invalid subscription id.', 'woocommerce-subscriptions' ), array( 'status' => 404 ) ); + } + $subscription_orders = $subscription->get_related_orders(); $orders = array(); @@ -371,6 +380,10 @@ class WC_REST_Subscriptions_V1_Controller extends WC_REST_Orders_V1_Controller { // In particular, the update_post_meta() called while _stripe_card_id is updated to _stripe_source_id $subscription = wcs_get_subscription( $subscription->get_id() ); + if ( ! $subscription ) { + throw new WC_REST_Exception( 'woocommerce_rest_payment_update_failed', __( 'Subscription payment method could not be set updated due to technical issues.', 'woocommerce-subscriptions' ), 500 ); + } + if ( isset( $payment_method_meta[ $payment_method ] ) ) { $payment_method_meta = $payment_method_meta[ $payment_method ]; diff --git a/includes/api/v2/class-wc-rest-subscriptions-v2-controller.php b/includes/api/v2/class-wc-rest-subscriptions-v2-controller.php index 97baa40..91d3072 100644 --- a/includes/api/v2/class-wc-rest-subscriptions-v2-controller.php +++ b/includes/api/v2/class-wc-rest-subscriptions-v2-controller.php @@ -702,12 +702,16 @@ class WC_REST_Subscriptions_V2_Controller extends WC_REST_Orders_V2_Controller { $subscription->add_item( $item ); } - /* * Fetch a fresh instance of the subscription because the current instance has an empty line item cache generated before we had copied the line items. * Fetching a new instance will ensure the line items are used when calculating totals. */ $subscription = wcs_get_subscription( $subscription->get_id() ); + + if ( ! $subscription ) { + throw new Exception( __( 'There was a problem completing this request. The subscription may have been deleted by another process.', 'woocommerce-subscriptions' ) ); + } + $subscription->calculate_totals(); /** @@ -719,7 +723,13 @@ class WC_REST_Subscriptions_V2_Controller extends WC_REST_Orders_V2_Controller { */ do_action( "woocommerce_rest_insert_{$this->post_type}_object", $subscription, $request, true ); - $response = $this->prepare_object_for_response( wcs_get_subscription( $subscription->get_id() ), $request ); + $fresh_subscription = wcs_get_subscription( $subscription->get_id() ); + + if ( ! $fresh_subscription ) { + throw new Exception( __( 'There was a problem completing this request. The subscription may have been deleted by another process.', 'woocommerce-subscriptions' ) ); + } + + $response = $this->prepare_object_for_response( $fresh_subscription, $request ); $subscriptions[] = $this->prepare_response_for_collection( $response ); } } catch ( Exception $e ) { diff --git a/includes/class-wc-subscriptions-dependency-manager.php b/includes/class-wc-subscriptions-dependency-manager.php index 224e925..38d5a2f 100644 --- a/includes/class-wc-subscriptions-dependency-manager.php +++ b/includes/class-wc-subscriptions-dependency-manager.php @@ -117,6 +117,13 @@ class WC_Subscriptions_Dependency_Manager { $this->wc_version_cached = true; + // Try to get version from transient first + $this->wc_active_version = get_transient( 'wcs_woocommerce_active_version' ); + + if ( false !== $this->wc_active_version ) { + return $this->wc_active_version; + } + // Load plugin.php if it's not already loaded. if ( ! function_exists( 'is_plugin_active' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; @@ -139,9 +146,15 @@ class WC_Subscriptions_Dependency_Manager { if ( $is_woocommerce && is_plugin_active( $plugin_slug ) ) { $this->wc_active_version = $plugin_data['Version']; + break; // Found it, no need to continue looping } } + // Cache the result in a transient for 1 hour + if ( ! empty( $this->wc_active_version ) ) { + set_transient( 'wcs_woocommerce_active_version', $this->wc_active_version, HOUR_IN_SECONDS ); + } + return $this->wc_active_version; } diff --git a/includes/class-wc-subscriptions-plugin.php b/includes/class-wc-subscriptions-plugin.php index 570aa13..5416eb5 100644 --- a/includes/class-wc-subscriptions-plugin.php +++ b/includes/class-wc-subscriptions-plugin.php @@ -44,6 +44,7 @@ class WC_Subscriptions_Plugin extends WC_Subscriptions_Core_Plugin { add_action( 'admin_enqueue_scripts', array( $this, 'maybe_show_welcome_message' ) ); add_action( 'plugins_loaded', array( $this, 'init_gifting' ) ); + add_action( 'plugins_loaded', array( $this, 'init_downloads' ) ); } /** @@ -286,6 +287,28 @@ class WC_Subscriptions_Plugin extends WC_Subscriptions_Core_Plugin { WCS_Gifting::init(); } + /** + * Attempts to initialize additional downloads functionality. + * + * This functionality makes it possible to link downloadable products with a subscription + * product. Purchasers of the subscription product then automatically get access to the files associated with downloadable product. + * + * Previously, this functionality existed as a standalone plugin (WooCommerce Subscription Downnloads) and so, + * before initializing, we try to determine if the standalone plugin is active and has already loaded (if it is + * active, we do not proceed). + */ + public function init_downloads() { + if ( + ! defined( 'WCS_ALLOW_SUBSCRIPTION_DOWNLOADS' ) + || $this->is_plugin_being_activated( 'woocommerce-subscription-downloads' ) + || class_exists( WC_Subscription_Downloads::class, false ) + ) { + return; + } + + WC_Subscription_Downloads::setup(); + } + /** * Tries to determine if the specified plugin is being activated. * diff --git a/includes/class-wcs-call-to-action-button-text-manager.php b/includes/class-wcs-call-to-action-button-text-manager.php index b773fbc..81e1e2e 100644 --- a/includes/class-wcs-call-to-action-button-text-manager.php +++ b/includes/class-wcs-call-to-action-button-text-manager.php @@ -30,7 +30,7 @@ class WCS_Call_To_Action_Button_Text_Manager { public static function add_settings( $settings ) { $button_text_settings = array( array( - 'name' => __( 'Button Text', 'woocommerce-subscriptions' ), + 'name' => __( 'Button text', 'woocommerce-subscriptions' ), 'type' => 'title', 'desc' => '', 'id' => WC_Subscriptions_Admin::$option_prefix . '_button_text', diff --git a/includes/class-wcs-limited-recurring-coupon-manager.php b/includes/class-wcs-limited-recurring-coupon-manager.php index 49eb180..51ffd78 100644 --- a/includes/class-wcs-limited-recurring-coupon-manager.php +++ b/includes/class-wcs-limited-recurring-coupon-manager.php @@ -357,7 +357,12 @@ class WCS_Limited_Recurring_Coupon_Manager { $has_limited_coupon = false; if ( $change_payment && isset( $_GET['_wpnonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ) ) ) { - $subscription = wcs_get_subscription( $change_payment ); + $subscription = wcs_get_subscription( $change_payment ); + + if ( ! $subscription ) { + return $gateways; + } + $has_limited_coupon = self::order_has_limited_recurring_coupon( $subscription ); } diff --git a/includes/class-wcs-subscriber-role-manager.php b/includes/class-wcs-subscriber-role-manager.php index 2022dba..de90a39 100644 --- a/includes/class-wcs-subscriber-role-manager.php +++ b/includes/class-wcs-subscriber-role-manager.php @@ -74,7 +74,10 @@ class WCS_Subscriber_Role_Manager { ), ); - WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_button_text', $role_settings, 'multiple_settings', 'sectionend' ); + if ( ! WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_button_text', $role_settings, 'multiple_settings', 'sectionend' ) ) { + $settings = array_merge( $settings, $role_settings ); + } + return $settings; } diff --git a/includes/core/abstracts/abstract-wcs-table-maker.php b/includes/core/abstracts/abstract-wcs-table-maker.php index 89df5fa..190f26f 100644 --- a/includes/core/abstracts/abstract-wcs-table-maker.php +++ b/includes/core/abstracts/abstract-wcs-table-maker.php @@ -48,6 +48,18 @@ abstract class WCS_Table_Maker { } } + /** + * Deletes the schema option and recreates the tables. + * + * This forces the table schema to be regenerated by removing the stored + * schema version and triggering the table registration process. + */ + public function recreate_tables() { + delete_option( $this->get_schema_option_name() ); + + $this->register_tables(); + } + /** * @param string $table The name of the table * diff --git a/includes/core/admin/class-wcs-admin-post-types.php b/includes/core/admin/class-wcs-admin-post-types.php index 992812a..6e97f72 100644 --- a/includes/core/admin/class-wcs-admin-post-types.php +++ b/includes/core/admin/class-wcs-admin-post-types.php @@ -519,7 +519,7 @@ class WCS_Admin_Post_Types { 'wcs-unknown-order-info-wrapper', esc_url( 'https://woocommerce.com/document/subscriptions/store-manager-guide/#section-19' ), // translators: Placeholder is a
HTML tag. - wcs_help_tip( sprintf( __( "This subscription couldn't be loaded from the database. %s Click to learn more.", 'woocommerce-subscriptions' ), '
' ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wcs_help_tip( sprintf( __( "This subscription couldn't be loaded from the database. %s Click to learn more.", 'woocommerce-subscriptions' ), '
' ) ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ); return; } @@ -711,12 +711,12 @@ class WCS_Admin_Post_Types { $tooltip_classes = 'woocommerce-help-tip'; if ( $datetime->getTimestamp() < time() ) { - $tooltip_message .= __( 'Subscription payment overdue.
', 'woocommerce-subscriptions' ); + $tooltip_message .= '' . esc_html__( 'Subscription payment overdue.', 'woocommerce-subscriptions' ) . '
'; $tooltip_classes .= ' wcs-payment-overdue'; } if ( $subscription->payment_method_supports( 'gateway_scheduled_payments' ) && ! $subscription->is_manual() ) { - $tooltip_message .= __( 'This date should be treated as an estimate only. The payment gateway for this subscription controls when payments are processed.
', 'woocommerce-subscriptions' ); + $tooltip_message .= esc_html__( 'This date should be treated as an estimate only. The payment gateway for this subscription controls when payments are processed.', 'woocommerce-subscriptions' ) . '
'; $tooltip_classes .= ' wcs-offsite-renewal'; } @@ -1503,9 +1503,20 @@ class WCS_Admin_Post_Types { foreach ( $subscription_ids as $subscription_id ) { $subscription = wcs_get_subscription( $subscription_id ); - $note = _x( 'Subscription status changed by bulk edit:', 'Used in order note. Reason why status changed.', 'woocommerce-subscriptions' ); + + $note = _x( 'Subscription status changed by bulk edit:', 'Used in order note. Reason why status changed.', 'woocommerce-subscriptions' ); try { + if ( ! $subscription ) { + throw new Exception( + sprintf( + // Translators: 1: subscription ID. + __( 'Subscription with ID %1$d does not exist and could not be updated.', 'woocommerce-subscriptions' ), + $subscription_id + ) + ); + } + if ( 'cancelled' === $new_status ) { $subscription->cancel_order( $note ); } else { @@ -1542,6 +1553,11 @@ class WCS_Admin_Post_Types { foreach ( $subscription_ids as $id ) { $subscription = wcs_get_subscription( $id ); + + if ( ! $subscription ) { + continue; + } + $subscription->delete( $force_delete ); $updated_subscription = wcs_get_subscription( $id ); @@ -1571,7 +1587,13 @@ class WCS_Admin_Post_Types { foreach ( $subscription_ids as $id ) { if ( $use_crud_method ) { - $data_store->untrash_order( wcs_get_subscription( $id ) ); + $subscription = wcs_get_subscription( $id ); + + if ( ! $subscription ) { + continue; + } + + $data_store->untrash_order( $subscription ); } else { wp_untrash_post( $id ); } diff --git a/includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php b/includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php index bc9b88e..f40006c 100644 --- a/includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php +++ b/includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php @@ -24,7 +24,7 @@ if ( ! defined( 'ABSPATH' ) ) { sprintf( // Translators: The %1 placeholder is the translated order relationship ("Parent Order"), %2 placeholder is a
HTML tag. __( 'This %1$s couldn\'t be loaded from the database. %1$s Click to learn more.', 'woocommerce-subscriptions' ), esc_html( $relationship ), - '
' + '
' ) ); ?> diff --git a/includes/core/class-wc-product-subscription-variation.php b/includes/core/class-wc-product-subscription-variation.php index 063a76d..3af7775 100644 --- a/includes/core/class-wc-product-subscription-variation.php +++ b/includes/core/class-wc-product-subscription-variation.php @@ -17,24 +17,6 @@ if ( ! defined( 'ABSPATH' ) ) { class WC_Product_Subscription_Variation extends WC_Product_Variation { - /** - * A way to access the old array property. - */ - protected $subscription_variation_level_meta_data; - - /** - * Create a simple subscription product object. - * - * @access public - * @param mixed $product - */ - public function __construct( $product = 0 ) { - - parent::__construct( $product ); - - $this->subscription_variation_level_meta_data = new WCS_Array_Property_Post_Meta_Black_Magic( $this->get_id() ); - } - /** * Magic __get method for backwards compatibility. Map legacy vars to WC_Subscriptions_Product getters. * @@ -43,19 +25,11 @@ class WC_Product_Subscription_Variation extends WC_Product_Variation { */ public function __get( $key ) { - if ( 'subscription_variation_level_meta_data' === $key ) { + $value = wcs_product_deprecated_property_handler( $key, $this ); - wcs_deprecated_argument( __CLASS__ . '::$' . $key, '2.2.0', 'Product properties should not be accessed directly with WooCommerce 3.0+. Use the getter in WC_Subscriptions_Product instead.' ); - - $value = $this->subscription_variation_level_meta_data; // Behold, the horror that is the magic of WCS_Array_Property_Post_Meta_Black_Magic - } else { - - $value = wcs_product_deprecated_property_handler( $key, $this ); - - // No matching property found in wcs_product_deprecated_property_handler() - if ( is_null( $value ) ) { - $value = parent::__get( $key ); - } + // No matching property found in wcs_product_deprecated_property_handler() + if ( is_null( $value ) ) { + $value = parent::__get( $key ); } return $value; @@ -89,7 +63,6 @@ class WC_Product_Subscription_Variation extends WC_Product_Variation { /** * Get the add to cart button text * - * @access public * @return string */ public function add_to_cart_text() { @@ -106,7 +79,6 @@ class WC_Product_Subscription_Variation extends WC_Product_Variation { /** * Get the add to cart button text for the single page * - * @access public * @return string */ public function single_add_to_cart_text() { @@ -116,7 +88,6 @@ class WC_Product_Subscription_Variation extends WC_Product_Variation { /** * Checks if the variable product this variation belongs to is purchasable. * - * @access public * @return bool */ public function is_purchasable() { @@ -128,12 +99,11 @@ class WC_Product_Subscription_Variation extends WC_Product_Variation { * Checks the product type to see if it is either this product's type or the parent's * product type. * - * @access public * @param mixed $type Array or string of types * @return bool */ public function is_type( $type ) { - if ( 'variation' == $type || ( is_array( $type ) && in_array( 'variation', $type ) ) ) { + if ( 'variation' === $type || ( is_array( $type ) && in_array( 'variation', $type, true ) ) ) { return true; } else { return parent::is_type( $type ); diff --git a/includes/core/class-wc-subscription.php b/includes/core/class-wc-subscription.php index 7695e0b..b02f18e 100644 --- a/includes/core/class-wc-subscription.php +++ b/includes/core/class-wc-subscription.php @@ -44,6 +44,14 @@ class WC_Subscription extends WC_Order { */ private $editable; + /** + * Stores if the subscription is in the payment completed flow. + * Allowing subscriptions to be renewed even if they have limited products. + * + * @var bool + */ + private $is_payment_completed_flow = false; + /** * Extra data for this object. Name value pairs (name + default value). Used to add additional information to parent. * @@ -340,7 +348,9 @@ class WC_Subscription extends WC_Order { break; case 'completed': // core WC order status mapped internally to avoid exceptions case 'active': - if ( $this->payment_method_supports( 'subscription_reactivation' ) && $this->has_status( 'on-hold' ) ) { + if ( ! $this->is_payment_completed_flow && $this->contains_unavailable_product() ) { + $can_be_updated = false; + } elseif ( $this->payment_method_supports( 'subscription_reactivation' ) && $this->has_status( 'on-hold' ) ) { // If the subscription's end date is in the past, it cannot be reactivated. $end_time = $this->get_time( 'end' ); if ( 0 !== $end_time && $end_time < gmdate( 'U' ) ) { @@ -415,6 +425,23 @@ class WC_Subscription extends WC_Order { return apply_filters( 'woocommerce_can_subscription_be_updated_to_' . $new_status, $can_be_updated, $this ); } + /** + * Checks if the subscription contains an unavailable product. + * + * @return bool + */ + public function contains_unavailable_product() { + /** @var WC_Order_Item_Product $line_item */ + foreach ( $this->get_items() as $line_item ) { + $product = $line_item->get_product(); + if ( ! $product instanceof WC_Product || ! $product->is_purchasable() ) { + return true; + } + } + + return false; + } + /** * Updates status of the subscription * @@ -1996,6 +2023,7 @@ class WC_Subscription extends WC_Order { * @param WC_Order $last_order */ public function payment_complete_for_order( $last_order ) { + $this->is_payment_completed_flow = true; // Clear the cached renewal payment counts if ( isset( $this->cached_payment_count['completed'] ) ) { diff --git a/includes/core/class-wc-subscriptions-cart.php b/includes/core/class-wc-subscriptions-cart.php index 3ae4800..ca50397 100644 --- a/includes/core/class-wc-subscriptions-cart.php +++ b/includes/core/class-wc-subscriptions-cart.php @@ -1517,7 +1517,7 @@ class WC_Subscriptions_Cart { */ public static function pre_get_refreshed_fragments() { wcs_deprecated_function( __METHOD__, '2.5.0' ); - if ( defined( 'DOING_AJAX' ) && true === DOING_AJAX && ! defined( 'WOOCOMMERCE_CART' ) ) { + if ( wp_doing_ajax() && ! defined( 'WOOCOMMERCE_CART' ) ) { define( 'WOOCOMMERCE_CART', true ); WC()->cart->calculate_totals(); } diff --git a/includes/core/class-wc-subscriptions-change-payment-gateway.php b/includes/core/class-wc-subscriptions-change-payment-gateway.php index d491040..f560c2e 100644 --- a/includes/core/class-wc-subscriptions-change-payment-gateway.php +++ b/includes/core/class-wc-subscriptions-change-payment-gateway.php @@ -139,6 +139,11 @@ class WC_Subscriptions_Change_Payment_Gateway { $subscription = wcs_get_subscription( absint( $wp->query_vars['order-pay'] ) ); $subscription_key = isset( $_GET['key'] ) ? wc_clean( $_GET['key'] ) : ''; + if ( ! $subscription ) { + wc_print_notice( __( 'There was an unexpected problem with your request. Please try again.', 'woocommerce-subscriptions' ), 'error' ); + return; + } + do_action( 'before_woocommerce_pay' ); /** @@ -276,19 +281,27 @@ class WC_Subscriptions_Change_Payment_Gateway { * @since 1.0.0 - Migrated from WooCommerce Subscriptions v1.4 */ public static function change_payment_method_via_pay_shortcode() { - if ( ! isset( $_POST['_wcsnonce'] ) || ! wp_verify_nonce( wc_clean( wp_unslash( $_POST['_wcsnonce'] ) ), 'wcs_change_payment_method' ) ) { return; } $subscription_id = absint( wc_clean( wp_unslash( $_POST['woocommerce_change_payment'] ) ) ); - $subscription = wcs_get_subscription( $subscription_id ); + $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + wc_add_notice( __( 'There was an unexpected problem with your request. Please try again.', 'woocommerce-subscriptions' ), 'error' ); + return; + } do_action( 'woocommerce_subscription_change_payment_method_via_pay_shortcode', $subscription ); - ob_start(); + if ( ! $subscription instanceof WC_Subscription || $subscription->get_order_key() !== wc_clean( wp_unslash( $_GET['key'] ?? '' ) ) ) { + return; + } - if ( $subscription->get_order_key() == wc_clean( wp_unslash( $_GET['key'] ) ) ) { + try { + // We open an output buffer to suppress any error noise that might break the redirect. + $output_buffer_opened = ob_start(); $subscription_billing_country = $subscription->get_billing_country(); $subscription_billing_state = $subscription->get_billing_state(); @@ -359,6 +372,11 @@ class WC_Subscriptions_Change_Payment_Gateway { */ $subscription = wcs_get_subscription( $subscription->get_id() ); + if ( ! $subscription ) { + wc_add_notice( __( 'There was an unexpected problem with your request. Please try again.', 'woocommerce-subscriptions' ), 'error' ); + return; + } + $subscription->set_requires_manual_renewal( false ); $subscription->save(); @@ -383,9 +401,13 @@ class WC_Subscriptions_Change_Payment_Gateway { wp_safe_redirect( $result['redirect'] ); exit; } + } finally { + // Close the output buffer (if we exited, this will have happened automatically, so this is primarily here + // to ensure we clean-up in the event that we returned early). + if ( $output_buffer_opened ) { + ob_clean(); + } } - - ob_get_clean(); } /** @@ -595,7 +617,12 @@ class WC_Subscriptions_Change_Payment_Gateway { */ if ( ! $is_change_payment_method_request && $cart_contains_failed_renewal ) { $subscription = wcs_get_subscription( $renewal_order_cart_item['subscription_renewal']['subscription_id'] ); - $cart_contains_failed_manual_renewal = $subscription->is_manual(); + + // If the subscription has been deleted (which is a reason $subscription may be false), we probably do not + // need to concern ourselves with a failed manual renewal. + if ( $subscription ) { + $cart_contains_failed_manual_renewal = $subscription->is_manual(); + } } if ( apply_filters( 'wcs_payment_gateways_change_payment_method', $is_change_payment_method_request || ( $cart_contains_failed_renewal && ! $cart_contains_failed_manual_renewal ) ) ) { @@ -728,6 +755,7 @@ class WC_Subscriptions_Change_Payment_Gateway { } $subscription = wcs_get_subscription( absint( $wp->query_vars['order-pay'] ) ); + if ( ! $subscription ) { return $title; } @@ -823,19 +851,19 @@ class WC_Subscriptions_Change_Payment_Gateway { $subscription = wcs_get_subscription( absint( $wp->query_vars['order-pay'] ) ); - if ( $subscription ) { - wc_add_notice( __( 'Please log in to your account below to choose a new payment method for your subscription.', 'woocommerce-subscriptions' ), 'notice' ); - - ob_start(); - woocommerce_login_form( array( - 'redirect' => $subscription->get_change_payment_method_url(), - 'message' => wc_print_notices( true ), - ) ); - - $content = ob_get_clean(); + if ( ! $subscription ) { + return $content; } - return $content; + wc_add_notice( __( 'Please log in to your account below to choose a new payment method for your subscription.', 'woocommerce-subscriptions' ), 'notice' ); + + ob_start(); + woocommerce_login_form( array( + 'redirect' => $subscription->get_change_payment_method_url(), + 'message' => wc_print_notices( true ), + ) ); + + return ob_get_clean(); } /** Deprecated Functions **/ diff --git a/includes/core/class-wc-subscriptions-core-plugin.php b/includes/core/class-wc-subscriptions-core-plugin.php index 04015f9..8ed7bdf 100644 --- a/includes/core/class-wc-subscriptions-core-plugin.php +++ b/includes/core/class-wc-subscriptions-core-plugin.php @@ -542,6 +542,9 @@ class WC_Subscriptions_Core_Plugin { update_option( WC_Subscriptions_Admin::$option_prefix . WC_Subscriptions_Email_Notifications::$switch_setting_string, 'yes' ); } + // Setup downloads table. + WC_Subscription_Downloads::install(); + update_option( WC_Subscriptions_Admin::$option_prefix . '_is_active', true ); set_transient( $this->get_activation_transient(), true, 60 * 60 ); diff --git a/includes/core/class-wc-subscriptions-coupon.php b/includes/core/class-wc-subscriptions-coupon.php index f34f048..d61df63 100644 --- a/includes/core/class-wc-subscriptions-coupon.php +++ b/includes/core/class-wc-subscriptions-coupon.php @@ -756,7 +756,18 @@ class WC_Subscriptions_Coupon { * @return bool Whether the current page is the coupon edit page. */ public static function is_coupon_edit_page() { - $current_post_type = $_GET['post_type'] ?? ''; // phpcs:ignore + global $pagenow; + + $current_post_type = ''; + + // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + if ( 'post.php' === $pagenow && isset( $_GET['post'] ) ) { + $current_post_type = get_post_type( $_GET['post'] ); + } elseif ( isset( $_GET['post_type'] ) ) { + $current_post_type = $_GET['post_type']; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash + return 'shop_coupon' === $current_post_type; } diff --git a/includes/core/class-wc-subscriptions-email-notifications.php b/includes/core/class-wc-subscriptions-email-notifications.php index 8a375ca..47bc332 100644 --- a/includes/core/class-wc-subscriptions-email-notifications.php +++ b/includes/core/class-wc-subscriptions-email-notifications.php @@ -156,6 +156,11 @@ class WC_Subscriptions_Email_Notifications { switch ( current_action() ) { case 'woocommerce_scheduled_subscription_customer_notification_renewal': $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + break; + } + if ( $subscription->get_total() <= 0 ) { break; } @@ -167,6 +172,11 @@ class WC_Subscriptions_Email_Notifications { break; case 'woocommerce_scheduled_subscription_customer_notification_trial_expiration': $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + break; + } + if ( $subscription->is_manual() ) { $notification = $emails['WCS_Email_Customer_Notification_Manual_Trial_Expiration']; } else { @@ -268,7 +278,7 @@ class WC_Subscriptions_Email_Notifications { $notification_settings = [ [ - 'name' => __( 'Customer Notifications', 'woocommerce-subscriptions' ), + 'name' => __( 'Customer notifications', 'woocommerce-subscriptions' ), 'type' => 'title', 'id' => WC_Subscriptions_Admin::$option_prefix . '_customer_notifications', /* translators: Link to WC Settings > Email. */ @@ -304,7 +314,9 @@ class WC_Subscriptions_Email_Notifications { ], ]; - WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_miscellaneous', $notification_settings, 'multiple_settings', 'sectionend' ); + if ( ! WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_miscellaneous', $notification_settings, 'multiple_settings', 'sectionend' ) ) { + $settings = array_merge( $settings, $notification_settings ); + } return $settings; } } diff --git a/includes/core/class-wc-subscriptions-extend-store-endpoint.php b/includes/core/class-wc-subscriptions-extend-store-endpoint.php index 78b25f5..ff9a89d 100644 --- a/includes/core/class-wc-subscriptions-extend-store-endpoint.php +++ b/includes/core/class-wc-subscriptions-extend-store-endpoint.php @@ -275,9 +275,10 @@ class WC_Subscriptions_Extend_Store_Endpoint { // Add extra package data to array. if ( count( $packages ) ) { $packages = array_map( - function( $key, $package, $index ) use ( $cart ) { + function ( $key, $package, $index ) use ( $cart ) { $package['package_id'] = isset( $package['package_id'] ) ? $package['package_id'] : $key; $package['package_name'] = isset( $package['package_name'] ) ? $package['package_name'] : self::get_shipping_package_name( $package, $cart ); + $package['rates'] = apply_filters( 'woocommerce_package_rates', $package['rates'], $package ); return $package; }, array_keys( $packages ), diff --git a/includes/core/class-wc-subscriptions-manager.php b/includes/core/class-wc-subscriptions-manager.php index 317b19a..3590eed 100644 --- a/includes/core/class-wc-subscriptions-manager.php +++ b/includes/core/class-wc-subscriptions-manager.php @@ -130,11 +130,10 @@ class WC_Subscriptions_Manager { * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.12 */ public static function process_renewal( $subscription_id, $required_status, $order_note ) { - $subscription = wcs_get_subscription( $subscription_id ); // If the subscription is using manual payments, the gateway isn't active or it manages scheduled payments - if ( ! empty( $subscription ) && $subscription->has_status( $required_status ) && ( 0 == $subscription->get_total() || $subscription->is_manual() || '' == $subscription->get_payment_method() || ! $subscription->payment_method_supports( 'gateway_scheduled_payments' ) ) ) { + if ( $subscription instanceof WC_Subscription && $subscription->has_status( $required_status ) && ( 0 === absint( $subscription->get_total() ) || $subscription->is_manual() || '' === $subscription->get_payment_method() || ! $subscription->payment_method_supports( 'gateway_scheduled_payments' ) ) ) { // Always put the subscription on hold in case something goes wrong while trying to process renewal $subscription->update_status( 'on-hold', $order_note ); @@ -2075,6 +2074,11 @@ class WC_Subscriptions_Manager { */ public static function maybe_process_failed_renewal_for_repair( $subscription_id ) { $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + return; + } + if ( 'true' === $subscription->get_meta( '_wcs_repaired_2_0_2_needs_failed_payment', true ) ) { // Always put the subscription on hold in case something goes wrong while trying to process renewal $subscription->update_status( 'on-hold', _x( 'Subscription renewal payment due:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions' ) ); diff --git a/includes/core/class-wc-subscriptions-product.php b/includes/core/class-wc-subscriptions-product.php index f45682a..9cd7a99 100644 --- a/includes/core/class-wc-subscriptions-product.php +++ b/includes/core/class-wc-subscriptions-product.php @@ -1281,18 +1281,6 @@ class WC_Subscriptions_Product { return $button_text; } - /** - * If a product is being marked as not purchasable because it is limited and the customer has a subscription, - * but the current request is to resubscribe to the subscription, then mark it as purchasable. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 - * @return bool - */ - public static function is_purchasable( $is_purchasable, $product ) { - _deprecated_function( __METHOD__, '2.1', 'WCS_Limiter::is_purchasable_product' ); - return WCS_Limiter::is_purchasable_product( $is_purchasable, $product ); - } - /** * Check if the current session has an order awaiting payment for a subscription to a specific product line item. * diff --git a/includes/core/class-wc-subscriptions-synchroniser.php b/includes/core/class-wc-subscriptions-synchroniser.php index 77221cf..ca51c8d 100644 --- a/includes/core/class-wc-subscriptions-synchroniser.php +++ b/includes/core/class-wc-subscriptions-synchroniser.php @@ -197,7 +197,7 @@ class WC_Subscriptions_Synchroniser { public static function add_settings( $settings ) { $synchronisation_settings = array( array( - 'name' => __( 'Synchronisation', 'woocommerce-subscriptions' ), + 'name' => __( 'Synchronization', 'woocommerce-subscriptions' ), 'type' => 'title', // translators: placeholders are opening and closing link tags 'desc' => sprintf( _x( 'Align subscription renewal to a specific day of the week, month or year. For example, the first day of the month. %1$sLearn more%2$s.', 'used in the general subscription options page', 'woocommerce-subscriptions' ), '', '' ), diff --git a/includes/core/class-wcs-cached-data-manager.php b/includes/core/class-wcs-cached-data-manager.php index 134794d..f4ef8a6 100644 --- a/includes/core/class-wcs-cached-data-manager.php +++ b/includes/core/class-wcs-cached-data-manager.php @@ -237,7 +237,12 @@ class WCS_Cached_Data_Manager extends WCS_Cache_Manager { protected function purge_subscription_user_cache( $subscription_id ) { wcs_deprecated_argument( __METHOD__, '2.3.0', sprintf( __( 'Customer subscription caching is now handled by %1$s and %2$s.', 'woocommerce-subscriptions' ), 'WCS_Customer_Store_Cached_CPT', 'WCS_Post_Meta_Cache_Manager' ) ); // phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - $subscription = wcs_get_subscription( $subscription_id ); + $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + return; + } + $subscription_user_id = $subscription->get_user_id(); $this->log( sprintf( 'Clearing cache for user ID %1$s on %2$s hook.', diff --git a/includes/core/class-wcs-cart-renewal.php b/includes/core/class-wcs-cart-renewal.php index d67ec01..0ab539d 100644 --- a/includes/core/class-wcs-cart-renewal.php +++ b/includes/core/class-wcs-cart-renewal.php @@ -604,6 +604,10 @@ class WCS_Cart_Renewal { $subscription = wcs_get_subscription( $cart_renewal_item[ $this->cart_item_key ]['subscription_id'] ); + if ( ! $subscription ) { + return $update_customer_data; + } + $billing_address = array(); if ( $checkout_object->checkout_fields['billing'] ) { foreach ( array_keys( $checkout_object->checkout_fields['billing'] ) as $field ) { @@ -627,19 +631,6 @@ class WCS_Cart_Renewal { return $update_customer_data; } - /** - * If a product is being marked as not purchasable because it is limited and the customer has a subscription, - * but the current request is to resubscribe to the subscription, then mark it as purchasable. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 - * @return bool - */ - public function is_purchasable( $is_purchasable, $product ) { - _deprecated_function( __METHOD__, '2.1', 'WCS_Limiter::is_purchasable_renewal' ); - return WCS_Limiter::is_purchasable_renewal( $is_purchasable, $product ); - - } - /** * Flag payment of manual renewal orders via an extra URL param. * @@ -1195,7 +1186,12 @@ class WCS_Cart_Renewal { $cart_renewal_item = $this->cart_contains(); if ( false !== $cart_renewal_item ) { - $subscription = wcs_get_subscription( $cart_renewal_item[ $this->cart_item_key ]['subscription_id'] ); + $subscription = wcs_get_subscription( $cart_renewal_item[ $this->cart_item_key ]['subscription_id'] ); + + if ( ! $subscription ) { + return; + } + $subscription_updated = false; foreach ( [ 'billing', 'shipping' ] as $address_type ) { @@ -1231,6 +1227,10 @@ class WCS_Cart_Renewal { if ( false !== $cart_renewal_item ) { $subscription = wcs_get_subscription( $cart_renewal_item[ $this->cart_item_key ]['subscription_id'] ); + if ( ! $subscription ) { + return; + } + // Billing address is a required field. foreach ( $request['billing_address'] as $key => $value ) { if ( is_callable( [ $customer, "set_billing_$key" ] ) ) { diff --git a/includes/core/class-wcs-cart-resubscribe.php b/includes/core/class-wcs-cart-resubscribe.php index 0faed9a..74af343 100644 --- a/includes/core/class-wcs-cart-resubscribe.php +++ b/includes/core/class-wcs-cart-resubscribe.php @@ -186,19 +186,6 @@ class WCS_Cart_Resubscribe extends WCS_Cart_Renewal { return $cart_item_session_data; } - /** - * If a product is being marked as not purchasable because it is limited and the customer has a subscription, - * but the current request is to resubscribe to the subscription, then mark it as purchasable. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 - * @return bool - */ - public function is_purchasable( $is_purchasable, $product ) { - _deprecated_function( __METHOD__, '2.1', 'WCS_Limiter::is_purchasable_renewal' ); - return WCS_Limiter::is_purchasable_renewal( $is_purchasable, $product ); - - } - /** * Checks the cart to see if it contains a subscription resubscribe item. * diff --git a/includes/core/class-wcs-limiter.php b/includes/core/class-wcs-limiter.php index b2e45e7..b3f2590 100644 --- a/includes/core/class-wcs-limiter.php +++ b/includes/core/class-wcs-limiter.php @@ -23,8 +23,6 @@ class WCS_Limiter { if ( wcs_is_frontend_request() || wcs_is_checkout_blocks_api_request() ) { add_filter( 'woocommerce_subscription_is_purchasable', __CLASS__ . '::is_purchasable_switch', 12, 2 ); add_filter( 'woocommerce_subscription_variation_is_purchasable', __CLASS__ . '::is_purchasable_switch', 12, 2 ); - add_filter( 'woocommerce_subscription_is_purchasable', __CLASS__ . '::is_purchasable_renewal', 12, 2 ); - add_filter( 'woocommerce_subscription_variation_is_purchasable', __CLASS__ . '::is_purchasable_renewal', 12, 2 ); add_filter( 'woocommerce_valid_order_statuses_for_order_again', array( __CLASS__, 'filter_order_again_statuses_for_limited_subscriptions' ) ); } } @@ -69,11 +67,52 @@ class WCS_Limiter { * @return bool */ public static function is_purchasable( $purchasable, $product ) { + + // Prevents making a non purchasable product purchasable again. + // This can happen if the product is disabled and limited and the customer is trying to renew the subscription for example. + if ( ! $purchasable ) { + return $purchasable; + } + switch ( $product->get_type() ) { case 'subscription': case 'variable-subscription': - if ( true === $purchasable && false === self::is_purchasable_product( $purchasable, $product ) ) { + // Checks if the product is limited. + if ( false === self::is_product_limited( $purchasable, $product ) ) { + // Product is limited, so it is not purchasable. $purchasable = false; + + // Unless it's resubscribing, renewing or restoring cart from session. + $resubscribe_cart_item = wcs_cart_contains_resubscribe(); + + // Resubscribe logic + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + if ( ! empty( $_GET['resubscribe'] ) || false !== $resubscribe_cart_item ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $subscription_id = ( isset( $_GET['resubscribe'] ) ) ? absint( $_GET['resubscribe'] ) : $resubscribe_cart_item['subscription_resubscribe']['subscription_id']; + $subscription = wcs_get_subscription( $subscription_id ); + + if ( $subscription && $subscription->has_product( $product->get_id() ) && wcs_can_user_resubscribe_to( $subscription ) ) { + $purchasable = true; + } + + // Renewal logic + } elseif ( + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + isset( $_GET['subscription_renewal'] ) || + wcs_cart_contains_renewal() + ) { + $purchasable = true; + + // Restoring cart from session, so need to check the cart in the session (wcs_cart_contains_renewal() only checks the cart). + } elseif ( ! empty( WC()->session->cart ) ) { + foreach ( WC()->session->cart as $cart_item_key => $cart_item ) { + if ( (int) $product->get_id() === (int) $cart_item['product_id'] && ( isset( $cart_item['subscription_renewal'] ) || isset( $cart_item['subscription_resubscribe'] ) ) ) { + $purchasable = true; + break; + } + } + } } break; case 'subscription_variation': @@ -99,7 +138,6 @@ class WCS_Limiter { return $purchasable; } - /** * If a product is limited and the customer already has a subscription, mark it as not purchasable. * @@ -107,6 +145,17 @@ class WCS_Limiter { * @return bool */ public static function is_purchasable_product( $is_purchasable, $product ) { + _deprecated_function( __METHOD__, '8.0.0', 'WCS_Limiter::is_product_limited' ); + return self::is_product_limited( $is_purchasable, $product ); + } + + /** + * If a product is limited and the customer already has a subscription, mark it as not purchasable. + * + * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.1, Moved from WC_Subscriptions_Product + * @return bool + */ + public static function is_product_limited( $is_purchasable, $product ) { // Set up cache if ( ! isset( self::$is_purchasable_cache[ $product->get_id() ] ) ) { @@ -197,33 +246,9 @@ class WCS_Limiter { * @return bool */ public static function is_purchasable_renewal( $is_purchasable, $product ) { - if ( false === $is_purchasable && false === self::is_purchasable_product( $is_purchasable, $product ) ) { - $resubscribe_cart_item = wcs_cart_contains_resubscribe(); + _deprecated_function( __METHOD__, '8.0.0', 'WCS_Limiter::is_product_limited' ); - // Resubscribe logic - if ( isset( $_GET['resubscribe'] ) || false !== $resubscribe_cart_item ) { - $subscription_id = ( isset( $_GET['resubscribe'] ) ) ? absint( $_GET['resubscribe'] ) : $resubscribe_cart_item['subscription_resubscribe']['subscription_id']; - $subscription = wcs_get_subscription( $subscription_id ); - - if ( false != $subscription && $subscription->has_product( $product->get_id() ) && wcs_can_user_resubscribe_to( $subscription ) ) { - $is_purchasable = true; - } - - // Renewal logic - } elseif ( isset( $_GET['subscription_renewal'] ) || wcs_cart_contains_renewal() ) { - $is_purchasable = true; - - // Restoring cart from session, so need to check the cart in the session (wcs_cart_contains_renewal() only checks the cart) - } elseif ( ! empty( WC()->session->cart ) ) { - foreach ( WC()->session->cart as $cart_item_key => $cart_item ) { - if ( $product->get_id() == $cart_item['product_id'] && ( isset( $cart_item['subscription_renewal'] ) || isset( $cart_item['subscription_resubscribe'] ) ) ) { - $is_purchasable = true; - break; - } - } - } - } - return $is_purchasable; + return ! self::is_product_limited( $is_purchasable, $product ); } /** diff --git a/includes/core/class-wcs-my-account-payment-methods.php b/includes/core/class-wcs-my-account-payment-methods.php index a00f20f..6dabe03 100644 --- a/includes/core/class-wcs-my-account-payment-methods.php +++ b/includes/core/class-wcs-my-account-payment-methods.php @@ -187,14 +187,20 @@ class WCS_My_Account_Payment_Methods { return; } - // translators: 1: token display name, 2: opening link tag, 4: closing link tag, 3: opening link tag. - $notice = sprintf( esc_html__( 'Would you like to update your subscriptions to use this new payment method - %1$s?%2$sYes%4$s | %3$sNo%4$s', 'woocommerce-subscriptions' ), + $notice = sprintf( + // translators: 1: token display name, 2: opening link tag, 4: closing link tag, 3: opening link tag. + esc_html__( 'Would you like to update your subscriptions to use this new payment method - %1$s?%2$sYes%4$s | %3$sNo%4$s', 'woocommerce-subscriptions' ), $default_token->get_display_name(), - '
', + '
', '', '' ); diff --git a/includes/core/class-wcs-staging.php b/includes/core/class-wcs-staging.php index a6fe82d..c765edd 100644 --- a/includes/core/class-wcs-staging.php +++ b/includes/core/class-wcs-staging.php @@ -280,7 +280,7 @@ class WCS_Staging { if ( 'subscriptions_install' === $source ) { $site_url = self::get_live_site_url(); } elseif ( ! is_multisite() && defined( 'WP_SITEURL' ) ) { - $site_url = WP_SITEURL; + $site_url = WP_SITEURL; // @phpstan-ignore phpstanWP.wpConstant.fetch (Using constant for performance and staging-specific behavior) } else { $site_url = get_site_url(); } diff --git a/includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php b/includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php index c48deee..0b8f169 100644 --- a/includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php +++ b/includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php @@ -266,14 +266,14 @@ class WC_Subscriptions_Core_Payment_Gateways { } $status_html .= ''; diff --git a/includes/core/legacy/class-wc-product-subscription-legacy.php b/includes/core/legacy/class-wc-product-subscription-legacy.php deleted file mode 100644 index 8c8a3c5..0000000 --- a/includes/core/legacy/class-wc-product-subscription-legacy.php +++ /dev/null @@ -1,79 +0,0 @@ -product_type = 'subscription'; - - // Load all meta fields - $this->product_custom_fields = get_post_meta( $this->id ); - - // Convert selected subscription meta fields for easy access - if ( ! empty( $this->product_custom_fields['_subscription_price'][0] ) ) { - $this->subscription_price = $this->product_custom_fields['_subscription_price'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_sign_up_fee'][0] ) ) { - $this->subscription_sign_up_fee = $this->product_custom_fields['_subscription_sign_up_fee'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_period'][0] ) ) { - $this->subscription_period = $this->product_custom_fields['_subscription_period'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_period_interval'][0] ) ) { - $this->subscription_period_interval = $this->product_custom_fields['_subscription_period_interval'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_length'][0] ) ) { - $this->subscription_length = $this->product_custom_fields['_subscription_length'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_trial_length'][0] ) ) { - $this->subscription_trial_length = $this->product_custom_fields['_subscription_trial_length'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_trial_period'][0] ) ) { - $this->subscription_trial_period = $this->product_custom_fields['_subscription_trial_period'][0]; - } - - $this->subscription_payment_sync_date = ( ! isset( $this->product_custom_fields['_subscription_payment_sync_date'][0] ) ) ? 0 : maybe_unserialize( $this->product_custom_fields['_subscription_payment_sync_date'][0] ); - $this->subscription_one_time_shipping = ( ! isset( $this->product_custom_fields['_subscription_one_time_shipping'][0] ) ) ? 'no' : $this->product_custom_fields['_subscription_one_time_shipping'][0]; - $this->subscription_limit = ( ! isset( $this->product_custom_fields['_subscription_limit'][0] ) ) ? 'no' : $this->product_custom_fields['_subscription_limit'][0]; - } -} diff --git a/includes/core/legacy/class-wc-product-subscription-variation-legacy.php b/includes/core/legacy/class-wc-product-subscription-variation-legacy.php deleted file mode 100644 index 3665275..0000000 --- a/includes/core/legacy/class-wc-product-subscription-variation-legacy.php +++ /dev/null @@ -1,101 +0,0 @@ -parent_product_type = $this->product_type; - - $this->product_type = 'subscription_variation'; - - $this->subscription_variation_level_meta_data = array( - 'subscription_price' => 0, - 'subscription_period' => '', - 'subscription_period_interval' => 'day', - 'subscription_length' => 0, - 'subscription_trial_length' => 0, - 'subscription_trial_period' => 'day', - 'subscription_sign_up_fee' => 0, - 'subscription_payment_sync_date' => 0, - ); - - $this->variation_level_meta_data = array_merge( $this->variation_level_meta_data, $this->subscription_variation_level_meta_data ); - } - - /* Copied from WC 2.6 WC_Product_Variation */ - - /** - * __isset function. - * - * @param mixed $key - * @return bool - */ - public function __isset( $key ) { - if ( in_array( $key, array( 'variation_data', 'variation_has_stock' ) ) ) { - return true; - } elseif ( in_array( $key, array_keys( $this->variation_level_meta_data ) ) ) { - return metadata_exists( 'post', $this->variation_id, '_' . $key ); - } elseif ( in_array( $key, array_keys( $this->variation_inherited_meta_data ) ) ) { - return metadata_exists( 'post', $this->variation_id, '_' . $key ) || metadata_exists( 'post', $this->id, '_' . $key ); - } else { - return metadata_exists( 'post', $this->id, '_' . $key ); - } - } - - /** - * Get method returns variation meta data if set, otherwise in most cases the data from the parent. - * - * We need to use the WC_Product_Variation's __get() method, not the one in WC_Product_Subscription_Variation, - * which handles deprecation notices. - * - * @param string $key - * @return mixed - */ - public function __get( $key ) { - return WC_Product_Variation::__get( $key ); - } - - /** - * Provide a WC 3.0 method for variations. - * - * WC < 3.0 products have a get_parent() method, but this is not equivalent to the get_parent_id() method - * introduced in WC 3.0, because it derives the parent from $this->post->post_parent, but for variations, - * $this->post refers to the parent variable object's post, so $this->post->post_parent will be 0 under - * normal circumstances. Because of that, we can rely on wcs_get_objects_property( $this, 'parent_id' ) - * and define this get_parent_id() method for variations even when WC 3.0 is not active. - * - * @param string $key - * @return mixed - */ - public function get_parent_id() { - return $this->id; // When WC < 3.0 is active, the ID property is the parent variable product's ID - } -} diff --git a/includes/core/legacy/class-wc-product-variable-subscription-legacy.php b/includes/core/legacy/class-wc-product-variable-subscription-legacy.php deleted file mode 100644 index e26f899..0000000 --- a/includes/core/legacy/class-wc-product-variable-subscription-legacy.php +++ /dev/null @@ -1,441 +0,0 @@ -parent_product_type = $this->product_type; - - $this->product_type = 'variable-subscription'; - - // Load all meta fields - $this->product_custom_fields = get_post_meta( $this->id ); - - // Convert selected subscription meta fields for easy access - if ( ! empty( $this->product_custom_fields['_subscription_price'][0] ) ) { - $this->subscription_price = $this->product_custom_fields['_subscription_price'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_sign_up_fee'][0] ) ) { - $this->subscription_sign_up_fee = $this->product_custom_fields['_subscription_sign_up_fee'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_period'][0] ) ) { - $this->subscription_period = $this->product_custom_fields['_subscription_period'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_period_interval'][0] ) ) { - $this->subscription_period_interval = $this->product_custom_fields['_subscription_period_interval'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_length'][0] ) ) { - $this->subscription_length = $this->product_custom_fields['_subscription_length'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_trial_length'][0] ) ) { - $this->subscription_trial_length = $this->product_custom_fields['_subscription_trial_length'][0]; - } - - if ( ! empty( $this->product_custom_fields['_subscription_trial_period'][0] ) ) { - $this->subscription_trial_period = $this->product_custom_fields['_subscription_trial_period'][0]; - } - - $this->subscription_payment_sync_date = 0; - $this->subscription_one_time_shipping = ( ! isset( $this->product_custom_fields['_subscription_one_time_shipping'][0] ) ) ? 'no' : $this->product_custom_fields['_subscription_one_time_shipping'][0]; - $this->subscription_limit = ( ! isset( $this->product_custom_fields['_subscription_limit'][0] ) ) ? 'no' : $this->product_custom_fields['_subscription_limit'][0]; - } - - - /** - * Get the min or max variation (active) price. - * - * This is a copy of WooCommerce < 2.4's get_variation_price() method, because 2.4.0 introduced a new - * transient caching system which assumes asort() on prices yields correct results for min/max prices - * (which it does for prices alone, but that's not the full story for subscription prices). Unfortunately, - * the new caching system is also hard to hook into so we'll just use the old system instead as the - * @see self::variable_product_sync() uses the old method also. - * - * @param string $min_or_max - min or max - * @param boolean $display Whether the value is going to be displayed - * @return string - */ - public function get_variation_price( $min_or_max = 'min', $display = false ) { - $variation_id = $this->get_meta( '_' . $min_or_max . '_price_variation_id', true ); - - if ( $display ) { - if ( $variation = wc_get_product( $variation_id ) ) { - if ( 'incl' == get_option( 'woocommerce_tax_display_shop' ) ) { - $price = wcs_get_price_including_tax( $variation ); - } else { - $price = wcs_get_price_excluding_tax( $variation ); - } - } else { - $price = ''; - } - } else { - $price = $this->get_meta( '_price', true ); - } - - return apply_filters( 'woocommerce_get_variation_price', $price, $this, $min_or_max, $display ); - } - - /** - * Get an array of all sale and regular prices from all variations re-ordered after WC has done a standard sort, to reflect subscription terms. - * The first and last element for each price type is the least and most expensive, respectively. - * - * @see WC_Product_Variable::get_variation_prices() - * @param bool $include_taxes Should taxes be included in the prices. - * @return array() Array of RAW prices, regular prices, and sale prices with keys set to variation ID. - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - */ - public function get_variation_prices( $display = false ) { - - $price_hash = $this->get_price_hash( $this, $display ); - - $this->prices_array[ $price_hash ] = parent::get_variation_prices( $display ); - - $children = array_keys( $this->prices_array[ $price_hash ]['price'] ); - sort( $children ); - - $min_max_data = $this->get_min_and_max_variation_data( $children ); - - $min_variation_id = $min_max_data['min']['variation_id']; - $max_variation_id = $min_max_data['max']['variation_id']; - - // Reorder the variable price arrays to reflect the min and max values so that WooCommerce will find them in the correct order - foreach ( $this->prices_array as $price_hash => $prices ) { - - // Loop over sale_price, regular_price & price values to update them on main array - foreach ( $prices as $price_key => $variation_prices ) { - - $min_price = $prices[ $price_key ][ $min_variation_id ]; - $max_price = $prices[ $price_key ][ $max_variation_id ]; - - unset( $prices[ $price_key ][ $min_variation_id ] ); - unset( $prices[ $price_key ][ $max_variation_id ] ); - - // append the minimum variation and prepend the maximum variation - $prices[ $price_key ] = array( $min_variation_id => $min_price ) + $prices[ $price_key ]; - $prices[ $price_key ] += array( $max_variation_id => $max_price ); - - $this->prices_array[ $price_hash ][ $price_key ] = $prices[ $price_key ]; - } - } - - $this->subscription_price = $min_max_data['min']['price']; - $this->subscription_period = $min_max_data['min']['period']; - $this->subscription_period_interval = $min_max_data['min']['interval']; - - $this->max_variation_price = $min_max_data['max']['price']; - $this->max_variation_period = $min_max_data['max']['period']; - $this->max_variation_period_interval = $min_max_data['max']['interval']; - - $this->min_variation_price = $min_max_data['min']['price']; - $this->min_variation_regular_price = $min_max_data['min']['regular_price']; - - return $this->prices_array[ $price_hash ]; - } - - /** - * Create unique cache key based on the tax location (affects displayed/cached prices), product version and active price filters. - * DEVELOPERS should filter this hash if offering conditional pricing to keep it unique. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param WC_Product - * @param bool $display Are prices for display? If so, taxes will be calculated. - * @return string - */ - protected function get_price_hash( $display = false ) { - global $wp_filter; - - if ( $display ) { - $price_hash = array( get_option( 'woocommerce_tax_display_shop', 'excl' ), WC_Tax::get_rates() ); - } else { - $price_hash = array( false ); - } - - $filter_names = array( 'woocommerce_variation_prices_price', 'woocommerce_variation_prices_regular_price', 'woocommerce_variation_prices_sale_price' ); - - foreach ( $filter_names as $filter_name ) { - if ( ! empty( $wp_filter[ $filter_name ] ) ) { - $price_hash[ $filter_name ] = array(); - - foreach ( $wp_filter[ $filter_name ] as $priority => $callbacks ) { - $price_hash[ $filter_name ][] = array_values( wp_list_pluck( $callbacks, 'function' ) ); - } - } - } - - $price_hash = md5( json_encode( apply_filters( 'woocommerce_get_variation_prices_hash', $price_hash, $this, $display ) ) ); - - return $price_hash; - } - - /** - * Sync variable product prices with the children lowest/highest prices. - * - * @param int $product_id The ID of the product. - * @return void - */ - public function variable_product_sync( $product_id = 0 ) { - - WC_Product_Variable::variable_product_sync( $product_id ); - - $child_variation_ids = $this->get_children( true ); - - if ( $child_variation_ids ) { - - $min_max_data = wcs_get_min_max_variation_data( $this, $child_variation_ids ); - - $this->set_min_and_max_variation_data( $min_max_data, $child_variation_ids ); - - update_post_meta( $this->id, '_min_price_variation_id', $min_max_data['min']['variation_id'] ); - update_post_meta( $this->id, '_max_price_variation_id', $min_max_data['max']['variation_id'] ); - - update_post_meta( $this->id, '_price', $min_max_data['min']['price'] ); - update_post_meta( $this->id, '_min_variation_price', $min_max_data['min']['price'] ); - update_post_meta( $this->id, '_max_variation_price', $min_max_data['max']['price'] ); - update_post_meta( $this->id, '_min_variation_regular_price', $min_max_data['min']['regular_price'] ); - update_post_meta( $this->id, '_max_variation_regular_price', $min_max_data['max']['regular_price'] ); - update_post_meta( $this->id, '_min_variation_sale_price', $min_max_data['min']['sale_price'] ); - update_post_meta( $this->id, '_max_variation_sale_price', $min_max_data['max']['sale_price'] ); - - update_post_meta( $this->id, '_min_variation_period', $min_max_data['min']['period'] ); - update_post_meta( $this->id, '_max_variation_period', $min_max_data['max']['period'] ); - update_post_meta( $this->id, '_min_variation_period_interval', $min_max_data['min']['interval'] ); - update_post_meta( $this->id, '_max_variation_period_interval', $min_max_data['max']['interval'] ); - - update_post_meta( $this->id, '_subscription_price', $min_max_data['min']['price'] ); - update_post_meta( $this->id, '_subscription_sign_up_fee', $min_max_data['subscription']['signup-fee'] ); - update_post_meta( $this->id, '_subscription_period', $min_max_data['min']['period'] ); - update_post_meta( $this->id, '_subscription_period_interval', $min_max_data['min']['interval'] ); - update_post_meta( $this->id, '_subscription_trial_period', $min_max_data['subscription']['trial_period'] ); - update_post_meta( $this->id, '_subscription_trial_length', $min_max_data['subscription']['trial_length'] ); - update_post_meta( $this->id, '_subscription_length', $min_max_data['subscription']['length'] ); - - $this->subscription_price = $min_max_data['min']['price']; - $this->subscription_period = $min_max_data['min']['period']; - $this->subscription_period_interval = $min_max_data['min']['interval']; - $this->subscription_sign_up_fee = $min_max_data['subscription']['signup-fee']; - $this->subscription_trial_period = $min_max_data['subscription']['trial_period']; - $this->subscription_trial_length = $min_max_data['subscription']['trial_length']; - $this->subscription_length = $min_max_data['subscription']['length']; - - if ( function_exists( 'wc_delete_product_transients' ) ) { - wc_delete_product_transients( $this->id ); - } else { - WC()->clear_product_transients( $this->id ); - } - } else { // No variations yet - - $this->subscription_price = ''; - $this->subscription_sign_up_fee = ''; - $this->subscription_period = 'day'; - $this->subscription_period_interval = 1; - $this->subscription_trial_period = 'day'; - $this->subscription_trial_length = 1; - $this->subscription_length = 0; - - } - } - - /** - * Returns the price in html format. - * - * @access public - * @param string $price (default: '') - * @return string - */ - public function get_price_html( $price = '' ) { - - if ( ! isset( $this->subscription_period ) || ! isset( $this->subscription_period_interval ) || ! isset( $this->max_variation_period ) || ! isset( $this->max_variation_period_interval ) ) { - $this->variable_product_sync(); - } - - // Only create the subscription price string when a price has been set - if ( $this->subscription_price !== '' ) { - - $price = ''; - - if ( $this->is_on_sale() && isset( $this->min_variation_price ) && $this->min_variation_regular_price !== $this->get_price() ) { - - if ( ! $this->min_variation_price || $this->min_variation_price !== $this->max_variation_price ) { - $price .= wcs_get_price_html_from_text( $this ); - } - - $variation_id = $this->get_meta( '_min_price_variation_id', true ); - $variation = wc_get_product( $variation_id ); - $tax_display_mode = get_option( 'woocommerce_tax_display_shop' ); - - $sale_price_args = array( - 'qty' => 1, - 'price' => $variation->get_sale_price(), - ); - $regular_price_args = array( - 'qty' => 1, - 'price' => $variation->get_regular_price(), - ); - - if ( 'incl' == $tax_display_mode ) { - $sale_price = wcs_get_price_including_tax( $variation, $sale_price_args ); - $regular_price = wcs_get_price_including_tax( $variation, $regular_price_args ); - } else { - $sale_price = wcs_get_price_excluding_tax( $variation, $sale_price_args ); - $regular_price = wcs_get_price_excluding_tax( $variation, $regular_price_args ); - } - - $price .= $this->get_price_html_from_to( $regular_price, $sale_price ); - - } else { - - if ( $this->min_variation_price !== $this->max_variation_price ) { - $price .= wcs_get_price_html_from_text( $this ); - } - - $price .= wc_price( $this->get_variation_price( 'min', true ) ); - - } - - // Make sure the price contains "From:" when billing schedule differs between variations - if ( false === strpos( $price, wcs_get_price_html_from_text( $this ) ) ) { - if ( $this->subscription_period !== $this->max_variation_period ) { - $price = wcs_get_price_html_from_text( $this ) . $price; - } elseif ( $this->subscription_period_interval !== $this->max_variation_period_interval ) { - $price = wcs_get_price_html_from_text( $this ) . $price; - } - } - - $price .= $this->get_price_suffix(); - - $price = WC_Subscriptions_Product::get_price_string( $this, array( 'price' => $price ) ); - } - - return apply_filters( 'woocommerce_variable_subscription_price_html', $price, $this ); - } - - /** - * Provide the WC_Data::get_meta() function when WC < 3.0 is active. - * - * @param string $meta_key - * @param bool $single - * @param string $context - * @return object WC_Product_Subscription or WC_Product_Subscription_Variation - */ - function get_meta( $meta_key = '', $single = true, $context = 'view' ) { - return $this->get_meta( $meta_key, $single ); - } - - /** - * get_child function. - * - * @access public - * @param mixed $child_id - * @return object WC_Product_Subscription or WC_Product_Subscription_Variation - */ - public function get_child( $child_id ) { - return wc_get_product( $child_id, array( - 'product_type' => 'Subscription_Variation', - 'parent_id' => $this->id, - 'parent' => $this, - ) ); - } - - /** - * Get default attributes. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param string $context - * @return array - */ - public function get_default_attributes( $context = 'view' ) { - return $this->get_variation_default_attributes(); - } - - /** - * Set the product's min and max variation data. - * - * @param array $min_and_max_data The min and max variation data returned by @see wcs_get_min_max_variation_data(). Optional. - * @param array $variation_ids The visible child variation IDs. Optional. By default this value be generated by @see WC_Product_Variable->get_children( true ). - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.3.0 - */ - public function set_min_and_max_variation_data( $min_and_max_data = array(), $variation_ids = array() ) { - - if ( empty( $variation_ids ) ) { - $variation_ids = $this->get_children( true ); - } - - if ( empty( $min_and_max_data ) ) { - $min_and_max_data = wcs_get_min_max_variation_data( $this, $variation_ids ); - } - - update_post_meta( $this->id, '_min_max_variation_data', $min_and_max_data, true ); - update_post_meta( $this->id, '_min_max_variation_ids_hash', $this->get_variation_ids_hash( $variation_ids ), true ); - } - - /** - * Get the min and max variation data. - * - * This is a wrapper for @see wcs_get_min_max_variation_data() but to avoid calling - * that resource intensive function multiple times per request, check the value - * stored in meta or cached in memory before calling that function. - * - * @param array $variation_ids An array of variation IDs. - * @return array The variable product's min and max variation data. - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.3.0 - */ - public function get_min_and_max_variation_data( $variation_ids ) { - $variation_ids_hash = $this->get_variation_ids_hash( $variation_ids ); - - // If this variable product has no min and max variation data, set it. - if ( ! metadata_exists( 'post', $this->id, '_min_max_variation_ids_hash' ) ) { - $this->set_min_and_max_variation_data(); - } - - if ( $variation_ids_hash === $this->get_meta( '_min_max_variation_ids_hash', true ) ) { - $min_and_max_variation_data = $this->get_meta( '_min_max_variation_data', true ); - } elseif ( ! empty( $this->min_max_variation_data[ $variation_ids_hash ] ) ) { - $min_and_max_variation_data = $this->min_max_variation_data[ $variation_ids_hash ]; - } else { - $min_and_max_variation_data = wcs_get_min_max_variation_data( $this, $variation_ids ); - $this->min_max_variation_data[ $variation_ids_hash ] = $min_and_max_variation_data; - } - - return $min_and_max_variation_data; - } -} diff --git a/includes/core/legacy/class-wc-subscription-legacy.php b/includes/core/legacy/class-wc-subscription-legacy.php deleted file mode 100644 index 17643aa..0000000 --- a/includes/core/legacy/class-wc-subscription-legacy.php +++ /dev/null @@ -1,776 +0,0 @@ -order_type = 'shop_subscription'; - - $this->schedule = new stdClass(); - } - - /** - * Populates a subscription from the loaded post data. - * - * @param mixed $result - */ - public function populate( $result ) { - parent::populate( $result ); - - if ( $this->post->post_parent > 0 ) { - $this->order = wc_get_order( $this->post->post_parent ); - } - } - - /** - * Returns the unique ID for this object. - * - * @return int - */ - public function get_id() { - return $this->id; - } - - /** - * Get parent order ID. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @return int - */ - public function get_parent_id() { - return $this->post->post_parent; - } - - /** - * Gets order currency. - * - * @return string - */ - public function get_currency() { - return $this->get_order_currency(); - } - - /** - * Get customer_note. - * - * @param string $context - * @return string - */ - public function get_customer_note( $context = 'view' ) { - return $this->customer_note; - } - - /** - * Get prices_include_tax. - * - * @param string $context - * @return bool - */ - public function get_prices_include_tax( $context = 'view' ) { - return $this->prices_include_tax; - } - - /** - * Get the payment method. - * - * @param string $context - * @return string - */ - public function get_payment_method( $context = 'view' ) { - return $this->payment_method; - } - - /** - * Get the payment method's title. - * - * @param string $context - * @return string - */ - public function get_payment_method_title( $context = 'view' ) { - return $this->payment_method_title; - } - - /** Address Getters **/ - - /** - * Get billing_first_name. - * - * @param string $context - * @return string - */ - public function get_billing_first_name( $context = 'view' ) { - return $this->billing_first_name; - } - - /** - * Get billing_last_name. - * - * @param string $context - * @return string - */ - public function get_billing_last_name( $context = 'view' ) { - return $this->billing_last_name; - } - - /** - * Get billing_company. - * - * @param string $context - * @return string - */ - public function get_billing_company( $context = 'view' ) { - return $this->billing_company; - } - - /** - * Get billing_address_1. - * - * @param string $context - * @return string - */ - public function get_billing_address_1( $context = 'view' ) { - return $this->billing_address_1; - } - - /** - * Get billing_address_2. - * - * @param string $context - * @return string $value - */ - public function get_billing_address_2( $context = 'view' ) { - return $this->billing_address_2; - } - - /** - * Get billing_city. - * - * @param string $context - * @return string $value - */ - public function get_billing_city( $context = 'view' ) { - return $this->billing_city; - } - - /** - * Get billing_state. - * - * @param string $context - * @return string - */ - public function get_billing_state( $context = 'view' ) { - return $this->billing_state; - } - - /** - * Get billing_postcode. - * - * @param string $context - * @return string - */ - public function get_billing_postcode( $context = 'view' ) { - return $this->billing_postcode; - } - - /** - * Get billing_country. - * - * @param string $context - * @return string - */ - public function get_billing_country( $context = 'view' ) { - return $this->billing_country; - } - - /** - * Get billing_email. - * - * @param string $context - * @return string - */ - public function get_billing_email( $context = 'view' ) { - return $this->billing_email; - } - - /** - * Get billing_phone. - * - * @param string $context - * @return string - */ - public function get_billing_phone( $context = 'view' ) { - return $this->billing_phone; - } - - /** - * Get shipping_first_name. - * - * @param string $context - * @return string - */ - public function get_shipping_first_name( $context = 'view' ) { - return $this->shipping_first_name; - } - - /** - * Get shipping_last_name. - * - * @param string $context - * @return string - */ - public function get_shipping_last_name( $context = 'view' ) { - return $this->shipping_last_name; - } - - /** - * Get shipping_company. - * - * @param string $context - * @return string - */ - public function get_shipping_company( $context = 'view' ) { - return $this->shipping_company; - } - - /** - * Get shipping_address_1. - * - * @param string $context - * @return string - */ - public function get_shipping_address_1( $context = 'view' ) { - return $this->shipping_address_1; - } - - /** - * Get shipping_address_2. - * - * @param string $context - * @return string - */ - public function get_shipping_address_2( $context = 'view' ) { - return $this->shipping_address_2; - } - - /** - * Get shipping_city. - * - * @param string $context - * @return string - */ - public function get_shipping_city( $context = 'view' ) { - return $this->shipping_city; - } - - /** - * Get shipping_state. - * - * @param string $context - * @return string - */ - public function get_shipping_state( $context = 'view' ) { - return $this->shipping_state; - } - - /** - * Get shipping_postcode. - * - * @param string $context - * @return string - */ - public function get_shipping_postcode( $context = 'view' ) { - return $this->shipping_postcode; - } - - /** - * Get shipping_country. - * - * @param string $context - * @return string - */ - public function get_shipping_country( $context = 'view' ) { - return $this->shipping_country; - } - - /** - * Get order key. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param string $context - * @return string - */ - public function get_order_key( $context = 'view' ) { - return $this->order_key; - } - - /** - * Get date_created. - * - * Used by parent::get_date() - * - * @throws WC_Data_Exception - * @return DateTime|NULL object if the date is set or null if there is no date. - */ - public function get_date_created( $context = 'view' ) { - - if ( '0000-00-00 00:00:00' != $this->post->post_date_gmt ) { - $datetime = new WC_DateTime( $this->post->post_date_gmt, new DateTimeZone( 'UTC' ) ); - $datetime->setTimezone( new DateTimeZone( wc_timezone_string() ) ); - } else { - $datetime = new WC_DateTime( $this->post->post_date, new DateTimeZone( wc_timezone_string() ) ); - } - - // Cache it in $this->schedule for backward compatibility - if ( ! isset( $this->schedule->start ) ) { - $this->schedule->start = wcs_get_datetime_utc_string( $datetime ); - } - - return $datetime; - } - - /** - * Get date_modified. - * - * Used by parent::get_date() - * - * @throws WC_Data_Exception - * @return DateTime|NULL object if the date is set or null if there is no date. - */ - public function get_date_modified( $context = 'view' ) { - - if ( '0000-00-00 00:00:00' != $this->post->post_modified_gmt ) { - $datetime = new WC_DateTime( $this->post->post_modified_gmt, new DateTimeZone( 'UTC' ) ); - $datetime->setTimezone( new DateTimeZone( wc_timezone_string() ) ); - } else { - $datetime = new WC_DateTime( $this->post->post_modified, new DateTimeZone( wc_timezone_string() ) ); - } - - return $datetime; - } - - /** - * Check if a given line item on the subscription had a sign-up fee, and if so, return the value of the sign-up fee. - * - * The single quantity sign-up fee will be returned instead of the total sign-up fee paid. For example, if 3 x a product - * with a 10 BTC sign-up fee was purchased, a total 30 BTC was paid as the sign-up fee but this function will return 10 BTC. - * - * @param array|int Either an order item (in the array format returned by self::get_items()) or the ID of an order item. - * @param string $tax_inclusive_or_exclusive Whether or not to adjust sign up fee if prices inc tax - ensures that the sign up fee paid amount includes the paid tax if inc - * @return bool - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 - */ - public function get_items_sign_up_fee( $line_item, $tax_inclusive_or_exclusive = 'exclusive_of_tax' ) { - - if ( ! is_array( $line_item ) ) { - $line_item = wcs_get_order_item( $line_item, $this ); - } - - $parent_order = $this->get_parent(); - - // If there was no original order, nothing was paid up-front which means no sign-up fee - if ( false == $parent_order ) { - - $sign_up_fee = 0; - - } else { - - $original_order_item = ''; - - // Find the matching item on the order - foreach ( $parent_order->get_items() as $order_item ) { - if ( wcs_get_canonical_product_id( $line_item ) == wcs_get_canonical_product_id( $order_item ) ) { - $original_order_item = $order_item; - break; - } - } - - // No matching order item, so this item wasn't purchased in the original order - if ( empty( $original_order_item ) ) { - - $sign_up_fee = 0; - - } elseif ( isset( $line_item['item_meta']['_has_trial'] ) ) { - - // Sign up is total amount paid for this item on original order when item has a free trial - $sign_up_fee = $original_order_item['line_total'] / $original_order_item['qty']; - } elseif ( isset( $original_order_item['item_meta']['_synced_sign_up_fee'] ) ) { - $sign_up_fee = $original_order_item['item_meta']['_synced_sign_up_fee'] / $original_order_item['qty']; - - // The synced sign up fee meta contains the raw product sign up fee, if the subscription totals are inclusive of tax, we need to adjust the synced sign up fee to match tax inclusivity. - if ( $this->get_prices_include_tax() ) { - $line_item_total = $original_order_item['line_total'] + $original_order_item['line_tax']; - $signup_fee_portion = $sign_up_fee / $line_item_total; - $sign_up_fee = $original_order_item['line_total'] * $signup_fee_portion; - } - } else { - - // Sign-up fee is any amount on top of recurring amount - $sign_up_fee = max( $original_order_item['line_total'] / $original_order_item['qty'] - $line_item['line_total'] / $line_item['qty'], 0 ); - } - - // If prices don't inc tax, ensure that the sign up fee amount includes the tax. - if ( 'inclusive_of_tax' === $tax_inclusive_or_exclusive && ! empty( $original_order_item ) && ! empty( $sign_up_fee ) ) { - $sign_up_fee_proportion = $sign_up_fee / ( $original_order_item['line_total'] / $original_order_item['qty'] ); - $sign_up_fee_tax = $original_order_item['line_tax'] * $sign_up_fee_proportion; - - $sign_up_fee += $sign_up_fee_tax; - $sign_up_fee = wc_format_decimal( $sign_up_fee, wc_get_price_decimals() ); - } - } - - return apply_filters( 'woocommerce_subscription_items_sign_up_fee', $sign_up_fee, $line_item, $this, $tax_inclusive_or_exclusive ); - } - - /** - * Helper function to make sure when WC_Subscription calls get_prop() from - * it's new getters that the property is both retrieved from the legacy class - * property and done so from post meta. - * - * For inherited dates props, like date_created, date_modified, date_paid, - * date_completed, we want to use our own get_date() function rather simply - * getting the stored value. Otherwise, we either get the prop set in memory - * or post meta if it's not set yet, because __get() in WC < 3.0 would fallback - * to post meta. - * - * @param string - * @param string - * @return mixed - */ - protected function get_prop( $prop, $context = 'view' ) { - - if ( 'switch_data' == $prop ) { - $prop = 'subscription_switch_data'; - } - - // The requires manual renewal prop uses boolean values but is stored as a string so needs special handling, it also needs to be handled before the checks on $this->$prop to avoid triggering __isset() & __get() magic methods for $this->requires_manual_renewal - if ( 'requires_manual_renewal' === $prop ) { - $value = $this->get_meta( '_' . $prop, true ); - - if ( 'false' === $value || '' === $value ) { - $value = false; - } else { - $value = true; - } - } elseif ( ! isset( $this->$prop ) || empty( $this->$prop ) ) { - $value = $this->get_meta( '_' . $prop, true ); - } else { - $value = $this->$prop; - } - - return $value; - } - - /** - * Get the stored date for a specific schedule. - * - * @param string $date_type 'date_created', 'trial_end', 'next_payment', 'last_order_date_created' or 'end' - */ - protected function get_date_prop( $date_type ) { - - $datetime = parent::get_date_prop( $date_type ); - - // Cache the string equalivent of it in $this->schedule for backward compatibility - if ( ! isset( $this->schedule->{$date_type} ) ) { - if ( ! is_object( $datetime ) ) { - $this->schedule->{$date_type} = 0; - } else { - $this->schedule->{$date_type} = wcs_get_datetime_utc_string( $datetime ); - } - } - - return wcs_get_datetime_from( wcs_date_to_time( $datetime ) ); - } - - /*** Setters *****************************************************/ - - /** - * Set the unique ID for this object. - * - * @param int - */ - public function set_id( $id ) { - $this->id = absint( $id ); - } - - /** - * Set parent order ID. We don't use WC_Abstract_Order::set_parent_id() because we want to allow false - * parent IDs, like 0. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param int $value - */ - public function set_parent_id( $value ) { - // Update the parent in the database - wp_update_post( array( - 'ID' => $this->id, - 'post_parent' => $value, - ) ); - - // And update the parent in memory - $this->post->post_parent = $value; - $this->order = null; - } - - /** - * Set subscription status. - * - * @param string $new_status Status to change the order to. No internal wc- prefix is required. - * @return array details of change - */ - public function set_status( $new_status, $note = '', $manual_update = false ) { - - $old_status = $this->get_status(); - $prefix = substr( $new_status, 0, 3 ); - $new_status = 'wc-' === $prefix ? substr( $new_status, 3 ) : $new_status; - - wp_update_post( - array( - 'ID' => $this->get_id(), - 'post_status' => wcs_maybe_prefix_key( $new_status, 'wc-' ), - ) - ); - $this->post_status = $this->post->post_status = wcs_maybe_prefix_key( $new_status, 'wc-' ); - - if ( $old_status !== $new_status ) { - $this->status_transition = array( - 'from' => ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $old_status, - 'to' => $new_status, - 'note' => $note, - 'manual' => (bool) $manual_update, - ); - } - - return array( - 'from' => $old_status, - 'to' => $new_status, - ); - } - - /** - * Helper function to make sure when WC_Subscription calls set_prop() that property is - * both set in the legacy class property and saved in post meta immediately. - * - * @param string $prop - * @param mixed $value - */ - protected function set_prop( $prop, $value ) { - - if ( 'switch_data' == $prop ) { - $prop = 'subscription_switch_data'; - } - - $this->$prop = $value; - - // The requires manual renewal prop uses boolean values but it stored as a string - if ( 'requires_manual_renewal' === $prop ) { - if ( false === $value || '' === $value ) { - $value = 'false'; - } else { - $value = 'true'; - } - } - - update_post_meta( $this->get_id(), '_' . $prop, $value ); - } - - /** - * Set the stored date for a specific schedule. - * - * @param string $date_type 'trial_end', 'next_payment', 'cancelled', 'payment_retry' or 'end' - * @param int $value UTC timestamp - */ - protected function set_date_prop( $date_type, $value ) { - $datetime = wcs_get_datetime_from( $value ); - $date = ! is_null( $datetime ) ? wcs_get_datetime_utc_string( $datetime ) : 0; - - $this->set_prop( $this->get_date_prop_key( $date_type ), $date ); - $this->schedule->{$date_type} = $date; - } - - /** - * Set a certain date type for the last order on the subscription. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param string $date_type - * @param string|integer|object - * @return WC_DateTime|NULL object if the date is set or null if there is no date. - */ - protected function set_last_order_date( $date_type, $date = null ) { - - $last_order = $this->get_last_order( 'all' ); - - if ( $last_order ) { - - $datetime = wcs_get_datetime_from( $date ); - - switch ( $date_type ) { - case 'date_paid': - update_post_meta( $last_order->id, '_paid_date', ! is_null( $date ) ? $datetime->date( 'Y-m-d H:i:s' ) : '' ); - // Preemptively set the UTC timestamp for WC 3.0+ also to avoid incorrect values when the site's timezone is changed between now and upgrading to WC 3.0 - update_post_meta( $last_order->id, '_date_paid', ! is_null( $date ) ? $datetime->getTimestamp() : '' ); - break; - - case 'date_completed': - update_post_meta( $last_order->id, '_completed_date', ! is_null( $date ) ? $datetime->date( 'Y-m-d H:i:s' ) : '' ); - // Preemptively set the UTC timestamp for WC 3.0+ also to avoid incorrect values when the site's timezone is changed between now and upgrading to WC 3.0 - update_post_meta( $last_order->id, '_date_completed', ! is_null( $date ) ? $datetime->getTimestamp() : '' ); - break; - - case 'date_modified': - wp_update_post( array( - 'ID' => $last_order->id, - 'post_modified' => $datetime->date( 'Y-m-d H:i:s' ), - 'post_modified_gmt' => wcs_get_datetime_utc_string( $datetime ), - ) ); - break; - - case 'date_created': - wp_update_post( array( - 'ID' => $last_order->id, - 'post_date' => $datetime->date( 'Y-m-d H:i:s' ), - 'post_date_gmt' => wcs_get_datetime_utc_string( $datetime ), - ) ); - break; - } - } - } - - /** - * Set date_created. - * - * Used by parent::update_dates() - * - * @param string|integer|null $date UTC timestamp, or ISO 8601 DateTime. If the DateTime string has no timezone or offset, WordPress site timezone will be assumed. Null if their is no date. - * @throws WC_Data_Exception - */ - public function set_date_created( $date = null ) { - global $wpdb; - - if ( ! is_null( $date ) ) { - - $datetime_string = wcs_get_datetime_utc_string( wcs_get_datetime_from( $date ) ); - - // Don't use wp_update_post() to avoid infinite loops here - $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_date = %s, post_date_gmt = %s WHERE ID = %d", get_date_from_gmt( $datetime_string ), $datetime_string, $this->get_id() ) ); - - $this->post->post_date = get_date_from_gmt( $datetime_string ); - $this->post->post_date_gmt = $datetime_string; - } - } - - /** - * Set discount_total. - * - * @param string $value - * @throws WC_Data_Exception - */ - public function set_discount_total( $value ) { - $this->set_total( $value, 'cart_discount' ); - } - - /** - * Set discount_tax. - * - * @param string $value - * @throws WC_Data_Exception - */ - public function set_discount_tax( $value ) { - $this->set_total( $value, 'cart_discount_tax' ); - } - - /** - * Set shipping_total. - * - * @param string $value - * @throws WC_Data_Exception - */ - public function set_shipping_total( $value ) { - $this->set_total( $value, 'shipping' ); - } - - /** - * Set shipping_tax. - * - * @param string $value - * @throws WC_Data_Exception - */ - public function set_shipping_tax( $value ) { - $this->set_total( $value, 'shipping_tax' ); - } - - /** - * Set cart tax. - * - * @param string $value - * @throws WC_Data_Exception - */ - public function set_cart_tax( $value ) { - $this->set_total( $value, 'tax' ); - } - - /** - * Save data to the database. Nothing to do here as it's all done separately when calling @see this->set_prop(). - * - * @return int order ID - */ - public function save() { - $this->status_transition(); - return $this->get_id(); - } - - /** - * Update meta data by key or ID, if provided. - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.0 - * @param string $key - * @param string $value - * @param int $meta_id - */ - public function update_meta_data( $key, $value, $meta_id = '' ) { - if ( ! empty( $meta_id ) ) { - update_metadata_by_mid( 'post', $meta_id, $value, $key ); - } else { - update_post_meta( $this->get_id(), $key, $value ); - } - } - - /** - * Save subscription date changes to the database. - * Nothing to do here as all date properties are saved when calling @see $this->set_prop(). - * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.2.6 - */ - public function save_dates() { - // Nothing to do here. - } -} diff --git a/includes/core/legacy/class-wcs-array-property-post-meta-black-magic.php b/includes/core/legacy/class-wcs-array-property-post-meta-black-magic.php deleted file mode 100644 index 31bc936..0000000 --- a/includes/core/legacy/class-wcs-array-property-post-meta-black-magic.php +++ /dev/null @@ -1,89 +0,0 @@ -product_id = $product_id; - } - - /** - * offsetGet - * @param string $key - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet( $key ) { - return get_post_meta( $this->product_id, $this->maybe_prefix_meta_key( $key ), true ); - } - - /** - * offsetSet - * @param string $key - * @param mixed $value - */ - #[\ReturnTypeWillChange] - public function offsetSet( $key, $value ) { - update_post_meta( $this->product_id, $this->maybe_prefix_meta_key( $key ), $value ); - } - - /** - * offsetExists - * @param string $key - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists( $key ) { - return metadata_exists( 'post', $this->product_id, $this->maybe_prefix_meta_key( $key ) ); - } - - /** - * Nothing to do here as we access post meta directly. - */ - #[\ReturnTypeWillChange] - public function offsetUnset( $key ) { - } - - /** - * We only work with post meta data that has meta keys prefixed with an underscore, so - * add a prefix if it is not already set. - */ - protected function maybe_prefix_meta_key( $key ) { - if ( '_' != substr( $key, 0, 1 ) ) { - $key = '_' . $key; - } - return $key; - } -} diff --git a/includes/core/legacy/class-wcs-product-legacy.php b/includes/core/legacy/class-wcs-product-legacy.php deleted file mode 100644 index db925fb..0000000 --- a/includes/core/legacy/class-wcs-product-legacy.php +++ /dev/null @@ -1,41 +0,0 @@ -add( '_subscription_period', $order_subscription_periods[ $product_id ] ); - $item_meta->add( '_subscription_interval', $subscription_interval ); - $item_meta->add( '_subscription_length', $subscription_length ); - $item_meta->add( '_subscription_trial_length', $subscription_trial_length ); + $item_meta->add( '_subscription_period', $order_subscription_periods[ $product_id ] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_subscription_interval', $subscription_interval ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_subscription_length', $subscription_length ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_subscription_trial_length', $subscription_trial_length ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) - $item_meta->add( '_subscription_recurring_amount', $order_item['line_subtotal'] ); // WC_Subscriptions_Product::get_price() would return a price without filters applied - $item_meta->add( '_subscription_sign_up_fee', $subscription_sign_up_fee ); + $item_meta->add( '_subscription_recurring_amount', $order_item['line_subtotal'] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_subscription_sign_up_fee', $subscription_sign_up_fee ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) // Set recurring amounts for the item - $item_meta->add( '_recurring_line_total', $order_item['line_total'] ); - $item_meta->add( '_recurring_line_tax', $order_item['line_tax'] ); - $item_meta->add( '_recurring_line_subtotal', $order_item['line_subtotal'] ); - $item_meta->add( '_recurring_line_subtotal_tax', $order_item['line_subtotal_tax'] ); + $item_meta->add( '_recurring_line_total', $order_item['line_total'] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_recurring_line_tax', $order_item['line_tax'] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_recurring_line_subtotal', $order_item['line_subtotal'] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) + $item_meta->add( '_recurring_line_subtotal_tax', $order_item['line_subtotal_tax'] ); // @phpstan-ignore method.notFound (Legacy upgrade code with proper defensive checks) $order_item['item_meta'] = $item_meta->meta; diff --git a/includes/core/wcs-compatibility-functions.php b/includes/core/wcs-compatibility-functions.php index 5a50792..48795f4 100644 --- a/includes/core/wcs-compatibility-functions.php +++ b/includes/core/wcs-compatibility-functions.php @@ -516,7 +516,7 @@ function wcs_is_checkout_blocks_api_request( $endpoint = '' ) { * @return bool True if it's a WordPress cron request, false otherwise. */ function wcs_doing_cron() { - return function_exists( 'wp_doing_cron' ) ? wp_doing_cron() : defined( 'DOING_CRON' ) && DOING_CRON; + return function_exists( 'wp_doing_cron' ) ? wp_doing_cron() : defined( 'DOING_CRON' ) && DOING_CRON; // @phpstan-ignore phpstanWP.wpConstant.fetch (Compatibility fallback for older WordPress versions) } /** @@ -527,7 +527,7 @@ function wcs_doing_cron() { * @return bool True if it's a WordPress Ajax request, false otherwise. */ function wcs_doing_ajax() { - return function_exists( 'wp_doing_ajax' ) ? wp_doing_ajax() : defined( 'DOING_AJAX' ) && DOING_AJAX; + return function_exists( 'wp_doing_ajax' ) ? wp_doing_ajax() : defined( 'DOING_AJAX' ) && DOING_AJAX; // @phpstan-ignore phpstanWP.wpConstant.fetch (Compatibility fallback for older WordPress versions) } /** diff --git a/includes/core/wcs-functions.php b/includes/core/wcs-functions.php index 4f777f6..7934ef2 100644 --- a/includes/core/wcs-functions.php +++ b/includes/core/wcs-functions.php @@ -73,13 +73,24 @@ function wcs_do_subscriptions_exist() { /** * Main function for returning subscriptions. Wrapper for the wc_get_order() method. * - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 + * @since 2.0.0 Introduced. + * @since 8.1.0 Type safety improved. + * * @param mixed $the_subscription Post object or post ID of the order. + * * @return WC_Subscription|false The subscription object, or false if it cannot be found. */ function wcs_get_subscription( $the_subscription ) { if ( empty( $the_subscription ) ) { + wc_get_logger()->debug( + 'Subscription could not be loaded, as an empty value was supplied.', + array( + 'backtrace' => true, + 'requested_subscription' => $the_subscription, + 'requested_subscription_type' => gettype( $the_subscription ), + ) + ); return false; } @@ -87,13 +98,52 @@ function wcs_get_subscription( $the_subscription ) { $the_subscription = $the_subscription->get_id(); } + /** @var WC_Subscription $subscription */ $subscription = WC()->order_factory->get_order( $the_subscription ); if ( ! wcs_is_subscription( $subscription ) ) { $subscription = false; } - return apply_filters( 'wcs_get_subscription', $subscription ); + /** + * The subscription object being supplied to the caller, or else (bool) false if it could not be loaded. + * + * If a callback turns $subscription into some other type, that value will be rejected and (bool) false + * will ultimately be returned instead. + * + * @since 2.0.0 Introduced. + * @since 8.1.0 Type safety improved. + * + * @param WC_Subscription|false $subscription The subscription object being supplied to the caller, or (bool) false. + */ + $return_val = apply_filters( 'wcs_get_subscription', $subscription ); + + if ( false === $return_val ) { + wc_get_logger()->debug( + 'Subscription could not be loaded.', + array( + 'backtrace' => true, + 'requested_subscription' => $the_subscription, + 'requested_subscription_type' => is_object( $the_subscription ) ? get_class( $the_subscription ) : gettype( $the_subscription ), + ) + ); + + return false; + } elseif ( ! $return_val instanceof WC_Subscription ) { + wc_get_logger()->warning( + 'Subscriptions obtained via wcs_get_subscription() must be instances of WC_Subscription.', + array( + 'backtrace' => true, + 'filtered_type' => is_object( $return_val ) ? get_class( $return_val ) : gettype( $return_val ), + 'requested_subscription' => $the_subscription, + 'requested_subscription_type' => is_object( $the_subscription ) ? get_class( $the_subscription ) : gettype( $the_subscription ), + ) + ); + + return false; + } + + return $return_val; } /** @@ -675,7 +725,12 @@ function wcs_get_subscriptions_for_product( $product_ids, $fields = 'ids', $args function wcs_get_line_items_with_a_trial( $subscription_id ) { /** @var WC_Subscription $subscription */ $subscription = ( is_object( $subscription_id ) ) ? $subscription_id : wcs_get_subscription( $subscription_id ); - $trial_items = array(); + + if ( ! $subscription ) { + return array(); + } + + $trial_items = array(); foreach ( $subscription->get_items() as $line_item_id => $line_item ) { diff --git a/includes/core/wcs-resubscribe-functions.php b/includes/core/wcs-resubscribe-functions.php index 6a8fe7f..5b9537d 100644 --- a/includes/core/wcs-resubscribe-functions.php +++ b/includes/core/wcs-resubscribe-functions.php @@ -106,7 +106,7 @@ function wcs_get_users_resubscribe_link_for_product( $product_id ) { * Checks the cart to see if it contains a subscription product renewal. * * @param bool|array $cart The cart item containing the renewal, else false. - * @return string + * @return array|false * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 */ function wcs_cart_contains_resubscribe( $cart = null ) { @@ -184,6 +184,10 @@ function wcs_can_user_resubscribe_to( $subscription, $user_id = 0 ) { $can_user_resubscribe = false; + } elseif ( $subscription->contains_unavailable_product() ) { + + $can_user_resubscribe = false; + } else { $resubscribe_order_ids = $subscription->get_related_orders( 'ids', 'resubscribe' ); diff --git a/includes/downloads/class-wc-subscription-downloads-ajax.php b/includes/downloads/class-wc-subscription-downloads-ajax.php new file mode 100644 index 0000000..b5d91d5 --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads-ajax.php @@ -0,0 +1,75 @@ +get_results( $wpdb->prepare( " + SELECT ID + FROM $wpdb->posts AS posts + LEFT JOIN $wpdb->term_relationships AS t_relationships ON(posts.ID = t_relationships.object_id) + LEFT JOIN $wpdb->term_taxonomy AS t_taxonomy ON(t_relationships.term_taxonomy_id = t_taxonomy.term_taxonomy_id) + LEFT JOIN $wpdb->terms AS terms ON(t_taxonomy.term_id = terms.term_id) + WHERE posts.post_type = 'product' + AND posts.post_status = 'publish' + AND posts.post_title LIKE %s + AND t_taxonomy.taxonomy = 'product_type' + AND (terms.slug = 'subscription' OR terms.slug = 'variable-subscription') + ORDER BY posts.post_date DESC + ", '%' . $term . '%' ) ); + + if ( $query_subscriptions ) { + foreach ( $query_subscriptions as $item ) { + $_product = wc_get_product( $item->ID ); + $found_subscriptions[ $item->ID ] = sanitize_text_field( $_product->get_formatted_name() ); + + if ( 'variable-subscription' == $_product->get_type() ) { + $chindren = get_children( array( 'post_parent' => $_product->get_id(), 'post_type' => 'product_variation' ) ); + + foreach ( $chindren as $child ) { + $_child_product = wc_get_product( $child ); + $found_subscriptions[ $child->ID ] = sanitize_text_field( $_child_product->get_formatted_name() ); + } + } + } + } + + wp_send_json( $found_subscriptions ); + } +} diff --git a/includes/downloads/class-wc-subscription-downloads-install.php b/includes/downloads/class-wc-subscription-downloads-install.php new file mode 100644 index 0000000..9f8eaec --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads-install.php @@ -0,0 +1,62 @@ +create_table(); + } + + /** + * Install the plugin table. + * + * @return void + */ + protected function create_table() { + global $wpdb; + + $version = get_option( 'woocommerce_subscription_downloads_version' ); + + if ( ! $version ) { + add_option( 'woocommerce_subscription_downloads_version', WC_Subscriptions::$version ); + + $collate = ''; + + if ( $wpdb->has_cap( 'collation' ) ) { + if ( ! empty( $wpdb->charset ) ) { + $collate .= "DEFAULT CHARACTER SET $wpdb->charset"; + } + if ( ! empty( $wpdb->collate ) ) { + $collate .= " COLLATE $wpdb->collate"; + } + } + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + $create = " + CREATE TABLE {$wpdb->prefix}woocommerce_subscription_downloads ( + id bigint(20) NOT NULL auto_increment, + product_id bigint(20) NOT NULL, + subscription_id bigint(20) NOT NULL, + PRIMARY KEY (id) + ) $collate; + "; + + dbDelta( $create ); + } else { + update_option( 'woocommerce_subscription_downloads_version', WC_Subscriptions::$version ); + } + } +} diff --git a/includes/downloads/class-wc-subscription-downloads-order.php b/includes/downloads/class-wc-subscription-downloads-order.php new file mode 100644 index 0000000..072d6d7 --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads-order.php @@ -0,0 +1,218 @@ +get_items() ); + + foreach ( $subscription->get_items() as $item ) { + + // Gets the downloadable products. + $downloadable_products = WC_Subscription_Downloads::get_downloadable_products( $item['product_id'], $item['variation_id'] ); + + if ( $downloadable_products ) { + + foreach ( $downloadable_products as $product_id ) { + $_product = wc_get_product( $product_id ); + + if ( ! $_product ) { + continue; + } + + // @phpstan-ignore property.notFound + $product_status = version_compare( WC_VERSION, '3.0', '<' ) ? $_product->post->post_status : $_product->get_status(); + + if ( 'expired' === $new_status || 'cancelled' === $new_status ) { + WCS_Download_Handler::revoke_downloadable_file_permission( $product_id, $subscription_id, $subscription->get_user_id() ); + } + // Adds the downloadable files to the subscription. + else if ( $_product && $_product->exists() && $_product->is_downloadable() && 'publish' === $product_status ) { + WCS_Download_Handler::revoke_downloadable_file_permission( $product_id, $subscription_id, $subscription->get_user_id() ); + $downloads = version_compare( WC_VERSION, '3.0', '<' ) ? $_product->get_files() : $_product->get_downloads(); + + foreach ( array_keys( $downloads ) as $download_id ) { + wc_downloadable_file_permission( $download_id, $product_id, $subscription ); + } + + if ( ! in_array( $_product->get_id(), $product_item_ids ) ) { + // Skip wrong recalculation of totals by adding a 0 amount Subscriptions. + $totals = array( + 'subtotal' => wc_format_decimal( 0 ), + 'total' => wc_format_decimal( 0 ), + 'subtotal_tax' => wc_format_decimal( 0 ), + 'tax' => wc_format_decimal( 0 ), + ); + + $subscription->add_product( $_product, 1, array( 'totals' => $totals ) ); + } + } + } + } + } + } + + /** + * Remove downloads duplicates on subscriptions. + * + * @since 1.1.29 + * + * @param array $downloads List of downloads. + * @param WC_Order $order The order. + * + * @return array Array of downloads. + */ + public static function remove_subscription_download_duplicates( $downloads, $order ) { + if ( is_a( $order, 'WC_Subscription' ) ) { + $downloads = array_unique( $downloads, SORT_REGULAR ); + } + return $downloads; + } + + /** + * Remove customer download duplicates that were added to the same order. + * + * @since 1.1.30 + * + * @param array $downloads List of downloads. + * @param int $customer_id The customer id. + * + * @return array Array of downloads. + */ + public static function remove_customer_download_duplicates( $downloads, $customer_id ) { + // As downloads have an order_id, the following only removes download duplicates from the same order. + $downloads = array_unique( $downloads, SORT_REGULAR ); + + return $downloads; + } + + /** + * List the downloads in order emails. + * + * @param WC_Order $order Order data + * @param bool $sent_to_admin Sent or not to admin. + * @param bool $plain_text Plain or HTML email. + */ + public function email_list_downloads( $order, $sent_to_admin = false, $plain_text = false ) { + // @phpstan-ignore property.notFound + $order_status = version_compare( WC_VERSION, '3.0', '<' ) ? $order->status : $order->get_status(); + + if ( $sent_to_admin && ! in_array( $order_status, array( 'processing', 'completed' ) ) ) { + return; + } + + $downloads = WC_Subscription_Downloads::get_order_downloads( $order ); + + if ( $downloads && $plain_text ) { + $html = apply_filters( 'woocommerce_subscription_downloads_my_downloads_title', __( 'Available downloads', 'woocommerce-subscriptions' ) ); + $html .= PHP_EOL . PHP_EOL; + + foreach ( $downloads as $download ) { + $html .= $download['name'] . ': ' . $download['download_url'] . PHP_EOL; + } + + $html .= PHP_EOL; + $html .= '****************************************************'; + $html .= PHP_EOL . PHP_EOL; + + echo esc_html( wp_strip_all_tags( $html ) ); + + } elseif ( $downloads && ! $plain_text ) { + $html = '

' . esc_html( apply_filters( 'woocommerce_subscription_downloads_my_downloads_title', __( 'Available downloads', 'woocommerce-subscriptions' ) ) ) . '

'; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= '
'; + $html .= '
    '; + foreach ( $downloads as $download ) { + $html .= sprintf( '
  • %2$s
  • ', esc_url( $download['download_url'] ), esc_html( $download['name'] ) ); + } + $html .= '
'; + $html .= '
'; + + /** + * The following HTML output consists of both static content and variable elements. + * The variable elements, such as user-generated content or database values, are properly escaped to prevent security vulnerabilities. + * + * If this HTML is ever exposed externally via a filter or if more variable elements are added, additional security measures should be taken into account. + * Consider using the necessary escaping functions/methods to ensure the continued safety of the output. + * + * Note: The warning 'WordPress.Security.EscapeOutput.OutputNotEscaped' has been suppressed intentionally, but ensure that the code adheres to the required security standards. + */ + echo $html; // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + } + } + + /** + * Revoke download permissions granted on the old switch item. + * + * @param WC_Subscription $subscription + * @param array $new_item + * @param array $old_item + */ + public function handle_download_switch( $subscription, $new_item, $old_item ) { + if ( ! is_object( $subscription ) ) { + $subscription = wcs_get_subscription( $subscription ); + } + + $subscription_id = $subscription->get_id(); + $downloadable_products = WC_Subscription_Downloads::get_downloadable_products( $old_item['product_id'], $old_item['variation_id'] ); + $subscription_items = $subscription->get_items(); + + // Remove old item attached to the subscription. + foreach ( $subscription_items as $item ) { + if ( in_array( $item['product_id'], $downloadable_products ) || in_array( $item['variation_id'], $downloadable_products ) ) { + $item = $subscription->get_item( $item ); + if ( $item ) { + $item->delete(); + } + } + } + + // Further, remove all attached downloadable products to the subscription. + foreach ( $downloadable_products as $product_id ) { + WCS_Download_Handler::revoke_downloadable_file_permission( $product_id, $subscription_id, $subscription->get_user_id() ); + } + + // Re-trigger download permissions. It will automatically add permissions to the new items. + $this->download_permissions( $subscription_id, '', 'active', $subscription ); + } +} diff --git a/includes/downloads/class-wc-subscription-downloads-products.php b/includes/downloads/class-wc-subscription-downloads-products.php new file mode 100644 index 0000000..e7e5c22 --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads-products.php @@ -0,0 +1,385 @@ +id && version_compare( WC_VERSION, '2.3.0', '<' ) ) { + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + + wp_enqueue_script( 'wc_subscription_downloads_writepanel', plugins_url( 'assets/js/admin/writepanel' . $suffix . '.js', plugin_dir_path( __FILE__ ) ), array( 'ajax-chosen', 'chosen' ), WC_Subscriptions::$version, true ); + + wp_localize_script( + 'wc_subscription_downloads_writepanel', + 'wc_subscription_downloads_product', + array( + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'security' => wp_create_nonce( 'search-products' ), + ) + ); + } + } + + /** + * Simple product write panel options. + */ + public function simple_write_panel_options() { + global $post; + ?> +

+ + + + + +

+ + + + +

+ + + + +

+ + + get_var( + $wpdb->prepare( + "SELECT post_parent AS parent_id + FROM {$wpdb->prefix}posts + WHERE ID = %d; + ", + $subscription_product_id + ) + ); + + // If the subscription product is a variation, use variation meta key to find related orders. + if ( ! empty( $parent_id ) ) { + $meta_key = '_variation_id'; + } + + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT order_items.order_id AS id + FROM {$wpdb->prefix}woocommerce_order_items as order_items + LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON order_items.order_item_id = itemmeta.order_item_id + WHERE itemmeta.meta_key = %s + AND itemmeta.meta_value = %d; + ", + $meta_key, + $subscription_product_id + ) + ); + + foreach ( $results as $order ) { + $orders[] = $order->id; + } + + $orders = apply_filters( 'woocommerce_subscription_downloads_get_orders', $orders, $subscription_product_id ); + + return $orders; + } + + /** + * Revoke access to download. + * + * @param bool $download_id + * @param bool $product_id + * @param bool $order_id + * + * @return void + */ + protected function revoke_access_to_download( $download_id, $product_id, $order_id ) { + global $wpdb; + + $wpdb->query( $wpdb->prepare( " + DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions + WHERE order_id = %d AND product_id = %d AND download_id = %s; + ", $order_id, $product_id, $download_id ) ); + + do_action( 'woocommerce_ajax_revoke_access_to_product_download', $download_id, $product_id, $order_id ); + } + + /** + * Update subscription downloads table and orders. + * + * @param int $product_id + * @param array $subscriptions + * + * @return void + */ + protected function update_subscription_downloads( $product_id, $subscriptions ) { + global $wpdb; + + if ( version_compare( WC_VERSION, '3.0', '<' ) && ! empty( $subscriptions ) ) { + $subscriptions = explode( ',', $subscriptions ); + } + + $current = WC_Subscription_Downloads::get_subscriptions( $product_id ); + + // Delete items. + $delete_ids = array_diff( $current, $subscriptions ); + if ( $delete_ids ) { + foreach ( $delete_ids as $delete ) { + $wpdb->delete( + $wpdb->prefix . 'woocommerce_subscription_downloads', + array( + 'product_id' => $product_id, + 'subscription_id' => $delete, + ), + array( + '%d', + '%d', + ) + ); + + $_orders = $this->get_orders( $delete ); + foreach ( $_orders as $order_id ) { + $_product = wc_get_product( $product_id ); + $downloads = version_compare( WC_VERSION, '3.0', '<' ) ? $_product->get_files() : $_product->get_downloads(); + + // Adds the downloadable files to the order/subscription. + foreach ( array_keys( $downloads ) as $download_id ) { + $this->revoke_access_to_download( $download_id, $product_id, $order_id ); + } + } + } + } + + // Add items. + $add_ids = array_diff( $subscriptions, $current ); + if ( $add_ids ) { + foreach ( $add_ids as $add ) { + $wpdb->insert( + $wpdb->prefix . 'woocommerce_subscription_downloads', + array( + 'product_id' => $product_id, + 'subscription_id' => $add, + ), + array( + '%d', + '%d', + ) + ); + + $_orders = $this->get_orders( $add ); + foreach ( $_orders as $order_id ) { + $order = wc_get_order( $order_id ); + + if ( ! is_a( $order, 'WC_Subscription' ) ) { + // avoid adding permissions to orders and it's + // subscription for the same user, causing duplicates + // to show up + continue; + } + + $_product = wc_get_product( $product_id ); + $downloads = version_compare( WC_VERSION, '3.0', '<' ) ? $_product->get_files() : $_product->get_downloads(); + + // Adds the downloadable files to the order/subscription. + foreach ( array_keys( $downloads ) as $download_id ) { + wc_downloadable_file_permission( $download_id, $product_id, $order ); + } + } + } + } + } + + /** + * Save simple product data. + * + * @param int $product_id + * + * @return void + */ + public function save_simple_product_data( $product_id ) { + $subscription_ids = ! empty( $_POST['_subscription_downloads_ids'] ) ? wc_clean( wp_unslash( $_POST['_subscription_downloads_ids'] ) ) : ''; + + if ( ! isset( $_POST['_downloadable'] ) || 'publish' !== get_post_status( $product_id ) ) { + update_post_meta( $product_id, '_subscription_downloads_ids', $subscription_ids ); + return; + } + + delete_post_meta( $product_id, '_subscription_downloads_ids', $subscription_ids ); + $subscriptions = $subscription_ids ?: array(); + + $this->update_subscription_downloads( $product_id, $subscriptions ); + } + + /** + * Save variable product data. + * + * @param int $variation_id + * @param int $index + * + * @return void + */ + public function save_variation_product_data( $variation_id, $index ) { + if ( ! isset( $_POST['variable_is_downloadable'][ $index ] ) ) { + return; + } + + $subscriptions = isset( $_POST['_variable_subscription_downloads_ids'][ $index ] ) ? wc_clean( wp_unslash( $_POST['_variable_subscription_downloads_ids'][ $index ] ) ) : array(); + + if ( version_compare( WC_VERSION, '3.0.0', '<' ) ) { + $subscriptions = explode( ',', $subscriptions ); + } + + $subscriptions = array_filter( $subscriptions ); // nosemgrep: audit.php.lang.misc.array-filter-no-callback -- $subscriptions are already passed through wc_clean() and wp_unslash(). + + $this->update_subscription_downloads( $variation_id, $subscriptions ); + } + + /** + * Save subscriptions information when duplicating a product. + * + * @param int|WC_Product $id_or_product Duplicated product ID + * @param WP_Post|WC_Product $post Product being duplicated + */ + public function save_subscriptions_when_duplicating_product( $id_or_product, $post ) { + $post_id = is_a( $post, 'WC_Product' ) ? $post->get_parent_id() : $post->ID; + $new_id = is_a( $id_or_product, 'WC_Product' ) ? $id_or_product->get_id() : $id_or_product; + + $subscriptions = WC_Subscription_Downloads::get_subscriptions( $post_id ); + if ( ! empty( $subscriptions ) ) { + $this->update_subscription_downloads( $new_id, $subscriptions ); + } + + $children_products = get_children( 'post_parent=' . $post_id . '&post_type=product_variation' ); + if ( empty( $children_products ) ) { + return; + } + + // Create assoc array where keys are flatten variation attributes and values + // are original product variations. + $children_ids_by_variation_attributes = array(); + foreach ( $children_products as $child ) { + $str_attributes = $this->get_str_variation_attributes( $child ); + if ( ! empty( $str_attributes ) ) { + $children_ids_by_variation_attributes[ $str_attributes ] = $child; + } + } + + // Copy variations' subscriptions. + $exclude = apply_filters( 'woocommerce_duplicate_product_exclude_children', false ); + $new_children_products = get_children( 'post_parent=' . $new_id . '&post_type=product_variation' ); + if ( ! $exclude && ! empty( $new_children_products ) ) { + foreach ( $new_children_products as $child ) { + $str_attributes = $this->get_str_variation_attributes( $child ); + if ( ! empty( $children_ids_by_variation_attributes[ $str_attributes ] ) ) { + $this->save_subscriptions_when_duplicating_product( + $child->ID, + $children_ids_by_variation_attributes[ $str_attributes ] + ); + } + } + } + } + + /** + * Get string representation of variation attributes from a given product variation. + * + * @param mixed $product_variation Product variation + * + * @return string Variation attributes + */ + protected function get_str_variation_attributes( $product_variation ) { + $product_variation = wc_get_product( $product_variation ); + if ( ! is_callable( array( $product_variation, 'get_formatted_variation_attributes' ) ) ) { + return false; + } + + return (string) wc_get_formatted_variation( $product_variation, true ); + } +} diff --git a/includes/downloads/class-wc-subscription-downloads-settings.php b/includes/downloads/class-wc-subscription-downloads-settings.php new file mode 100644 index 0000000..4f1d598 --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads-settings.php @@ -0,0 +1,57 @@ + __( 'Downloads', 'woocommerce-subscriptions' ), + 'type' => 'title', + 'id' => WC_Subscriptions_Admin::$option_prefix . '_downloads_settings', + ), + array( + 'name' => __( 'Enable product linking to subscriptions', 'woocommerce-subscriptions' ), + 'desc' => __( 'Allow simple and variable downloadable products to be included with subscription products.', 'woocommerce-subscriptions' ), + 'id' => WC_Subscriptions_Admin::$option_prefix . '_enable_downloadable_file_linking', + 'default' => 'no', + 'type' => 'checkbox', + 'row_class' => 'enable-downloadable-file-linking', + ), + array( + 'type' => 'sectionend', + 'id' => WC_Subscriptions_Admin::$option_prefix . '_downloads_settings', + ), + ); + + // Insert the switch settings in after the synchronisation section otherwise add them to the end. + if ( ! WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_gifting', $download_settings, 'multiple-settings', 'sectionend' ) ) { + $settings = array_merge( $settings, $download_settings ); + } + + return $settings; + } + + /** + * Check if Subscriptions Downloads is enabled. + * @since 8.1.0 + * @return bool + */ + public static function is_enabled() { + return get_option( WC_Subscriptions_Admin::$option_prefix . '_enable_downloadable_file_linking', 'no' ) === 'yes'; + } +} diff --git a/includes/downloads/class-wc-subscription-downloads.php b/includes/downloads/class-wc-subscription-downloads.php new file mode 100644 index 0000000..c62102b --- /dev/null +++ b/includes/downloads/class-wc-subscription-downloads.php @@ -0,0 +1,150 @@ +get_results( $wpdb->prepare( "SELECT subscription_id FROM {$wpdb->prefix}woocommerce_subscription_downloads WHERE product_id = %d", $product_id ), ARRAY_A ); + + $subscriptions = array(); + foreach ( $query as $item ) { + $subscriptions[] = $item['subscription_id']; + } + + return $subscriptions; + } + + /** + * Get downloadable products from a subscription. + * + * @param int $subscription_id + * + * @return array + */ + public static function get_downloadable_products( $subscription_id, $subscription_variable_id = '' ) { + global $wpdb; + + $query = $wpdb->get_results( $wpdb->prepare( "SELECT product_id FROM {$wpdb->prefix}woocommerce_subscription_downloads WHERE subscription_id = %d OR subscription_id = %d", $subscription_id, $subscription_variable_id ), ARRAY_A ); + + $products = array(); + foreach ( $query as $item ) { + $products[] = $item['product_id']; + } + + return $products; + } + + /** + * Get order download files. + * + * @param WC_Order $order Order data. + * + * @return array Download data (name, file and download_url). + */ + public static function get_order_downloads( $order ) { + $downloads = array(); + + if ( class_exists( 'WC_Subscriptions_Core_Plugin' ) || version_compare( WC_Subscriptions::$version, '2.0.0', '>=' ) ) { + $contains_subscription = wcs_order_contains_subscription( $order ); + } else { + $contains_subscription = WC_Subscriptions_Order::order_contains_subscription( $order ); + } + + if ( 0 < count( $order->get_items() ) && $contains_subscription && $order->is_download_permitted() ) { + foreach ( $order->get_items() as $item ) { + + // Gets the downloadable products. + $downloadable_products = self::get_downloadable_products( $item['product_id'], $item['variation_id'] ); + + if ( $downloadable_products ) { + foreach ( $downloadable_products as $product_id ) { + $_item = array( + 'product_id' => $product_id, + 'variation_id' => '', + ); + + // Get the download data. + if ( version_compare( WC_VERSION, '3.0', '<' ) ) { + $_downloads = $order->get_item_downloads( $_item ); + } else { + $order_item = new WC_Order_Item_Product(); + $product = wc_get_product( $product_id ); + if ( empty( $product ) ) { + continue; + } + $order_item->set_product( $product ); + $order_item->set_order_id( $order->get_id() ); + $_downloads = $order_item->get_item_downloads(); + } + + if ( empty( $_downloads ) ) { + continue; + } + + foreach ( $_downloads as $download ) { + $downloads[] = $download; + } + } + } + } + } + + return $downloads; + } +} diff --git a/includes/early-renewal/class-wcs-early-renewal-modal-handler.php b/includes/early-renewal/class-wcs-early-renewal-modal-handler.php index 32cb020..0b04f42 100644 --- a/includes/early-renewal/class-wcs-early-renewal-modal-handler.php +++ b/includes/early-renewal/class-wcs-early-renewal-modal-handler.php @@ -178,6 +178,10 @@ class WCS_Early_Renewal_Modal_Handler { $user_id = ! empty( $user_id ) ? absint( $user_id ) : get_current_user_id(); $subscription = wcs_get_subscription( $subscription ); + if ( ! $subscription ) { + return false; + } + if ( ! WCS_Early_Renewal_Manager::is_early_renewal_via_modal_enabled() || ! wcs_can_user_renew_early( $subscription, $user_id ) ) { return false; } diff --git a/includes/gifting/class-wcs-gifting.php b/includes/gifting/class-wcs-gifting.php index 25c4018..fc9188c 100644 --- a/includes/gifting/class-wcs-gifting.php +++ b/includes/gifting/class-wcs-gifting.php @@ -468,7 +468,7 @@ class WCS_Gifting { tags, 3$ plugin name, 4$ required plugin version, 5$-6$: opening and closing link tags, leads to plugins.php in admin, 7$: line break, 8$-9$ Opening and closing small tags. - printf( esc_html__( '%1$sWooCommerce Subscriptions Gifting Membership integration is inactive.%2$s In order to integrate with WooCommerce Memberships, WooCommerce Subscriptions Gifting requires %3$s %4$s or newer. %5$sPlease update »%6$s %7$s%8$sNote: All other WooCommerce Subscriptions Gifting features will remain available, however purchasing membership plans for recipients will fail to grant the membership to the gift recipient.%9$s', 'woocommerce-subscriptions' ), '', '', esc_html( $plugin_name ), esc_html( $required_version ), '', '', '
', '', '' ); + printf( esc_html__( '%1$sWooCommerce Subscriptions Gifting Membership integration is inactive.%2$s In order to integrate with WooCommerce Memberships, WooCommerce Subscriptions Gifting requires %3$s %4$s or newer. %5$sPlease update »%6$s %7$s%8$sNote: All other WooCommerce Subscriptions Gifting features will remain available, however purchasing membership plans for recipients will fail to grant the membership to the gift recipient.%9$s', 'woocommerce-subscriptions' ), '', '', esc_html( $plugin_name ), esc_html( $required_version ), '', '', '
', '', '' ); } else { // translators: 1$-2$: opening and closing tags, 3$ plugin name, 4$ required plugin version, 5$-6$: opening and closing link tags, leads to plugins.php in admin. printf( esc_html__( '%1$sWooCommerce Subscriptions Gifting is inactive.%2$s This version of WooCommerce Subscriptions Gifting requires %3$s %4$s or newer. %5$sPlease update »%6$s', 'woocommerce-subscriptions' ), '', '', esc_html( $plugin_name ), esc_html( $required_version ), '', '' ); @@ -654,20 +654,17 @@ class WCS_Gifting { * Retrieve the recipient user ID from a subscription. * * @param WC_Subscription $subscription Subscription object. + * * @return string The recipient's user ID. Returns an empty string if there is no recipient set. */ public static function get_recipient_user( $subscription ) { - $recipient_user_id = ''; - - if ( method_exists( $subscription, 'get_meta' ) ) { - if ( $subscription->meta_exists( '_recipient_user' ) ) { - $recipient_user_id = $subscription->get_meta( '_recipient_user' ); - } - } else { // WC < 3.0. - $recipient_user_id = $subscription->recipient_user; + // There may be cases, especially when emails are being previewed in the customizer, where we receive something + // other than a WC_Subscription object. + if ( $subscription instanceof WC_Subscription && $subscription->meta_exists( '_recipient_user' ) ) { + return $subscription->get_meta( '_recipient_user' ); } - return $recipient_user_id; + return ''; } /** @@ -677,8 +674,9 @@ class WCS_Gifting { * @param int $user_id The user ID of the user to set as the recipient on the subscription. * @param string $save Whether to save the data or not, 'save' to save the data, otherwise it won't be saved. * @param int $meta_id The meta ID of existing meta data if you wish to overwrite an existing recipient meta value. + * @param WC_Order $order Order object. */ - public static function set_recipient_user( &$subscription, $user_id, $save = 'save', $meta_id = 0 ) { + public static function set_recipient_user( &$subscription, $user_id, $save = 'save', $meta_id = 0, ?WC_Order $order = null ) { $current_user_id = absint( self::get_recipient_user( $subscription ) ); $subscription->recipient_user = $user_id; @@ -690,7 +688,9 @@ class WCS_Gifting { $gifting_subcription_item = reset( $gifting_subscription_items ); if ( ! empty( $gifting_subcription_item ) ) { - $order = wc_get_order( $subscription->get_parent_id() ); + if ( ! $order ) { + $order = wc_get_order( $subscription->get_parent_id() ); + } foreach ( $order->get_items() as $order_item ) { if ( $order_item->get_meta( '_wcsg_cart_key' ) === $gifting_subcription_item->get_meta( '_wcsg_cart_key' ) ) { $order_item->add_meta_data( 'wcsg_recipient', 'wcsg_recipient_id_' . $user_id, true ); diff --git a/includes/gifting/class-wcsg-admin.php b/includes/gifting/class-wcsg-admin.php index 9ee2cc8..e57f629 100644 --- a/includes/gifting/class-wcsg-admin.php +++ b/includes/gifting/class-wcsg-admin.php @@ -32,7 +32,7 @@ class WCSG_Admin { add_filter( 'woocommerce_order_items_meta_get_formatted', __CLASS__ . '::remove_recipient_order_item_meta', 1, 1 ); - add_filter( 'woocommerce_subscription_settings', __CLASS__ . '::add_settings', 10, 1 ); + add_filter( 'woocommerce_subscription_settings', __CLASS__ . '::add_settings' ); if ( wcsg_is_wc_subscriptions_pre( '2.3.5' ) ) { add_filter( 'request', __CLASS__ . '::request_query', 11, 1 ); @@ -112,7 +112,12 @@ class WCSG_Admin { if ( 'order_title' === $column && WCS_Gifting::is_gifted_subscription( $subscription ) ) { - $recipient_id = WCS_Gifting::get_recipient_user( $subscription ); + $recipient_id = WCS_Gifting::get_recipient_user( $subscription ); + + if ( ! $recipient_id ) { + return $column_content; + } + $recipient_user = get_userdata( $recipient_id ); $recipient_name = ''; @@ -172,50 +177,52 @@ class WCSG_Admin { * @return array $settings New set of settings. */ public static function add_settings( $settings ) { - - return array_merge( - $settings, + $gifting_settings = array( array( - array( - 'name' => __( 'Gifting', 'woocommerce-subscriptions' ), - 'type' => 'title', - 'id' => self::$option_prefix, + 'name' => __( 'Gifting', 'woocommerce-subscriptions' ), + 'type' => 'title', + 'id' => self::$option_prefix, + ), + array( + 'name' => __( 'Enable gifting', 'woocommerce-subscriptions' ), + 'desc' => __( 'Allow shoppers to gift a subscription', 'woocommerce-subscriptions' ), + 'id' => self::$option_prefix . '_enable_gifting', + 'default' => 'no', + 'type' => 'checkbox', + 'row_class' => 'enable-gifting', + ), + array( + 'name' => '', + 'desc' => __( 'You can override this global setting on each product.', 'woocommerce-subscriptions' ), + 'id' => self::$option_prefix . '_default_option', + 'default' => 'disabled', + 'type' => 'radio', + 'desc_at_end' => true, + 'row_class' => 'gifting-radios', + 'options' => array( + 'enabled' => __( 'Enabled for all products', 'woocommerce-subscriptions' ), + 'disabled' => __( 'Disabled for all products', 'woocommerce-subscriptions' ), ), - array( - 'name' => __( 'Enable gifting', 'woocommerce-subscriptions' ), - 'desc' => __( 'Allow shoppers to gift a subscription', 'woocommerce-subscriptions' ), - 'id' => self::$option_prefix . '_enable_gifting', - 'default' => 'no', - 'type' => 'checkbox', - 'row_class' => 'enable-gifting', - ), - array( - 'name' => '', - 'desc' => __( 'You can override this global setting on each product.', 'woocommerce-subscriptions' ), - 'id' => self::$option_prefix . '_default_option', - 'default' => 'disabled', - 'type' => 'radio', - 'desc_at_end' => true, - 'row_class' => 'gifting-radios', - 'options' => array( - 'enabled' => __( 'Enabled for all products', 'woocommerce-subscriptions' ), - 'disabled' => __( 'Disabled for all products', 'woocommerce-subscriptions' ), - ), - ), - array( - 'name' => __( 'Gifting Checkbox Text', 'woocommerce-subscriptions' ), - 'desc' => __( 'This is what shoppers will see in the product page and cart.', 'woocommerce-subscriptions' ), - 'id' => self::$option_prefix . '_gifting_checkbox_text', - 'default' => __( 'This is a gift', 'woocommerce-subscriptions' ), - 'type' => 'text', - 'row_class' => 'gifting-checkbox-text', - ), - array( - 'type' => 'sectionend', - 'id' => self::$option_prefix, - ), - ) + ), + array( + 'name' => __( 'Gifting Checkbox Text', 'woocommerce-subscriptions' ), + 'desc' => __( 'This is what shoppers will see in the product page and cart.', 'woocommerce-subscriptions' ), + 'id' => self::$option_prefix . '_gifting_checkbox_text', + 'default' => __( 'This is a gift', 'woocommerce-subscriptions' ), + 'type' => 'text', + 'row_class' => 'gifting-checkbox-text', + ), + array( + 'type' => 'sectionend', + 'id' => self::$option_prefix, + ), ); + + if ( ! WC_Subscriptions_Admin::insert_setting_after( $settings, WC_Subscriptions_Admin::$option_prefix . '_renewal_options', $gifting_settings, 'multiple_settings', 'sectionend' ) ) { + return array_merge( $settings, $gifting_settings ); + } + + return $settings; } /** @@ -277,9 +284,12 @@ class WCSG_Admin { $user_string = ''; $user_id = ''; if ( WCS_Gifting::is_gifted_subscription( $subscription ) ) { - $user_id = WCS_Gifting::get_recipient_user( $subscription ); - $user = get_user_by( 'id', $user_id ); - $user_string = esc_html( $user->display_name ) . ' (#' . absint( $user->ID ) . ' – ' . esc_html( $user->user_email ); + $user_id = WCS_Gifting::get_recipient_user( $subscription ); + + if ( $user_id ) { + $user = get_user_by( 'id', $user_id ); + $user_string = esc_html( $user->display_name ) . ' (#' . absint( $user->ID ) . ' – ' . esc_html( $user->user_email ); + } } if ( is_callable( array( 'WCS_Select2', 'render' ) ) ) { diff --git a/includes/gifting/class-wcsg-email.php b/includes/gifting/class-wcsg-email.php index 8c88179..94fd605 100644 --- a/includes/gifting/class-wcsg-email.php +++ b/includes/gifting/class-wcsg-email.php @@ -79,11 +79,6 @@ class WCSG_Email { * Hooks up all of WCS Gifting emails after the WooCommerce object is constructed. */ public static function hook_email() { - - add_action( 'woocommerce_created_customer', __CLASS__ . '::maybe_remove_wc_new_customer_email', 9, 2 ); - add_action( 'woocommerce_created_customer', __CLASS__ . '::send_new_recipient_user_email', 10, 3 ); - add_action( 'woocommerce_created_customer', __CLASS__ . '::maybe_reattach_wc_new_customer_email', 11, 2 ); - add_action( 'subscriptions_activated_for_order', __CLASS__ . '::maybe_send_recipient_order_emails', 11, 1 ); $renewal_notification_actions = array( @@ -154,50 +149,6 @@ class WCSG_Email { } } - /** - * If a cart item contains recipient data matching the new customer, dont send the core WooCommerce new customer email. - * - * @param int $customer_id The ID of the new customer being created. - * @param array $new_customer_data Array of data associated to the new customer. - */ - public static function maybe_remove_wc_new_customer_email( $customer_id, $new_customer_data ) { - - if ( ! WC()->cart || ! WC()->cart->cart_contents ) { - return; - } - - foreach ( WC()->cart->cart_contents as $key => $item ) { - if ( ! empty( $item['wcsg_gift_recipients_email'] ) ) { - if ( $item['wcsg_gift_recipients_email'] == $new_customer_data['user_email'] ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison - remove_action( current_filter(), array( 'WC_Emails', 'send_transactional_email' ) ); - break; - } - } - } - } - - /** - * If a cart item contains recipient data matching the new customer, reattach the core WooCommerce new customer email. - * - * @param int $customer_id The ID of the new customer being created. - * @param array $new_customer_data Array of data associated to the new customer. - */ - public static function maybe_reattach_wc_new_customer_email( $customer_id, $new_customer_data ) { - - if ( ! WC()->cart || ! WC()->cart->cart_contents ) { - return; - } - - foreach ( WC()->cart->cart_contents as $key => $item ) { - if ( ! empty( $item['wcsg_gift_recipients_email'] ) ) { - if ( $item['wcsg_gift_recipients_email'] == $new_customer_data['user_email'] ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison - add_action( current_filter(), array( 'WC_Emails', 'send_transactional_email' ) ); - break; - } - } - } - } - /** * Generates purchaser new recipient user email. * @@ -217,28 +168,6 @@ class WCSG_Email { } } - /** - * If a cart item contains recipient data matching the new customer, init the mailer and call the notification for new recipient customers. - * - * @param int $customer_id The ID of the new customer being created. - * @param array $new_customer_data Recipient's user data. - * @param bool $password_generated Whether the password has been generated for the customer. - */ - public static function send_new_recipient_user_email( $customer_id, $new_customer_data, $password_generated ) { - if ( ! WC()->cart || ! WC()->cart->cart_contents ) { - return; - } - - foreach ( WC()->cart->cart_contents as $key => $item ) { - if ( isset( $item['wcsg_gift_recipients_email'] ) ) { - if ( $item['wcsg_gift_recipients_email'] === $new_customer_data['user_email'] ) { - self::generate_new_recipient_user_email( get_current_user_id(), $customer_id ); - break; - } - } - } - } - /** * This will get the necessary data to resend the new recipient new email. * @@ -457,15 +386,34 @@ class WCSG_Email { } /** - * If a cart item contains recipient data matching the new customer, init the mailer and call the notification for new recipient customers. - * - * @param int $customer_id The ID of the new customer being created. - * @param array $new_customer_data Customer data. - * @param bool $password_generated Whether the password has been generated for the customer. - * @deprecated 2.0 + * Hooks into the WooCommerce created customer action to prevent sending the core WooCommerce new customer email and send the Gifting new recipient user email instead. */ - public static function send_new_recient_user_email( $customer_id, $new_customer_data, $password_generated ) { - _deprecated_function( __METHOD__, '2.0.0', __CLASS__ . '::send_new_recipient_user_email()' ); - self::send_new_recipient_user_email( $customer_id, $new_customer_data, $password_generated ); + public static function use_gifting_new_account_email() { + add_action( 'woocommerce_created_customer', __CLASS__ . '::remove_wc_new_customer_email', 9, 0 ); + add_action( 'woocommerce_created_customer', __CLASS__ . '::send_new_recipient_user_email', 10, 1 ); + add_action( 'woocommerce_created_customer', __CLASS__ . '::reattach_wc_new_customer_email', 11, 0 ); + } + + /** + * Prevent sending the core WooCommerce new customer email. + */ + public static function remove_wc_new_customer_email() { + remove_action( current_filter(), array( 'WC_Emails', 'send_transactional_email' ) ); + } + + /** + * Sends the Gifting new recipient user email. Overriding the core WooCommerce new customer email. + * + * @param int $customer_id The ID of the new customer being created. + */ + public static function send_new_recipient_user_email( $customer_id ) { + self::generate_new_recipient_user_email( get_current_user_id(), $customer_id ); + } + + /** + * Reattaches the core WooCommerce new customer email after sending the gifting new account email. + */ + public static function reattach_wc_new_customer_email() { + add_action( current_filter(), array( 'WC_Emails', 'send_transactional_email' ) ); } } diff --git a/includes/gifting/class-wcsg-recipient-management.php b/includes/gifting/class-wcsg-recipient-management.php index ee90c27..ccfa113 100644 --- a/includes/gifting/class-wcsg-recipient-management.php +++ b/includes/gifting/class-wcsg-recipient-management.php @@ -50,8 +50,8 @@ class WCSG_Recipient_Management { add_action( 'woocommerce_subscription_status_updated', __CLASS__ . '::maybe_update_recipient_role', 10, 2 ); // Hooked onto priority 8 for compatibility with WooCommerce Memberships. - add_action( 'woocommerce_order_status_completed', __CLASS__ . '::maybe_create_recipient', 8 ); - add_action( 'woocommerce_order_status_processing', __CLASS__ . '::maybe_create_recipient', 8 ); + add_action( 'woocommerce_order_status_completed', __CLASS__ . '::maybe_create_recipient', 8, 2 ); + add_action( 'woocommerce_order_status_processing', __CLASS__ . '::maybe_create_recipient', 8, 2 ); if ( wcsg_is_woocommerce_pre( '3.0' ) ) { add_action( 'woocommerce_add_order_item_meta', __CLASS__ . '::maybe_add_recipient_order_item_meta', 10, 2 ); @@ -619,12 +619,13 @@ class WCSG_Recipient_Management { * When orders are processed/completed, create new recipients and attach shipping information to gifted subscriptions. * * @param int $order_id Order ID. + * @param WC_Order $order Order object. */ - public static function maybe_create_recipient( $order_id ) { + public static function maybe_create_recipient( $order_id, ?WC_Order $order = null ) { $subscriptions = wcs_get_subscriptions_for_order( $order_id ); foreach( $subscriptions as $subscription ) { - self::maybe_create_recipient_and_attach_shipping_information( $subscription ); + self::maybe_create_recipient_and_attach_shipping_information( $subscription, $order ); } } @@ -632,8 +633,9 @@ class WCSG_Recipient_Management { * Maybe create a recipient user and attach shipping information to a subscription. * * @param WC_Subscription $subscription The subscription object. + * @param WC_Order $order Order object. */ - public static function maybe_create_recipient_and_attach_shipping_information( $subscription ) { + public static function maybe_create_recipient_and_attach_shipping_information( $subscription, ?WC_Order $order = null ) { $recipient_user_email_address = $subscription->get_meta( '_recipient_user_email_address' ); if ( ! $recipient_user_email_address ) { @@ -644,6 +646,7 @@ class WCSG_Recipient_Management { // Create a new user if the recipient's email doesn't already exist. if ( ! $recipient_user_id ) { + WCSG_Email::use_gifting_new_account_email(); $recipient_user_id = WCS_Gifting::create_recipient_user( $recipient_user_email_address ); } @@ -651,7 +654,7 @@ class WCSG_Recipient_Management { return; } - WCS_Gifting::set_recipient_user( $subscription, $recipient_user_id ); + WCS_Gifting::set_recipient_user( $subscription, $recipient_user_id, 'save', 0, $order ); $subscription->set_shipping_first_name( get_user_meta( $recipient_user_id, 'shipping_first_name', true ) ); $subscription->set_shipping_last_name( get_user_meta( $recipient_user_id, 'shipping_last_name', true ) ); @@ -665,14 +668,4 @@ class WCSG_Recipient_Management { $subscription->save(); } - - /** - * Attach WooCommerce version dependent hooks - * - * @since 7.8.0 - Originally implemented in WooCommerce Subscriptions Gifting 1.0.1. - * @deprecated 2.0.0 - */ - public static function attach_dependant_hooks() { - _deprecated_function( __METHOD__, '2.0.0', __CLASS__ . '::init()' ); - } } diff --git a/includes/payment-retry/class-wcs-retry-manager.php b/includes/payment-retry/class-wcs-retry-manager.php index c61368d..603de2b 100644 --- a/includes/payment-retry/class-wcs-retry-manager.php +++ b/includes/payment-retry/class-wcs-retry-manager.php @@ -47,6 +47,12 @@ class WCS_Retry_Manager { self::$setting_id = WC_Subscriptions_Admin::$option_prefix . '_enable_retry'; self::$admin = new WCS_Retry_Admin( self::$setting_id ); + // Show admin notice if the retry table is missing. + add_action( 'admin_notices', array( __CLASS__, 'maybe_show_missing_table_notice' ) ); + + // Add debug tools to the WooCommerce > Status > Tools administration screen. + add_filter( 'woocommerce_debug_tools', array( __CLASS__, 'add_retry_manager_debug_tools' ) ); + if ( self::is_retry_enabled() ) { WCS_Retry_Email::init(); @@ -525,4 +531,88 @@ class WCS_Retry_Manager { public static function init_store() { self::store()->init(); } + + /** + * Check if the payment retry table exists. + * + * @return bool True if the table exists, false otherwise. + */ + public static function retry_table_exists(): bool { + global $wpdb; + + $table_name = $wpdb->prefix . 'wcs_payment_retries'; + + return $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ) === $table_name; + } + + /** + * Show an admin notice if the retry table is missing. + * + * @return void + */ + public static function maybe_show_missing_table_notice() { + if ( + ! current_user_can( 'manage_woocommerce' ) || + ! self::is_retry_enabled() || + self::retry_table_exists() + ) { + return; + } + + // Generate the URL to the debug tool. + $recreate_url = wp_nonce_url( + admin_url( 'admin.php?page=wc-status&tab=tools&action=retry_manager' ), + 'debug_action' + ); + + $message = sprintf( + /* translators: %s: URL to recreate the table */ + __( 'The WooCommerce Subscriptions payment retry table is missing. This may affect the automatic payment retry functionality. Click here to recreate the table.', 'woocommerce-subscriptions' ), + esc_url( $recreate_url ) + ); + + wcs_add_admin_notice( $message, 'error' ); + } + + /** + * Add retry manager debug tools to the WooCommerce > Status > Tools administration screen. + * + * @param array $tools The array of tools. + * @return array The array of tools. + */ + public static function add_retry_manager_debug_tools( $tools ) { + if ( ! self::is_retry_enabled() ) { + return $tools; + } + + $tools['retry_manager'] = [ + 'name' => __( 'Recreate subscriptions payment retry table', 'woocommerce-subscriptions' ), + 'button' => __( 'Recreate', 'woocommerce-subscriptions' ), + 'desc' => __( 'This tool will recreate the subscription payment retry table if it is missing.', 'woocommerce-subscriptions' ), + 'callback' => array( __CLASS__, 'recreate_payment_retry_table' ), + ]; + + return $tools; + } + + /** + * Recreate the payment retry table. + * + * @return string Informative string to show after the tool is triggered in UI. + */ + public static function recreate_payment_retry_table(): string { + // Check if the table already exists. + if ( self::retry_table_exists() ) { + return __( 'The payment retry table already exists.', 'woocommerce-subscriptions' ); + } + + // Create the table. + if ( ! self::$table_maker ) { + self::$table_maker = new WCS_Retry_Table_Maker(); + } + + self::$table_maker->recreate_tables(); + + return __( 'Payment retry table has been successfully created.', 'woocommerce-subscriptions' ); + } } diff --git a/includes/switching/class-wc-subscriptions-switcher.php b/includes/switching/class-wc-subscriptions-switcher.php index 1891163..a4fdc33 100644 --- a/includes/switching/class-wc-subscriptions-switcher.php +++ b/includes/switching/class-wc-subscriptions-switcher.php @@ -1211,7 +1211,7 @@ class WC_Subscriptions_Switcher { public static function cart_contains_switches( $item_action = 'switch' ) { $subscription_switches = []; - if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || false == DOING_AJAX ) ) { + if ( is_admin() && ! wp_doing_ajax() ) { return false; } @@ -1312,7 +1312,12 @@ class WC_Subscriptions_Switcher { return; } - $subscription = wcs_get_subscription( $cart_item_data['subscription_switch']['subscription_id'] ); + $subscription = wcs_get_subscription( $cart_item_data['subscription_switch']['subscription_id'] ); + + if ( ! $subscription ) { + return; + } + $existing_item = wcs_get_order_item( $cart_item_data['subscription_switch']['item_id'], $subscription ); $cart_item = WC()->cart->get_cart_item( $cart_item_key ); @@ -1360,8 +1365,13 @@ class WC_Subscriptions_Switcher { } $subscription = wcs_get_subscription( absint( $_GET['switch-subscription'] ) ); - $item_id = absint( $_GET['item'] ); - $item = wcs_get_order_item( $item_id, $subscription ); + + if ( ! $subscription ) { + throw new Exception( __( 'The subscription may have been deleted.', 'woocommerce-subscriptions' ) ); + } + + $item_id = absint( $_GET['item'] ); + $item = wcs_get_order_item( $item_id, $subscription ); // Prevent switching to non-subscription product if ( ! WC_Subscriptions_Product::is_subscription( $product_id ) ) { @@ -1438,6 +1448,10 @@ class WC_Subscriptions_Switcher { $subscription = wcs_get_subscription( absint( $_GET['switch-subscription'] ) ); + if ( ! $subscription ) { + throw new Exception( __( 'The subscription may have been deleted.', 'woocommerce-subscriptions' ) ); + } + // Requesting a switch for someone elses subscription if ( ! current_user_can( 'switch_shop_subscription', $subscription->get_id() ) ) { wc_add_notice( __( 'You can not switch this subscription. It appears you do not own the subscription.', 'woocommerce-subscriptions' ), 'error' ); @@ -1983,6 +1997,10 @@ class WC_Subscriptions_Switcher { // Subscription objects hold an internal cache of line items so we need to get an updated subscription object after changing the line item types directly in the database. $subscription = wcs_get_subscription( $subscription_id ); + if ( ! $subscription ) { + continue; + } + if ( ! empty( $add_note ) ) { $subscription->add_order_note( $add_note ); } @@ -2056,7 +2074,11 @@ class WC_Subscriptions_Switcher { $subscription->save(); // We just changed above the type of some items related to this subscription, so we need to reload it to get the newest items - wcs_get_subscription( $subscription->get_id() )->calculate_totals(); + $refreshed_subscription = wcs_get_subscription( $subscription->get_id() ); + + if ( $refreshed_subscription ) { + $refreshed_subscription->calculate_totals(); + } } } @@ -2102,6 +2124,10 @@ class WC_Subscriptions_Switcher { $subscription = wcs_get_subscription( $cart_item['subscription_switch']['subscription_id'] ); + if ( ! $subscription ) { + continue; + } + $is_manual_subscription = $subscription->is_manual(); // Check for $0 / period to a non-zero $ / period and manual subscription @@ -2546,6 +2572,10 @@ class WC_Subscriptions_Switcher { $subscription = wcs_get_subscription( $cart_item['subscription_switch']['subscription_id'] ); + if ( ! $subscription ) { + continue; + } + if ( ! self::is_single_item_subscription( $subscription ) && ( self::has_different_length( $recurring_cart, $subscription ) || @@ -2607,6 +2637,11 @@ class WC_Subscriptions_Switcher { } $subscription = wcs_get_subscription( $cart_item['subscription_switch']['subscription_id'] ); + + if ( ! $subscription ) { + continue; + } + $switch_order = $subscription->get_last_order( 'all', 'switch' ); if ( empty( $switch_order ) ) { diff --git a/languages/woocommerce-subscriptions.pot b/languages/woocommerce-subscriptions.pot index 459bcaa..060df6e 100644 --- a/languages/woocommerce-subscriptions.pot +++ b/languages/woocommerce-subscriptions.pot @@ -2,21 +2,20 @@ # This file is distributed under the GNU General Public License v3.0. msgid "" msgstr "" -"Project-Id-Version: WooCommerce Subscriptions 8.0.0\n" +"Project-Id-Version: WooCommerce Subscriptions 8.1.0\n" "Report-Msgid-Bugs-To: https://woocommerce.com/contact-us\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2025-10-15T04:57:29+00:00\n" +"POT-Creation-Date: 2025-11-13T13:50:53+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.12.0\n" -"X-Domain: woocommerce-subscriptions\n" +"X-Domain: target-repo\n" #. Plugin Name of the plugin #: woocommerce-subscriptions.php -#: includes/core/privacy/class-wcs-privacy.php:49 msgid "WooCommerce Subscriptions" msgstr "" @@ -32,8 +31,6 @@ msgstr "" #. Author of the plugin #: woocommerce-subscriptions.php -#: includes/admin/class-wcs-admin-reports.php:158 -#: includes/admin/reports/class-wcs-report-cache-manager.php:273 msgid "WooCommerce" msgstr "" @@ -41,8799 +38,3 @@ msgstr "" #: woocommerce-subscriptions.php msgid "https://woocommerce.com/" msgstr "" - -#. translators: placeholders $1 and $2 are opening tags linking to the WooCommerce documentation on HPOS, and to the Advanced Features settings screen. Placeholder $3 is a closing link () tag. -#: includes/admin/class-wcs-admin-reports.php:82 -#, php-format -msgid "WooCommerce Subscriptions now supports %1$sHigh-Performance Order Storage (HPOS)%3$s - compatibility mode is no longer required to view subscriptions reports. You can disable compatibility mode in your %2$sstore settings%3$s." -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:103 -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:586 -#: includes/api/class-wc-rest-subscriptions-settings.php:29 -#: includes/core/admin/class-wc-subscriptions-admin.php:1054 -#: includes/core/admin/class-wc-subscriptions-admin.php:1207 -#: includes/core/admin/class-wcs-admin-system-status.php:100 -#: includes/core/admin/class-wcs-wc-admin-manager.php:41 -#: includes/core/admin/class-wcs-wc-admin-manager.php:51 -#: includes/core/admin/class-wcs-wc-admin-manager.php:93 -#: includes/core/class-wc-subscriptions-core-plugin.php:396 -#: includes/core/class-wc-subscriptions-core-plugin.php:409 -#: includes/core/class-wcs-query.php:108 -#: includes/core/class-wcs-query.php:133 -#: includes/core/class-wcs-query.php:289 -#: includes/core/privacy/class-wcs-privacy-exporters.php:51 -msgid "Subscriptions" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:106 -msgid "Subscription Events by Date" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:112 -msgid "Upcoming Recurring Revenue" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:118 -msgid "Retention Rate" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:124 -msgid "Subscriptions by Product" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:130 -msgid "Subscriptions by Customer" -msgstr "" - -#: includes/admin/class-wcs-admin-reports.php:140 -msgid "Failed Payment Retries" -msgstr "" - -#: includes/admin/reports/class-wcs-report-cache-manager.php:276 -msgid "Please note: data for this report is cached. The data displayed may be out of date by up to 24 hours. The cache is updated each morning at 4am in your site's timezone." -msgstr "" - -#: includes/admin/reports/class-wcs-report-cache-manager.php:325 -msgctxt "Whether the Report Cache has been enabled" -msgid "Report Cache Enabled" -msgstr "" - -#: includes/admin/reports/class-wcs-report-cache-manager.php:327 -#: includes/core/admin/class-wc-subscriptions-admin.php:1749 -#: includes/core/admin/class-wc-subscriptions-admin.php:1818 -#: includes/core/admin/class-wcs-admin-system-status.php:139 -msgid "Yes" -msgstr "" - -#: includes/admin/reports/class-wcs-report-cache-manager.php:327 -#: includes/core/admin/class-wc-subscriptions-admin.php:1749 -#: includes/core/admin/class-wcs-admin-system-status.php:139 -msgid "No" -msgstr "" - -#: includes/admin/reports/class-wcs-report-cache-manager.php:331 -msgid "Cache Update Failures" -msgstr "" - -#. translators: %d refers to the number of times we have detected cache update failures -#: includes/admin/reports/class-wcs-report-cache-manager.php:334 -#, php-format -msgid "%d failures" -msgid_plural "%d failure" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:95 -#, php-format -msgid "%2$s%1$s signup%3$s subscription signups this month" -msgid_plural "%2$s%1$s signups%3$s subscription signups this month" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-dashboard.php:103 -#, php-format -msgid "%s signup revenue this month" -msgstr "" - -#. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:111 -#, php-format -msgid "%2$s%1$s renewal%3$s subscription renewals this month" -msgid_plural "%2$s%1$s renewals%3$s subscription renewals this month" -msgstr[0] "" -msgstr[1] "" - -#. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-dashboard.php:119 -#, php-format -msgid "%s renewal revenue this month" -msgstr "" - -#. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:127 -#, php-format -msgid "%2$s%1$s cancellation%3$s subscription cancellations this month" -msgid_plural "%2$s%1$s cancellations%3$s subscription cancellations this month" -msgstr[0] "" -msgstr[1] "" - -#: includes/admin/reports/class-wcs-report-retention-rate.php:225 -msgctxt "X axis label on retention rate graph" -msgid "Number of days after sign-up" -msgstr "" - -#: includes/admin/reports/class-wcs-report-retention-rate.php:228 -msgctxt "X axis label on retention rate graph" -msgid "Number of weeks after sign-up" -msgstr "" - -#: includes/admin/reports/class-wcs-report-retention-rate.php:231 -msgctxt "X axis label on retention rate graph" -msgid "Number of months after sign-up" -msgstr "" - -#: includes/admin/reports/class-wcs-report-retention-rate.php:295 -msgid "Unended Subscription Count" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:28 -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:112 -msgid "Customer" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:29 -msgid "Customers" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:47 -msgid "No customers found." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:58 -msgid "Customer Totals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:59 -msgid "Total Subscribers" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:59 -msgid "The number of unique customers with a subscription of any status other than pending or trashed." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:60 -msgid "Active Subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:60 -msgid "The total number of subscriptions with a status of active or pending cancellation." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:61 -msgid "Total Subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:61 -msgid "The total number of subscriptions with a status other than pending or trashed." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:62 -msgid "Total Subscription Orders" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:62 -msgid "The total number of sign-up, switch and renewal orders placed with your store with a paid status (i.e. processing or complete)." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:63 -msgid "Average Lifetime Value" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:65 -msgid "The average value of all customers' sign-up, switch and renewal orders." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:114 -#, php-format -msgid "Active Subscriptions %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:114 -msgid "The number of subscriptions this customer has with a status of active or pending cancellation." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:116 -#, php-format -msgid "Total Subscriptions %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:116 -msgid "The number of subscriptions this customer has with a status other than pending or trashed." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:118 -#, php-format -msgid "Total Subscription Orders %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:118 -msgid "The number of sign-up, switch and renewal orders this customer has placed with your store with a paid status (i.e. processing or complete)." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:120 -#, php-format -msgid "Lifetime Value from Subscriptions %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-customer.php:120 -msgid "The total value of this customer's sign-up, switch and renewal orders." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:28 -#: templates/gifting/emails/recipient-email-order-details.php:16 -msgid "Product" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:29 -msgid "Products" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:39 -msgid "No products found." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:98 -msgid "Subscription Product" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:100 -#, php-format -msgid "Subscription Count %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:100 -msgid "The number of subscriptions that include this product as a line item and have a status other than pending or trashed." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:102 -#, php-format -msgid "Average Recurring Line Total %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:102 -msgid "The average line total for this product on each subscription." -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:104 -#, php-format -msgid "Average Lifetime Value %s" -msgstr "" - -#. translators: %s: help tip. -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:104 -msgid "The average line total on all orders for this product line item." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:225 -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:265 -msgid "subscriptions" -msgstr "" - -#. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:153 -#, php-format -msgid "%s signup revenue in this period" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:154 -msgid "The sum of all subscription parent orders, including other items, fees, tax and shipping." -msgstr "" - -#. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:161 -#, php-format -msgid "%s renewal revenue in this period" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:162 -msgid "The sum of all renewal orders including tax and shipping." -msgstr "" - -#. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:169 -#, php-format -msgid "%s resubscribe revenue in this period" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:170 -msgid "The sum of all resubscribe orders including tax and shipping." -msgstr "" - -#. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:177 -#, php-format -msgid "%s switch revenue in this period" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:178 -msgid "The sum of all switch orders including tax and shipping." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:186 -#, php-format -msgid "%2$s %1$s new subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:200 -msgid "The number of subscriptions created during this period, either by being manually created, imported or a customer placing an order. This includes orders pending payment." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:208 -#, php-format -msgid "%2$s %1$s subscription signups" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:222 -msgid "The number of subscriptions purchased in parent orders created during this period. This represents the new subscriptions created by customers placing an order via checkout." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:230 -#, php-format -msgid "%2$s %1$s subscription resubscribes" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:244 -msgid "The number of resubscribe orders processed during this period." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:252 -#, php-format -msgid "%2$s %1$s subscription renewals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:266 -msgid "The number of renewal orders processed during this period." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:274 -#, php-format -msgid "%2$s %1$s subscription switches" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:288 -msgid "The number of subscriptions upgraded, downgraded or cross-graded during this period." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:296 -#, php-format -msgid "%2$s %1$s subscription cancellations" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:310 -msgid "The number of subscriptions cancelled by the customer or store manager during this period. The pre-paid term may not yet have ended during this period." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:318 -#, php-format -msgid "%2$s %1$s ended subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:332 -msgid "The number of subscriptions which have either expired or reached the end of the prepaid term if it was previously cancelled." -msgstr "" - -#. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:343 -#, php-format -msgid "%2$s %1$s current subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:358 -msgid "The number of subscriptions during this period with an end date in the future and a status other than pending." -msgstr "" - -#. translators: %s: subscription net gain (with percentage). -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:375 -#, php-format -msgid "%s net subscription gain" -msgstr "" - -#. translators: %s: subscription net loss (with percentage). -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:378 -#, php-format -msgid "%s net subscription loss" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:383 -msgid "Change in subscriptions between the start and end of the period." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:399 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:129 -msgid "Year" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:400 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:130 -msgid "Last Month" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:401 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:131 -msgid "This Month" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:402 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:132 -msgid "Last 7 Days" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:445 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:165 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:273 -#: includes/core/admin/meta-boxes/views/html-related-orders-table.php:16 -#: templates/gifting/related-orders.php:23 -#: templates/gifting/related-orders.php:58 -#: templates/myaccount/related-orders.php:27 -#: templates/myaccount/related-orders.php:52 -msgid "Date" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:449 -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:169 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:277 -msgid "Export CSV" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:508 -msgid "Switched subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:524 -msgid "New Subscriptions" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:540 -msgid "Subscriptions signups" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:555 -msgid "Number of resubscribes" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:570 -msgid "Number of renewals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:602 -msgid "Subscriptions Ended" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:618 -msgid "Cancellations" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:633 -msgid "Signup Totals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:653 -msgid "Resubscribe Totals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:673 -msgid "Renewal Totals" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:693 -msgid "Switch Totals" -msgstr "" - -#. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:83 -#, php-format -msgid "%s renewal revenue recovered" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:84 -msgid "The total amount of revenue, including tax and shipping, recovered with the failed payment retry system for renewal orders with a failed payment." -msgstr "" - -#. translators: %s: renewal count. -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:91 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:104 -#, php-format -msgid "%s renewal orders" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:92 -msgid "The number of renewal orders which had a failed payment use the retry system." -msgstr "" - -#. translators: %s: retry count. -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:98 -#, php-format -msgid "%s retry attempts succeeded" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:99 -msgid "The number of renewal payment retries for this period which were able to process the payment which had previously failed one or more times." -msgstr "" - -#. translators: %s: retry count. -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:106 -#, php-format -msgid "%s retry attempts failed" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:107 -msgid "The number of renewal payment retries for this period which did not result in a successful payment." -msgstr "" - -#. translators: %s: retry count. -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:114 -#, php-format -msgid "%s retry attempts pending" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:115 -msgid "The number of renewal payment retries not yet processed." -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:217 -msgid "Successful retries" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:233 -msgid "Failed retries" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:249 -msgid "Pending retries" -msgstr "" - -#: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:265 -msgid "Recovered Renewal Revenue" -msgstr "" - -#. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:97 -#, php-format -msgid "%s renewal income in this period" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:98 -msgid "The sum of all the upcoming renewal orders, including items, fees, tax and shipping, for currently active subscriptions." -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:105 -msgid "The number of upcoming renewal orders, for currently active subscriptions." -msgstr "" - -#. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:111 -#, php-format -msgid "%s average renewal amount" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:243 -msgid "Next 12 Months" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:244 -msgid "Next 30 Days" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:245 -msgid "Next Month" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:246 -msgid "Next 7 Days" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:311 -msgid "Renewals count" -msgstr "" - -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:320 -msgid "Renewals amount" -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:36 -#: includes/api/class-wc-rest-subscription-system-status-manager.php:61 -#: includes/core/class-wcs-staging.php:56 -msgid "staging" -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:36 -#: includes/api/class-wc-rest-subscription-system-status-manager.php:61 -msgid "live" -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:107 -msgid "Subscriptions." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:113 -msgid "WCS debug constant." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:119 -msgid "Subscriptions Mode" -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:125 -msgid "Subscriptions Live Site URL" -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:132 -msgid "Subscriptions broken down by status." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:141 -msgid "Whether the Report Cache is enabled." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:147 -msgid "Number of report cache failures." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:153 -msgid "Subscriptions by Payment Gateway." -msgstr "" - -#: includes/api/class-wc-rest-subscription-system-status-manager.php:162 -msgid "Payment Gateway Feature Support." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:180 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:164 -msgid "Invalid subscription ID." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:186 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:170 -#, php-format -msgid "Failed to load subscription object with the ID %d." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:233 -#: includes/api/class-wc-rest-subscriptions-controller.php:632 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:545 -msgid "Invalid order ID." -msgstr "" - -#. translators: %d is the order ID. -#: includes/api/class-wc-rest-subscriptions-controller.php:242 -#: includes/api/class-wc-rest-subscriptions-controller.php:638 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:551 -#, php-format -msgid "Failed to load order object with the ID %d." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:413 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:329 -#, php-format -msgid "Subscription dates could not be set. Error message: %s" -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:449 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:371 -msgid "Subscription status." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:452 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:374 -msgid "Where the subscription was created." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:453 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:375 -msgid "Currency the subscription was created with, in ISO format." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:454 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:376 -msgid "The date the subscription was created, in the site's timezone." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:455 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:377 -msgid "The date the subscription was created, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:456 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:378 -msgid "The date the subscription was last modified, in the site's timezone." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:457 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:379 -msgid "The date the subscription was last modified, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:458 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:380 -msgid "User ID who owns the subscription." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:468 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:390 -msgid "The status to transition a subscription to." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:474 -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:349 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:504 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:396 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:188 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:510 -msgid "The number of billing periods between subscription renewals." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:479 -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:354 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:509 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:401 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:181 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:503 -msgid "Billing period for the subscription." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:485 -msgid "Trial period for the subscription." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:491 -msgid "The number of times the subscription has been suspended since the last payment." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:496 -msgid "Whether the subscription requires manual renewal." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:501 -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:360 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:515 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:407 -msgid "Subscription payment details." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:506 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:412 -msgid "Payment method meta and token in a post_meta_key: token format." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:511 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:417 -msgid "Payment method meta and token in a user_meta_key : token format." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:518 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:424 -msgid "The subscription's start date, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:523 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:429 -msgid "The subscription's trial end date, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:528 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:434 -msgid "The subscription's next payment date, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:533 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:439 -msgid "The subscription's cancelled date, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:538 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:444 -msgid "The subscription's end date, as GMT." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:557 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:464 -msgid "Limit result set to subscriptions which have specific statuses." -msgstr "" - -#. translators: placeholder is the payment method ID. -#: includes/api/class-wc-rest-subscriptions-controller.php:601 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:511 -#, php-format -msgid "The %s payment gateway does not support admin changing the payment method." -msgstr "" - -#. translators: 1$: gateway id, 2$: error message -#: includes/api/class-wc-rest-subscriptions-controller.php:618 -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:335 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:403 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:528 -#, php-format -msgid "Subscription payment method could not be set to %1$s with error message: %2$s" -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:642 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:555 -msgid "Order does not have a customer associated with it. Subscriptions require a customer." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-controller.php:646 -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:559 -msgid "Order already has subscriptions associated with it." -msgstr "" - -#: includes/api/class-wc-rest-subscriptions-settings-option-controller.php:83 -msgid "Invalid value type; must be either boolean or array" -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:102 -#: includes/core/wcs-functions.php:140 -msgid "Invalid subscription status given." -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:124 -msgid "You do not have permission to read the subscriptions count" -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:173 -msgid "You do not have permission to create subscriptions" -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:248 -msgid "The requested subscription cannot be edited." -msgstr "" - -#. translators: placeholder is error message -#: includes/api/legacy/class-wc-api-subscriptions.php:276 -#, php-format -msgctxt "API error message when editing the order failed" -msgid "Edit subscription failed with error: %s" -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:314 -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:305 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:365 -msgid "Gateway does not support admin changing the payment method on a Subscription." -msgstr "" - -#. translators: 1$: gateway id, 2$: error message -#: includes/api/legacy/class-wc-api-subscriptions.php:352 -#, php-format -msgid "Subscription payment method could not be set to %1$s and has been set to manual with error message: %2$s" -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:387 -#: includes/core/wcs-functions.php:169 -msgid "Invalid subscription billing interval given. Must be an integer greater than 0." -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:398 -#: includes/core/wcs-functions.php:164 -msgid "Invalid subscription billing period given." -msgstr "" - -#: includes/api/legacy/class-wc-api-subscriptions.php:613 -msgctxt "API response confirming order note deleted from a subscription" -msgid "Permanently deleted subscription note" -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:171 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:292 -msgid "Invalid subscription id." -msgstr "" - -#. translators: placeholder is an error message. -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:241 -#, php-format -msgid "Cannot create subscription: %s." -msgstr "" - -#. translators: placeholder is an error message. -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:286 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:473 -#, php-format -msgid "Updating subscription dates errored with message: %s" -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:365 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:520 -msgid "Payment gateway ID." -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:372 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:527 -msgid "The subscription's start date." -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:377 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:532 -msgid "The subscription's trial date" -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:382 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:537 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:497 -msgid "The subscription's next payment date." -msgstr "" - -#: includes/api/legacy/class-wc-rest-subscriptions-controller.php:387 -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:542 -msgid "The subscription's end date." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:184 -msgid "Customer ID is invalid." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:498 -msgid "The status to transition the subscription to. Unlike the \"status\" param, this will calculate and update the subscription dates." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:547 -msgid "The subscription's original subscription ID if this is a resubscribed subscription." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:553 -msgid "The subscription's resubscribed subscription ID." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:559 -msgid "The date the subscription's latest order was completed, in GMT." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:565 -msgid "The date the subscription's latest order was paid, in GMT." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:571 -msgid "Removed line items data." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:578 -msgid "Item ID." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:584 -msgid "Product name." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:590 -msgid "Product SKU." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:596 -msgid "Product ID." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:601 -msgid "Variation ID, if applicable." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:606 -msgid "Quantity ordered." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:611 -msgid "Tax class of product." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:617 -msgid "Product price." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:623 -msgid "Line subtotal (before discounts)." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:628 -msgid "Line subtotal tax (before discounts)." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:633 -msgid "Line total (after discounts)." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:638 -msgid "Line total tax (after discounts)." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:643 -msgid "Line taxes." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:651 -msgid "Tax rate ID." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:657 -msgid "Tax total." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:663 -msgid "Tax subtotal." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:672 -msgid "Removed line item meta data." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:680 -msgid "Meta key." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:686 -msgid "Meta label." -msgstr "" - -#: includes/api/v1/class-wc-rest-subscriptions-v1-controller.php:692 -msgid "Meta value." -msgstr "" - -#: includes/api/v2/class-wc-rest-subscriptions-v2-controller.php:770 -msgid "The type of order related to the subscription." -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$-4$: link tags, takes to woocommerce plugin on wp.org, 5$-6$: opening and closing link tags, leads to plugins.php in admin -#: includes/class-wc-subscriptions-dependency-manager.php:173 -#, php-format -msgid "%1$sWooCommerce Subscriptions is inactive.%2$s The %3$sWooCommerce plugin%4$s must be active for WooCommerce Subscriptions to work. Please %5$sinstall & activate WooCommerce »%6$s" -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$: minimum supported WooCommerce version, 4$-5$: opening and closing link tags, leads to plugin admin -#: includes/class-wc-subscriptions-dependency-manager.php:176 -#, php-format -msgid "%1$sWooCommerce Subscriptions is inactive.%2$s This version of Subscriptions requires WooCommerce %3$s or newer. Please %4$supdate WooCommerce to version %3$s or newer »%5$s" -msgstr "" - -#. translators: 1-2: opening/closing tags, 3: Subscriptions version. -#: includes/class-wc-subscriptions-plugin.php:68 -#, php-format -msgid "%1$sWarning!%2$s We can see the %1$sWooCommerce Subscriptions Early Renewal%2$s plugin is active. Version %3$s of %1$sWooCommerce Subscriptions%2$s comes with that plugin's functionality packaged into the core plugin. Please deactivate WooCommerce Subscriptions Early Renewal to avoid any conflicts." -msgstr "" - -#: includes/class-wc-subscriptions-plugin.php:72 -msgid "Installed Plugins" -msgstr "" - -#. translators: $1-$2: opening and closing tags, $3-$4: opening and closing tags. -#: includes/class-wc-subscriptions-plugin.php:214 -#, php-format -msgid "%1$sWooCommerce Subscriptions Installed%2$s – %3$sYou're ready to start selling subscriptions!%4$s" -msgstr "" - -#: includes/class-wc-subscriptions-plugin.php:232 -msgid "Add a Subscription Product" -msgstr "" - -#: includes/class-wc-subscriptions-plugin.php:233 -#: includes/core/class-wc-subscriptions-core-plugin.php:577 -#: includes/core/upgrades/templates/wcs-about-2-0.php:35 -#: includes/core/upgrades/templates/wcs-about.php:34 -msgid "Settings" -msgstr "" - -#: includes/class-wcs-auth.php:39 -msgid "View subscriptions" -msgstr "" - -#: includes/class-wcs-auth.php:42 -msgid "Create subscriptions" -msgstr "" - -#: includes/class-wcs-auth.php:45 -msgid "View and manage subscriptions" -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:33 -msgid "Button Text" -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:39 -msgid "Add to Cart Button Text" -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:40 -msgid "A product displays a button with the text \"Add to cart\". You can customise the button text for subscriptions here." -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:44 -#: includes/class-wcs-call-to-action-button-text-manager.php:47 -#: includes/core/class-wc-subscriptions-product.php:1246 -#: includes/core/class-wc-subscriptions-product.php:1278 -msgid "Add to cart" -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:50 -msgid "Place Order Button Text" -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:51 -msgid "Use this field to customise the text displayed on the checkout button when an order contains a subscription." -msgstr "" - -#: includes/class-wcs-call-to-action-button-text-manager.php:55 -#: includes/class-wcs-call-to-action-button-text-manager.php:58 -#: includes/core/class-wc-subscriptions-checkout.php:665 -msgid "Place order" -msgstr "" - -#: includes/class-wcs-customer-suspension-manager.php:32 -msgid "Customer Suspensions" -msgstr "" - -#: includes/class-wcs-customer-suspension-manager.php:33 -msgctxt "there's a number immediately in front of this text" -msgid "suspensions per billing period." -msgstr "" - -#: includes/class-wcs-customer-suspension-manager.php:40 -msgid "Set a maximum number of times a customer can suspend their account for each billing period. For example, for a value of 3 and a subscription billed yearly, if the customer has suspended their account 3 times, they will not be presented with the option to suspend their account until the next year. Store managers will always be able to suspend an active subscription. Set this to 0 to turn off the customer suspension feature completely." -msgstr "" - -#: includes/class-wcs-customer-suspension-manager.php:111 -#: includes/core/admin/class-wcs-admin-post-types.php:1386 -#: includes/gifting/class-wcsg-recipient-management.php:149 -msgid "Suspend" -msgstr "" - -#: includes/class-wcs-drip-downloads-manager.php:64 -#: includes/core/upgrades/templates/wcs-about-2-0.php:108 -msgid "Drip Downloadable Content" -msgstr "" - -#: includes/class-wcs-drip-downloads-manager.php:65 -msgid "Enable dripping for downloadable content on subscription products." -msgstr "" - -#. translators: %s is a line break. -#: includes/class-wcs-drip-downloads-manager.php:70 -#, php-format -msgid "Enabling this grants access to new downloadable files added to a product only after the next renewal is processed.%sBy default, access to new downloadable files added to a product is granted immediately to any customer that has an active subscription with that product." -msgstr "" - -#: includes/class-wcs-limited-recurring-coupon-manager.php:50 -msgid "Active for x payments" -msgstr "" - -#: includes/class-wcs-limited-recurring-coupon-manager.php:51 -msgid "Unlimited payments" -msgstr "" - -#: includes/class-wcs-limited-recurring-coupon-manager.php:52 -msgid "Coupon will be limited to the given number of payments. It will then be automatically removed from the subscription. \"Payments\" also includes the initial subscription payment." -msgstr "" - -#. translators: %1$s is the coupon code, %2$d is the number of payment usages -#: includes/class-wcs-limited-recurring-coupon-manager.php:252 -#, php-format -msgid "Limited use coupon \"%1$s\" removed from subscription. It has been used %2$d time." -msgid_plural "Limited use coupon \"%1$s\" removed from subscription. It has been used %2$d times." -msgstr[0] "" -msgstr[1] "" - -#. translators: %d refers to the number of payments the coupon can be used for. -#: includes/class-wcs-limited-recurring-coupon-manager.php:292 -#, php-format -msgid "Active for %d payment" -msgid_plural "Active for %d payments" -msgstr[0] "" -msgstr[1] "" - -#: includes/class-wcs-limited-recurring-coupon-manager.php:296 -msgid "Active for unlimited payments" -msgstr "" - -#: includes/class-wcs-limited-recurring-coupon-manager.php:388 -#: includes/core/class-wc-subscriptions-coupon.php:1165 -msgid "Sorry, it seems there are no available payment methods which support the recurring coupon you are using. Please contact us if you require assistance or wish to make alternate arrangements." -msgstr "" - -#: includes/class-wcs-manual-renewal-manager.php:31 -msgctxt "option section heading" -msgid "Renewals" -msgstr "" - -#: includes/class-wcs-manual-renewal-manager.php:37 -msgid "Manual Renewal Payments" -msgstr "" - -#: includes/class-wcs-manual-renewal-manager.php:38 -msgid "Accept Manual Renewals" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/class-wcs-manual-renewal-manager.php:43 -#, php-format -msgid "With manual renewals, a customer's subscription is put on-hold until they login and pay to renew it. %1$sLearn more%2$s." -msgstr "" - -#: includes/class-wcs-manual-renewal-manager.php:49 -msgid "Turn off Automatic Payments" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/class-wcs-manual-renewal-manager.php:54 -#, php-format -msgid "If you don't want new subscription purchases to automatically charge renewal payments, you can turn off automatic payments. Existing automatic subscriptions will continue to charge customers automatically. %1$sLearn more%2$s." -msgstr "" - -#: includes/class-wcs-subscriber-role-manager.php:41 -msgid "Roles" -msgstr "" - -#. translators: placeholders are tags -#: includes/class-wcs-subscriber-role-manager.php:44 -#, php-format -msgid "Choose the default roles to assign to active and inactive subscribers. For record keeping purposes, a user account must be created for subscribers. Users with the %1$sadministrator%2$s role, such as yourself, will never be allocated these roles to prevent locking out administrators." -msgstr "" - -#: includes/class-wcs-subscriber-role-manager.php:48 -msgid "Subscriber Default Role" -msgstr "" - -#: includes/class-wcs-subscriber-role-manager.php:49 -msgid "When a subscription is activated, either manually or after a successful purchase, new users will be assigned this role." -msgstr "" - -#: includes/class-wcs-subscriber-role-manager.php:60 -msgid "Inactive Subscriber Role" -msgstr "" - -#: includes/class-wcs-subscriber-role-manager.php:61 -msgid "If a subscriber's subscription is manually cancelled or expires, she will be assigned this role." -msgstr "" - -#: includes/class-wcs-upgrade-notice-manager.php:80 -msgctxt "plugin version number used in admin notice" -msgid "3.1" -msgstr "" - -#: includes/class-wcs-upgrade-notice-manager.php:85 -msgid "v3 REST API endpoint support" -msgstr "" - -#. translators: 1-3: opening/closing tags - link to documentation. -#: includes/class-wcs-upgrade-notice-manager.php:88 -#, php-format -msgid "Webhook and REST API users can now use v3 subscription endpoints. Click here to %1$slearn more%2$s about the REST API and check out the technical API docs %3$shere%2$s." -msgstr "" - -#: includes/class-wcs-upgrade-notice-manager.php:95 -msgid "WooCommerce checkout and cart blocks integration" -msgstr "" - -#. translators: 1-2: opening/closing tags - link to documentation. -#: includes/class-wcs-upgrade-notice-manager.php:98 -#, php-format -msgid "Subscriptions is now compatible with the WooCommerce cart and checkout blocks. You can learn more about the compatibility status of the cart & checkout blocks %1$shere%2$s." -msgstr "" - -#. translators: placeholder is Subscription version string ('3.1') -#: includes/class-wcs-upgrade-notice-manager.php:105 -#, php-format -msgid "Welcome to WooCommerce Subscriptions %s!" -msgstr "" - -#: includes/class-wcs-upgrade-notice-manager.php:112 -#: includes/core/class-wcs-failed-scheduled-action-manager.php:232 -msgid "Learn more" -msgstr "" - -#: includes/class-wcs-webhooks.php:108 -msgid " Subscription created" -msgstr "" - -#: includes/class-wcs-webhooks.php:109 -msgid " Subscription updated" -msgstr "" - -#: includes/class-wcs-webhooks.php:110 -msgid " Subscription deleted" -msgstr "" - -#: includes/class-wcs-webhooks.php:111 -msgid " Subscription switched" -msgstr "" - -#: includes/class-wcs-zero-initial-payment-checkout-manager.php:30 -msgid "$0 Initial Checkout" -msgstr "" - -#: includes/class-wcs-zero-initial-payment-checkout-manager.php:31 -msgid "Allow $0 initial checkout without a payment method." -msgstr "" - -#: includes/class-wcs-zero-initial-payment-checkout-manager.php:35 -msgid "Allow a subscription product with a $0 initial payment to be purchased without providing a payment method. The customer will be required to provide a payment method at the end of the initial period to keep the subscription active." -msgstr "" - -#. translators: 1: relation type, 2: list of valid relation types. -#: includes/core/abstracts/abstract-wcs-related-order-store.php:147 -#, php-format -msgid "Invalid relation type: %1$s. Order relationship type must be one of: %2$s." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:209 -msgid "Simple subscription" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:210 -msgid "Variable subscription" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:231 -msgid "Downloadable" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:232 -msgid "Virtual" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:296 -#: templates/admin/html-variation-price.php:27 -msgid "Choose the subscription price, billing interval and period." -msgstr "" - -#. translators: placeholder is trial period validation message if passed an invalid value (e.g. "Trial period can not exceed 4 weeks") -#: includes/core/admin/class-wc-subscriptions-admin.php:298 -#, php-format -msgctxt "Trial period field tooltip on Edit Product administration screen" -msgid "An optional period of time to wait before charging the first recurring payment. Any sign up fee will still be charged at the outset of the subscription. %s" -msgstr "" - -#. translators: %s: currency symbol. -#. translators: placeholder is a currency symbol / code -#: includes/core/admin/class-wc-subscriptions-admin.php:313 -#: templates/admin/html-variation-price.php:23 -#, php-format -msgid "Subscription price (%s)" -msgstr "" - -#. Translators: %s: formatted example price value. -#. translators: %s the formatted example price value. -#: includes/core/admin/class-wc-subscriptions-admin.php:318 -#: includes/core/admin/class-wc-subscriptions-admin.php:360 -#: templates/admin/html-variation-price.php:33 -#, php-format -msgctxt "example price" -msgid "e.g. %s" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:319 -msgid "Subscription interval" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:325 -#: includes/core/admin/class-wc-subscriptions-admin.php:515 -msgid "Subscription period" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:344 -#: includes/core/admin/class-wc-subscriptions-admin.php:516 -#: templates/admin/html-variation-price.php:53 -msgid "Stop renewing after" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:347 -msgid "Automatically stop renewing the subscription after this length of time. This length is in addition to any free trial or amount of time provided before a synchronised first renewal date." -msgstr "" - -#. translators: %s is a currency symbol / code -#: includes/core/admin/class-wc-subscriptions-admin.php:358 -#: templates/admin/html-variation-price.php:69 -#, php-format -msgid "Sign-up fee (%s)" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:361 -#: templates/admin/html-variation-price.php:72 -msgid "Optionally include an amount to be charged at the outset of the subscription. The sign-up fee will be charged immediately, even if the product has a free trial or the payment dates are synced." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:375 -#: includes/core/class-wc-subscriptions-cart.php:2458 -#: templates/admin/html-variation-price.php:79 -msgid "Free trial" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:378 -#: templates/admin/deprecated/html-variation-price.php:115 -msgid "Subscription Trial Period" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:403 -#: includes/gifting/class-wcsg-admin.php:180 -#: templates/admin/html-variation-price.php:107 -msgid "Gifting" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:407 -#: templates/admin/html-variation-price.php:117 -msgid "Enabled" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:408 -#: templates/admin/html-variation-price.php:118 -msgid "Disabled" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:411 -#: templates/admin/html-variation-price.php:110 -msgid "Allow shoppers to purchase a subscription as a gift." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:449 -msgid "One time shipping" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:450 -msgid "Shipping for subscription products is normally charged on the initial order and all renewal orders. Enable this to only charge shipping once on the initial order. Note: for this setting to be enabled the subscription must not have a free trial or a synced renewal date." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:512 -msgid "Subscription pricing" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:513 -msgid "Subscription sign-up fee" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:514 -msgid "Subscription billing interval" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:517 -msgid "Free trial length" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:518 -msgid "Free trial period" -msgstr "" - -#. translators: %s: subscription status. -#: includes/core/admin/class-wc-subscriptions-admin.php:837 -#, php-format -msgid "Unable to change subscription status to \"%s\". Please assign a customer to the subscription to activate it." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:888 -msgid "Trashing this order will also trash the subscriptions purchased with the order." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:901 -msgid "Enter the new period, either day, week, month or year:" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:902 -msgid "Enter a new length (e.g. 5):" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:903 -msgid "Enter a new interval as a single number (e.g. to charge every 2nd month, enter 2):" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:904 -msgid "Delete all variations without a subscription" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:910 -msgid "An error occurred determining if that variation can be deleted. Please try again." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:911 -msgid "That variation can not be removed because it is associated with active subscriptions. To remove this variation, please cancel and delete the subscriptions for it." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:916 -msgid "" -"You are about to trash one or more orders which contain a subscription.\n" -"\n" -"Trashing the orders will also trash the subscriptions purchased with these orders." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:924 -msgid "" -"WARNING: Bad things are about to happen!\n" -"\n" -"The payment gateway used to purchase this subscription does not support modifying a subscription's details.\n" -"\n" -"Changes to the billing period, recurring discount, recurring tax or recurring total may not be reflected in the amount charged by the payment gateway." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:925 -msgid "You are deleting a subscription item. You will also need to manually cancel and trash the subscription on the Manage Subscriptions screen." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:932 -msgid "" -"Warning: Deleting a user will also delete the user's subscriptions. The user's orders will remain but be reassigned to the 'Guest' user.\n" -"\n" -"Do you want to continue to delete this user and any associated subscriptions?" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:936 -msgid "PayPal Standard has a number of limitations and does not support all subscription features." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:936 -msgid "Because of this, it is not recommended as a payment method for Subscriptions unless it is the only available option for your country." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:939 -msgid "This action cannot be reversed. Are you sure you wish to erase personal data from the selected subscriptions?" -msgstr "" - -#. translators: placeholders are for HTML tags. They are 1$: "

", 2$: "

", 3$: "

", 4$: "", 5$: "", 6$: "", 7$: "", 8$: "

" -#: includes/core/admin/class-wc-subscriptions-admin.php:956 -#, php-format -msgctxt "used in admin pointer script params in javascript as type pointer content" -msgid "%1$sChoose Subscription%2$s%3$sThe WooCommerce Subscriptions extension adds two new subscription product types - %4$sSimple subscription%5$s and %6$sVariable subscription%7$s.%8$s" -msgstr "" - -#. translators: placeholders are for HTML tags. They are 1$: "

", 2$: "

", 3$: "

", 4$: "

" -#: includes/core/admin/class-wc-subscriptions-admin.php:958 -#, php-format -msgctxt "used in admin pointer script params in javascript as price pointer content" -msgid "%1$sSet a Price%2$s%3$sSubscription prices are a little different to other product prices. For a subscription, you can set a billing period, length, sign-up fee and free trial.%4$s" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:984 -msgid "Active subscriber?" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1028 -msgid "Manage Subscriptions" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1032 -#: includes/core/class-wc-subscriptions-core-plugin.php:405 -msgid "Search Subscriptions" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1259 -msgctxt "options section heading" -msgid "Miscellaneous" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1266 -msgid "Mixed Checkout" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1267 -msgid "Allow multiple subscriptions and products to be purchased simultaneously." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1271 -msgid "Allow a subscription product to be purchased with other products and subscriptions in the same transaction." -msgstr "" - -#. translators: placeholder is a number -#. translators: placeholder is a subscription ID. -#: includes/core/admin/class-wc-subscriptions-admin.php:1372 -#: includes/core/admin/class-wc-subscriptions-admin.php:1615 -#, php-format -msgid "We can't find a subscription with ID #%d. Perhaps it was deleted?" -msgstr "" - -#. translators: Placeholders are opening and closing link tags. -#: includes/core/admin/class-wc-subscriptions-admin.php:1465 -#: includes/core/admin/class-wc-subscriptions-admin.php:1527 -#, php-format -msgid "We weren't able to locate the set of report results you requested. Please regenerate the link from the %1$sSubscription Reports screen%2$s." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1583 -msgid "We can't find a paid subscription order for this user." -msgstr "" - -#. translators: placeholders are opening link tag, ID of sub, and closing link tag -#: includes/core/admin/class-wc-subscriptions-admin.php:1622 -#, php-format -msgid "Showing orders for %1$sSubscription %2$s%3$s" -msgstr "" - -#. translators: number of 1$: days, 2$: weeks, 3$: months, 4$: years -#: includes/core/admin/class-wc-subscriptions-admin.php:1645 -#, php-format -msgid "The trial period can not exceed: %1$s, %2$s, %3$s or %4$s." -msgstr "" - -#. translators: placeholder is a time period (e.g. "4 weeks") -#: includes/core/admin/class-wc-subscriptions-admin.php:1650 -#, php-format -msgid "The trial period can not exceed %s." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1675 -msgid "Please log in to your account to view your subscriptions." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1712 -msgid "No subscriptions found for that customer." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1714 -msgid "You do not have permission to view those subscriptions." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1748 -#: includes/core/admin/class-wcs-admin-system-status.php:137 -msgctxt "label that indicates whether debugging is turned on for the plugin" -msgid "WCS_DEBUG" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1754 -#: includes/core/admin/class-wcs-admin-system-status.php:151 -msgctxt "Live or Staging, Label on WooCommerce -> System Status page" -msgid "Subscriptions Mode" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1755 -#: includes/core/admin/class-wcs-admin-system-status.php:153 -msgctxt "refers to staging site" -msgid "Staging" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1755 -#: includes/core/admin/class-wcs-admin-system-status.php:153 -msgctxt "refers to live site" -msgid "Live" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1785 -msgid "Automatic Recurring Payments" -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1818 -msgid "Supports automatic renewal payments." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1899 -msgid "Subscription items can no longer be edited." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1904 -msgid "This subscription is no longer editable because the payment gateway does not allow modification of recurring amounts." -msgstr "" - -#. translators: $1-2: opening and closing tags of a link that takes to Woo marketplace / Stripe product page -#: includes/core/admin/class-wc-subscriptions-admin.php:1923 -#, php-format -msgid "No payment gateways capable of processing automatic subscription payments are enabled. If you would like to process automatic payments, we recommend %1$sWooPayments%2$s." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:1930 -msgid "Recurring Payments" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/admin/class-wc-subscriptions-admin.php:1938 -#, php-format -msgid "Payment gateways which don't support automatic recurring payments can be used to process %1$smanual subscription renewal payments%2$s." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:2059 -msgid "Note that purchasing a subscription still requires an account." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:2073 -msgid "The product type can not be changed because this product is associated with subscriptions." -msgstr "" - -#: includes/core/admin/class-wc-subscriptions-admin.php:2130 -#: includes/core/admin/class-wc-subscriptions-admin.php:2131 -msgid "Allow subscription customers to create an account during checkout" -msgstr "" - -#: includes/core/admin/class-wcs-admin-empty-list-content-manager.php:29 -msgid "No subscriptions found." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:83 -msgctxt "meta box title" -msgid "Subscription Data" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:85 -msgctxt "meta box title" -msgid "Schedule" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:89 -#: includes/core/admin/class-wcs-admin-meta-boxes.php:103 -#: templates/gifting/related-orders.php:15 -msgid "Related Orders" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:174 -msgid "Please enter a start date in the past." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:175 -msgid "Please enter a date at least 2 minutes into the future." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:175 -msgid "Please enter a date at least one hour into the future." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:176 -msgid "Please enter a date after the trial end." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:177 -#: includes/core/admin/class-wcs-admin-meta-boxes.php:178 -msgid "Please enter a date after the start date." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:179 -msgid "Please enter a date before the next payment." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:180 -msgid "Please enter a date after the next payment." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:181 -msgid "Invalid date" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:182 -msgid "" -"Are you sure you want to process a renewal?\n" -"\n" -"This will charge the customer and email them the renewal order (if emails are enabled)." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:198 -msgid "" -"Are you sure you want to retry payment for this renewal order?\n" -"\n" -"This will attempt to charge the customer and send renewal order emails (if emails are enabled)." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:229 -msgid "Process renewal" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:233 -msgid "Create pending renewal order" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:235 -msgid "Create pending parent order" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:239 -msgid "Retry Renewal Payment" -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:252 -msgid "Process renewal order action requested by admin." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:262 -msgid "Create pending renewal order requested by admin action." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:268 -msgid "Pending renewal order was not created, as it was not possible to update the subscription status." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:280 -msgid "Creation of the pending renewal order failed." -msgstr "" - -#. Translators: %1$s opening link tag, %2$s closing link tag. -#: includes/core/admin/class-wcs-admin-meta-boxes.php:301 -#, php-format -msgid "A pending %1$srenewal order%2$s was successfully created!" -msgstr "" - -#. Translators: %1$s opening link tag, %2$s closing link tag. -#: includes/core/admin/class-wcs-admin-meta-boxes.php:313 -#, php-format -msgid "A %1$spending renewal order%2$s was successfully created, but there was a problem setting the payment method. Please review the order." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:349 -msgid "Create pending parent order requested by admin action." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:380 -msgid "Retry renewal payment action requested by admin." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:480 -msgid "This order contains line items with prices above the current product price. To override the product's live price when the customer pays for this order, lock in the manual price increases." -msgstr "" - -#: includes/core/admin/class-wcs-admin-meta-boxes.php:484 -msgid "Lock manual price increases" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:237 -msgid "Search for a product…" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:301 -#: includes/core/admin/class-wcs-admin-post-types.php:332 -msgctxt "an action on a subscription" -msgid "Move to Trash" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:310 -msgctxt "an action on a subscription" -msgid "Restore" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:311 -msgctxt "an action on a subscription" -msgid "Delete Permanently" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:329 -#: includes/core/admin/class-wcs-admin-post-types.php:1774 -msgctxt "an action on a subscription" -msgid "Activate" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:330 -#: includes/core/admin/class-wcs-admin-post-types.php:1775 -msgctxt "an action on a subscription" -msgid "Put on-hold" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:331 -#: includes/core/admin/class-wcs-admin-post-types.php:1387 -#: includes/core/admin/class-wcs-admin-post-types.php:1776 -#: includes/core/class-wc-subscriptions-manager.php:2001 -#: includes/core/wcs-user-functions.php:329 -#: templates/myaccount/related-orders.php:83 -msgctxt "an action on a subscription" -msgid "Cancel" -msgstr "" - -#. translators: placeholder is the number of subscriptions updated -#: includes/core/admin/class-wcs-admin-post-types.php:419 -#, php-format -msgid "%s subscription status changed." -msgid_plural "%s subscription statuses changed." -msgstr[0] "" -msgstr[1] "" - -#. translators: 1$: is the number of subscriptions not updated, 2$: is the error message -#: includes/core/admin/class-wcs-admin-post-types.php:438 -#, php-format -msgid "%1$s subscription could not be updated: %2$s" -msgid_plural "%1$s subscriptions could not be updated: %2$s" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/admin/class-wcs-admin-post-types.php:466 -#: includes/core/admin/meta-boxes/views/html-related-orders-table.php:17 -#: templates/gifting/related-orders.php:24 -#: templates/gifting/related-orders.php:61 -#: templates/myaccount/my-subscriptions.php:22 -#: templates/myaccount/my-subscriptions.php:40 -#: templates/myaccount/related-orders.php:28 -#: templates/myaccount/related-orders.php:55 -#: templates/myaccount/related-subscriptions.php:22 -#: templates/myaccount/related-subscriptions.php:37 -#: templates/myaccount/subscription-details.php:18 -msgid "Status" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:467 -#: includes/core/class-wc-subscriptions-core-plugin.php:397 -#: includes/gifting/class-wcsg-recipient-management.php:556 -#: templates/emails/cancelled-subscription.php:39 -#: templates/emails/expired-subscription.php:24 -#: templates/emails/on-hold-subscription.php:24 -#: templates/gifting/emails/recipient-email-subscriptions-table.php:16 -#: templates/myaccount/my-subscriptions.php:21 -#: templates/myaccount/related-subscriptions.php:21 -msgid "Subscription" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:468 -msgid "Items" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:469 -#: build/index.js:16 -#: build/index.js:19 -#: client/core/recurring-totals/index.js:285 -#: client/core/recurring-totals/index.js:396 -msgid "Total" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:470 -msgid "Start Date" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:471 -msgid "Trial End" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:472 -msgid "Next Payment" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:473 -msgid "Last Order Date" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:474 -msgid "End Date" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:475 -msgctxt "number of orders linked to a subscription" -msgid "Orders" -msgstr "" - -#. translators: placeholder is a subscription ID. -#: includes/core/admin/class-wcs-admin-post-types.php:510 -#, php-format -msgctxt "hash before subscription number" -msgid "#%s" -msgstr "" - -#. translators: Placeholder is a
HTML tag. -#: includes/core/admin/class-wcs-admin-post-types.php:522 -#, php-format -msgid "This subscription couldn't be loaded from the database. %s Click to learn more." -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:560 -msgctxt "meaning billing address" -msgid "Billing:" -msgstr "" - -#. translators: placeholder is customer's billing email -#: includes/core/admin/class-wcs-admin-post-types.php:565 -#, php-format -msgid "Email: %s" -msgstr "" - -#. translators: placeholder is customer's billing phone number -#: includes/core/admin/class-wcs-admin-post-types.php:570 -#, php-format -msgid "Tel: %s" -msgstr "" - -#. translators: $1: is opening link, $2: is subscription order number, $3: is closing link tag, $4: is user's name -#: includes/core/admin/class-wcs-admin-post-types.php:601 -#, php-format -msgctxt "Subscription title on admin table. (e.g.: #211 for John Doe)" -msgid "%1$s#%2$s%3$s for %4$s" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:610 -msgid "Show more details" -msgstr "" - -#. translators: %d: item count. -#: includes/core/admin/class-wcs-admin-post-types.php:631 -#, php-format -msgid "%d item" -msgid_plural "%d items" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is the display name of a payment gateway a subscription was paid by -#. translators: %s: payment method. -#: includes/core/admin/class-wcs-admin-post-types.php:650 -#: includes/core/class-wc-subscription.php:2419 -#, php-format -msgid "Via %s" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:699 -msgid "Y/m/d g:i:s A" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:714 -msgid "Subscription payment overdue.
" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:719 -msgid "This date should be treated as an estimate only. The payment gateway for this subscription controls when payments are processed.
" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1114 -#: includes/core/admin/class-wcs-admin-post-types.php:1117 -#: includes/core/admin/class-wcs-admin-post-types.php:1120 -msgid "Subscription updated." -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1115 -msgid "Custom field updated." -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1116 -msgid "Custom field deleted." -msgstr "" - -#. translators: placeholder is previous post title -#: includes/core/admin/class-wcs-admin-post-types.php:1119 -#, php-format -msgctxt "used in post updated messages" -msgid "Subscription restored to revision from %s" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1121 -msgid "Subscription saved." -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1122 -msgid "Subscription submitted." -msgstr "" - -#. translators: php date string -#: includes/core/admin/class-wcs-admin-post-types.php:1124 -#, php-format -msgid "Subscription scheduled for: %1$s." -msgstr "" - -#. translators: php date string -#: includes/core/admin/class-wcs-admin-post-types.php:1124 -msgctxt "used in \"Subscription scheduled for \"" -msgid "M j, Y @ G:i" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1125 -msgid "Subscription draft updated." -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1168 -msgid "Any Payment Method" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1169 -msgid "None" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1176 -#: includes/core/class-wc-subscription.php:2401 -#: includes/core/class-wcs-change-payment-method-admin.php:173 -msgid "Manual Renewal" -msgstr "" - -#. translators: 1: user display name 2: user ID 3: user email -#: includes/core/admin/class-wcs-admin-post-types.php:1340 -#, php-format -msgid "%1$s (#%2$s – %3$s)" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1347 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:99 -msgid "Search for a customer…" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1385 -#: includes/core/wcs-user-functions.php:311 -#: includes/gifting/class-wcsg-recipient-management.php:154 -#: templates/single-product/add-to-cart/subscription.php:39 -#: templates/single-product/add-to-cart/variable-subscription.php:38 -msgid "Reactivate" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1388 -msgid "Trash" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1389 -msgid "Delete Permanently" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1408 -#: includes/core/class-wc-subscriptions-product.php:797 -msgid "Restore this item from the Trash" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1410 -#: includes/core/class-wc-subscriptions-product.php:798 -msgid "Restore" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1415 -msgid "Move this item to the Trash" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1429 -msgid "Delete this item permanently" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1440 -msgid "Cancel Now" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1506 -msgctxt "Used in order note. Reason why status changed." -msgid "Subscription status changed by bulk edit:" -msgstr "" - -#: includes/core/admin/class-wcs-admin-post-types.php:1624 -msgid "All" -msgstr "" - -#: includes/core/admin/class-wcs-admin-product-import-export-manager.php:32 -msgid "Subscription variations" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:101 -msgid "This section shows any information about Subscriptions." -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:105 -msgid "Store Setup" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:106 -msgid "This section shows general information about the store." -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:110 -msgid "Subscriptions by Payment Gateway" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:111 -msgid "This section shows information about Subscription payment methods." -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:115 -msgid "Payment Gateway Support" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:116 -msgid "This section shows information about payment gateway feature support." -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:168 -msgctxt "Live URL, Label on WooCommerce -> System Status page" -msgid "Subscriptions Live URL" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:181 -msgctxt "Subscriptions-core Version, Label on WooCommerce -> System Status page" -msgid "Subscriptions-core Library Version" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:197 -msgctxt "label for the system status page" -msgid "Subscriptions Template Theme Overrides" -msgstr "" - -#. translators: placeholders are opening/closing tags linking to documentation on outdated templates. -#. Translators: 1) an
tag pointing to a doc on how to fix outdated templates, 2) closing tag. -#: includes/core/admin/class-wcs-admin-system-status.php:207 -#: includes/gifting/class-wcsg-admin-system-status.php:76 -#, php-format -msgid "%1$sLearn how to update%2$s" -msgstr "" - -#. translators: %1$s is the file version, %2$s is the core version -#: includes/core/admin/class-wcs-admin-system-status.php:252 -#: includes/gifting/class-wcsg-admin-system-status.php:119 -#, php-format -msgid "version %1$s is out of date. The core version is %2$s" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:272 -msgctxt "label for the system status page" -msgid "Subscription Statuses" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:293 -msgctxt "label for the system status page" -msgid "WooCommerce Account Connected" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:316 -msgctxt "label for the system status page" -msgid "Active Product Key" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:340 -msgctxt "label for the system status page" -msgid "Other" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:374 -msgctxt "label for the system status page" -msgid "PayPal Reference Transactions Enabled" -msgstr "" - -#: includes/core/admin/class-wcs-admin-system-status.php:402 -msgctxt "label for the system status page" -msgid "Country / State" -msgstr "" - -#: includes/core/admin/class-wcs-wc-admin-manager.php:62 -msgid "Add New" -msgstr "" - -#: includes/core/admin/class-wcs-wc-admin-manager.php:72 -msgid "Edit Subscription" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:274 -#: includes/core/class-wcs-notifications-batch-processor.php:254 -msgid "Background process for updating subscription notifications already started, nothing done." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:279 -msgid "Background process for updating subscription notifications started" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:290 -#: includes/core/class-wcs-notifications-batch-processor.php:269 -msgid "Background process for updating subscription notifications not started, nothing done." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:294 -msgid "Background process for updating subscription notifications stopped" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:308 -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:330 -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:340 -msgid "Regenerate subscription notifications" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:309 -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:341 -msgid "Regenerate notifications" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:313 -msgid "This tool will add notifications to pending, active, and on-hold subscriptions. These updates will occur gradually in the background using Action Scheduler." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:314 -#: templates/emails/email-order-details.php:114 -msgid "Note:" -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:315 -msgid "Notifications are currently turned off. To activate them, check the \"Enable customer renewal reminder notification emails.\" option (via WooCommerce > Settings > Subscriptions > Customer Notifications)." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:317 -msgid "Manage settings." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:331 -msgid "Stop regenerating notifications" -msgstr "" - -#. translators: %1$d=count of total entries needing conversion -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:334 -#, php-format -msgid "Stopping this will halt the background process that adds notifications to pending, active, and on-hold subscriptions. %1$d subscriptions remain to be processed." -msgstr "" - -#: includes/core/admin/debug-tools/class-wcs-notifications-debug-tool-processor.php:342 -msgid "This tool will regenerate notifications to pending, active, and on-hold subscriptions. These updates will occur gradually in the background using Action Scheduler." -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:97 -msgctxt "relation to order" -msgid "Subscription" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:102 -msgctxt "relation to order" -msgid "Initial Subscription" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:113 -msgctxt "relation to order" -msgid "Renewal Order" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:116 -msgctxt "relation to order" -msgid "Parent Order" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:119 -msgctxt "relation to order" -msgid "Resubscribed Subscription" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:119 -msgctxt "relation to order" -msgid "Resubscribe Order" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-related-orders.php:122 -msgctxt "relation to order" -msgid "Unknown Order Type" -msgstr "" - -#. translators: 1$ is a comma-separated list of invalid dates fields like "Start Date", "Next Payment", 2$-3$: opening and closing tags. -#: includes/core/admin/meta-boxes/class-wcs-meta-box-schedule.php:126 -#, php-format -msgid "Some subscription dates could not be updated because they contain invalid values: %2$s%1$s%3$s. Please correct these dates and save the changes." -msgstr "" - -#. translators: placeholder is the ID of the subscription -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:57 -#, php-format -msgctxt "edit subscription header" -msgid "Subscription #%s details" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:63 -msgid "General" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:66 -msgid "Customer:" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:76 -msgid "View other subscriptions →" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:81 -msgid "Profile →" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:108 -msgid "Subscription status:" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:126 -msgid "Parent order: " -msgstr "" - -#. translators: placeholder is an order number. -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:130 -#, php-format -msgid "#%1$s" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:138 -msgid "Parent order:" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:145 -msgid "Select an order…" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:158 -msgid "Billing" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:159 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:257 -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:53 -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:194 -msgid "Edit" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:161 -msgid "Load billing address" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:169 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:171 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:268 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:270 -msgid "Address" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:171 -msgid "No billing address set." -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:191 -#: includes/core/class-wcs-change-payment-method-admin.php:36 -#: includes/core/class-wcs-change-payment-method-admin.php:47 -msgid "Payment method" -msgstr "" - -#. translators: %s: gateway ID. -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:196 -#: includes/core/class-wcs-change-payment-method-admin.php:51 -#, php-format -msgctxt "The gateway ID displayed on the Edit Subscriptions screen when editing payment method." -msgid "Gateway ID: [%s]" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:240 -msgid "Customer change payment method page →" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:242 -msgid "Customer add payment method page →" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:256 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:300 -#: build/index.js:11 -#: client/core/recurring-totals/index.js:177 -msgid "Shipping" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:259 -msgid "Load shipping address" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:260 -msgid "Copy billing address" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:270 -msgid "No shipping address set." -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:292 -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:328 -msgid "Customer Provided Note" -msgstr "" - -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:329 -msgid "Customer's notes about the order" -msgstr "" - -#. translators: %s: parent order number (linked to its details screen). -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:433 -#, php-format -msgctxt "subscription note after linking to a parent order" -msgid "Subscription linked to parent order %s via admin." -msgstr "" - -#. translators: placeholder is error message from the payment gateway or subscriptions when updating the status -#: includes/core/admin/meta-boxes/class-wcs-meta-box-subscription-data.php:448 -#, php-format -msgid "Error updating some information: %s" -msgstr "" - -#. translators: placeholder is an order number. -#: includes/core/admin/meta-boxes/views/html-related-orders-row.php:14 -#, php-format -msgid "Edit order number %s" -msgstr "" - -#. translators: placeholder is an order number. -#. translators: placeholder is an order ID. -#. translators: %s: order number. -#. translators: %s: order ID. -#: includes/core/admin/meta-boxes/views/html-related-orders-row.php:16 -#: includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php:18 -#: includes/core/class-wc-subscriptions-renewal-order.php:156 -#: includes/early-renewal/class-wcs-cart-early-renewal.php:222 -#: includes/early-renewal/wcs-early-renewal-functions.php:136 -#: templates/myaccount/my-subscriptions.php:36 -#: templates/myaccount/related-orders.php:49 -#: templates/myaccount/related-subscriptions.php:34 -#, php-format -msgctxt "hash before order number" -msgid "#%s" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-related-orders-row.php:29 -#: includes/payment-retry/admin/html-retries-table.php:47 -msgid "Unpublished" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-related-orders-table.php:14 -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:188 -#: templates/gifting/related-orders.php:49 -#: templates/myaccount/related-orders.php:46 -msgid "Order Number" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-related-orders-table.php:15 -msgid "Relationship" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-related-orders-table.php:18 -#: templates/gifting/related-orders.php:26 -#: templates/myaccount/my-subscriptions.php:24 -#: templates/myaccount/related-orders.php:29 -#: templates/myaccount/related-subscriptions.php:24 -#: templates/myaccount/subscription-totals-table.php:21 -msgctxt "table heading" -msgid "Total" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:24 -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:77 -msgid "Payment:" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:36 -#: templates/admin/deprecated/html-variation-price.php:57 -msgid "Billing Period" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:46 -msgid "Recurring:" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:65 -msgid "Error:" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:70 -msgid "Timezone:" -msgstr "" - -#: includes/core/admin/meta-boxes/views/html-subscription-schedule.php:70 -msgid "Error: unable to find timezone of your browser." -msgstr "" - -#. Translators: The %1 placeholder is the translated order relationship ("Parent Order"), %2 placeholder is a
HTML tag. -#: includes/core/admin/meta-boxes/views/html-unknown-related-orders-row.php:25 -#, php-format -msgid "This %1$s couldn't be loaded from the database. %1$s Click to learn more." -msgstr "" - -#: includes/core/class-wc-product-subscription.php:73 -msgid "Read more" -msgstr "" - -#. translators: %s: subscription status. -#: includes/core/class-wc-subscription.php:445 -#, php-format -msgid "Unable to change subscription status to \"%s\"." -msgstr "" - -#. translators: 1: subscription status, 2: error message. -#: includes/core/class-wc-subscription.php:568 -#, php-format -msgid "Unable to change subscription status to \"%1$s\". Exception: %2$s" -msgstr "" - -#. translators: 1: old subscription status 2: new subscription status -#: includes/core/class-wc-subscription.php:603 -#, php-format -msgid "Status changed from %1$s to %2$s." -msgstr "" - -#. translators: %s: new order status -#: includes/core/class-wc-subscription.php:617 -#, php-format -msgid "Status set to %s." -msgstr "" - -#: includes/core/class-wc-subscription.php:631 -msgid "Error during subscription status transition." -msgstr "" - -#. translators: placeholder is human time diff (e.g. "3 weeks") -#: includes/core/class-wc-subscription.php:1347 -#: includes/core/class-wc-subscriptions-manager.php:2448 -#, php-format -msgid "In %s" -msgstr "" - -#. translators: placeholder is human time diff (e.g. "3 weeks") -#: includes/core/class-wc-subscription.php:1350 -#: includes/core/wcs-formatting-functions.php:246 -#, php-format -msgid "%s ago" -msgstr "" - -#: includes/core/class-wc-subscription.php:1357 -msgid "Not yet ended" -msgstr "" - -#: includes/core/class-wc-subscription.php:1360 -msgid "Not cancelled" -msgstr "" - -#: includes/core/class-wc-subscription.php:1365 -msgctxt "original denotes there is no date to display" -msgid "-" -msgstr "" - -#: includes/core/class-wc-subscription.php:1529 -msgid "The creation date of a subscription can not be deleted, only updated." -msgstr "" - -#: includes/core/class-wc-subscription.php:1532 -msgid "The start date of a subscription can not be deleted, only updated." -msgstr "" - -#. translators: %s: date type (e.g. "trial_end"). -#: includes/core/class-wc-subscription.php:1537 -#, php-format -msgid "The %s date of a subscription can not be deleted. You must delete the order." -msgstr "" - -#. translators: %d: subscription ID. -#. translators: %d: order ID. -#: includes/core/class-wc-subscription.php:1546 -#: includes/core/class-wc-subscription.php:2897 -#, php-format -msgid "Subscription #%d: " -msgstr "" - -#: includes/core/class-wc-subscription.php:2012 -msgid "Payment status marked complete." -msgstr "" - -#. translators: %d: related order ID -#: includes/core/class-wc-subscription.php:2059 -#, php-format -msgid "Related order #%d failed." -msgstr "" - -#: includes/core/class-wc-subscription.php:2078 -msgid "Subscription Cancelled: maximum number of failed payments reached." -msgstr "" - -#: includes/core/class-wc-subscription.php:2204 -msgid "The \"all\" value for $order_type parameter is deprecated. It was a misnomer, as it did not return resubscribe orders. It was also inconsistent with order type values accepted by wcs_get_subscription_orders(). Use array( \"parent\", \"renewal\", \"switch\" ) to maintain previous behaviour, or \"any\" to receive all order types, including switch and resubscribe." -msgstr "" - -#: includes/core/class-wc-subscription.php:2499 -#: includes/core/wcs-functions.php:892 -msgid "Payment method meta must be an array." -msgstr "" - -#: includes/core/class-wc-subscription.php:2766 -msgid "Invalid format. First parameter needs to be an array." -msgstr "" - -#: includes/core/class-wc-subscription.php:2770 -msgid "Invalid data. First parameter was empty when passed to update_dates()." -msgstr "" - -#: includes/core/class-wc-subscription.php:2777 -msgid "Invalid data. First parameter has a date that is not in the registered date types." -msgstr "" - -#. translators: placeholder is date type (e.g. "end", "next_payment"...) -#: includes/core/class-wc-subscription.php:2832 -#, php-format -msgctxt "appears in an error message if date is wrong format" -msgid "Invalid %s date. The date must be of the format: \"Y-m-d H:i:s\"." -msgstr "" - -#. translators: %s: date type (e.g. "end"). -#: includes/core/class-wc-subscription.php:2865 -#, php-format -msgid "The %s date must occur after the cancellation date." -msgstr "" - -#. translators: %s: date type (e.g. "end"). -#: includes/core/class-wc-subscription.php:2871 -#, php-format -msgid "The %s date must occur after the last payment date." -msgstr "" - -#. translators: %s: date type (e.g. "end"). -#: includes/core/class-wc-subscription.php:2876 -#, php-format -msgid "The %s date must occur after the next payment date." -msgstr "" - -#. translators: %s: date type (e.g. "end"). -#: includes/core/class-wc-subscription.php:2882 -#, php-format -msgid "The %s date must occur after the trial end date." -msgstr "" - -#. translators: %s: date type (e.g. "next_payment"). -#: includes/core/class-wc-subscription.php:2887 -#, php-format -msgid "The %s date must occur after the start date." -msgstr "" - -#: includes/core/class-wc-subscription.php:2917 -#: includes/core/class-wc-subscriptions-checkout.php:349 -msgid "Backordered" -msgstr "" - -#: includes/core/class-wc-subscriptions-addresses.php:66 -msgid "Change address" -msgstr "" - -#: includes/core/class-wc-subscriptions-addresses.php:108 -msgid "Both the shipping address used for the subscription and your default shipping address for future purchases will be updated." -msgstr "" - -#. translators: $1: address type (Shipping Address / Billing Address), $2: opening tag, $3: closing tag -#: includes/core/class-wc-subscriptions-addresses.php:122 -#, php-format -msgid "Update the %1$s used for %2$sall%3$s future renewals of my active subscriptions" -msgstr "" - -#. translators: $1: address type (Billing Address), $2: opening tag, $3: closing tag -#: includes/core/class-wc-subscriptions-addresses.php:167 -#, php-format -msgid "Update the %1$s contact used for %2$sall%3$s future renewals of my active subscriptions" -msgstr "" - -#. translators: %s: subscription ID. -#. translators: %s: order number. -#. translators: placeholder is a subscription ID. -#: includes/core/class-wc-subscriptions-addresses.php:346 -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:762 -#: includes/core/class-wcs-query.php:101 -#, php-format -msgctxt "hash before order number" -msgid "Subscription #%s" -msgstr "" - -#. translators: %s: address type (eg. 'billing' or 'shipping'). -#: includes/core/class-wc-subscriptions-addresses.php:352 -#, php-format -msgctxt "change billing or shipping address" -msgid "Change %s address" -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:66 -msgid "A subscription has been removed from your cart. Only one subscription product can be purchased at a time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:66 -msgid "Products have been removed from your cart. Products and subscriptions can not be purchased at the same time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:74 -msgid "A subscription renewal has been removed from your cart. Multiple subscriptions can not be purchased at the same time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:80 -msgid "A subscription has been removed from your cart. Due to payment gateway restrictions, different subscription products can not be purchased at the same time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:86 -msgid "A subscription has been removed from your cart. Products and subscriptions can not be purchased at the same time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:125 -msgid "Your cart has been emptied of subscription products. Only one subscription product can be purchased at a time." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:153 -msgid "That product can not be added to your cart as it already contains a subscription renewal." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart-validator.php:195 -#: includes/core/class-wc-subscriptions-cart.php:1504 -msgid "That subscription product can not be added to your cart as it already contains a subscription renewal." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:535 -msgid "Initial Shipment" -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:1100 -msgid "Invalid recurring shipping method." -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:2189 -msgid "now" -msgstr "" - -#. translators: placeholder is a number of days. -#: includes/core/class-wc-subscriptions-cart.php:2351 -#: includes/core/wcs-time-functions.php:58 -#, php-format -msgid "%s day" -msgid_plural "%s days" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a number of weeks. -#: includes/core/class-wc-subscriptions-cart.php:2355 -#: includes/core/wcs-time-functions.php:60 -#, php-format -msgid "%s week" -msgid_plural "%s weeks" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a number of months. -#: includes/core/class-wc-subscriptions-cart.php:2359 -#: includes/core/wcs-time-functions.php:62 -#, php-format -msgid "%s month" -msgid_plural "%s months" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a number of years. -#: includes/core/class-wc-subscriptions-cart.php:2363 -#: includes/core/wcs-time-functions.php:64 -#, php-format -msgid "%s year" -msgid_plural "%s years" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1$: day of the week (e.g. "every Wednesday"). -#: includes/core/class-wc-subscriptions-cart.php:2385 -#, php-format -msgid "every %1$s" -msgstr "" - -#. translators: 1$: period, 2$: day of the week (e.g. "every 2nd week on Wednesday"). -#: includes/core/class-wc-subscriptions-cart.php:2389 -#, php-format -msgid "every %1$s on %2$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:2398 -msgid "on the last day of each month" -msgstr "" - -#. translators: 1$: day of the month (e.g. "23rd") (e.g. "every 23rd of each month"). -#: includes/core/class-wc-subscriptions-cart.php:2402 -#, php-format -msgid "on the %1$s of each month" -msgstr "" - -#. translators: 1$: interval (e.g. "3rd") (e.g. "on the last day of every 3rd month"). -#: includes/core/class-wc-subscriptions-cart.php:2410 -#, php-format -msgid "on the last day of every %1$s month" -msgstr "" - -#. translators: on the, 1$: day of every, 2$: month (e.g. "on the 23rd day of every 2nd month"). -#: includes/core/class-wc-subscriptions-cart.php:2416 -#, php-format -msgid "on the %1$s day of every %2$s month" -msgstr "" - -#. translators: on, 1$: , 2$: each year (e.g. "on March 15th each year"). -#: includes/core/class-wc-subscriptions-cart.php:2427 -#, php-format -msgid "on %1$s %2$s each year" -msgstr "" - -#. translators: 1$: month (e.g. "March"), 2$: day of the month (e.g. "23rd), 3$: interval year (r.g March 23rd every 2nd year"). -#: includes/core/class-wc-subscriptions-cart.php:2434 -#, php-format -msgid "on %1$s %2$s every %3$s year" -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:2468 -msgid "Sign up fee" -msgstr "" - -#: includes/core/class-wc-subscriptions-cart.php:2478 -msgid "Renews" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:160 -msgid "Sorry, this subscription change payment method request is invalid and cannot be processed." -msgstr "" - -#. translators: placeholder is next payment's date -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:184 -#, php-format -msgid " Next payment is due %s." -msgstr "" - -#. translators: placeholder is either empty or "Next payment is due..." -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:190 -#, php-format -msgid "Choose a new payment method.%s" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:226 -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:111 -#: includes/gifting/class-wcsg-cart.php:160 -#: includes/gifting/class-wcsg-checkout.php:102 -#: includes/gifting/class-wcsg-product.php:52 -msgid "There was an error with your request. Please try again." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:229 -#: includes/core/class-wcs-template-loader.php:103 -#: includes/core/wcs-helper-functions.php:301 -msgid "Invalid Subscription." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:232 -#: includes/core/class-wcs-cart-resubscribe.php:83 -#: includes/core/class-wcs-cart-resubscribe.php:133 -#: includes/core/class-wcs-user-change-status-handler.php:112 -#: includes/early-renewal/class-wcs-cart-early-renewal.php:98 -msgid "That doesn't appear to be one of your subscriptions." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:235 -#: includes/core/class-wcs-query.php:245 -msgid "The payment method can not be changed for that subscription." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:238 -msgid "Invalid order." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:256 -msgctxt "label on button, imperative" -msgid "Change payment" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:258 -msgctxt "label on button, imperative" -msgid "Add payment" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:322 -msgid "Payment method updated." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:322 -msgid "Payment method added." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:375 -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:377 -msgid "Payment method updated for all your current subscriptions." -msgstr "" - -#. translators: 1: old payment title, 2: new payment title. -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:540 -#, php-format -msgctxt "%1$s: old payment title, %2$s: new payment title" -msgid "Payment method changed from \"%1$s\" to \"%2$s\" by the subscriber." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:551 -msgid "An error occurred updating your subscription's payment method. Please contact us for assistance." -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:559 -#, php-format -msgid "%1$sError:%2$s %3$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:784 -msgctxt "the page title of the change payment method form" -msgid "Change payment method" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:786 -msgctxt "the page title of the add payment method form" -msgid "Add payment method" -msgstr "" - -#: includes/core/class-wc-subscriptions-change-payment-gateway.php:827 -msgid "Please log in to your account below to choose a new payment method for your subscription." -msgstr "" - -#. translators: placeholder is an internal error number -#: includes/core/class-wc-subscriptions-checkout.php:205 -#: includes/core/class-wc-subscriptions-checkout.php:393 -#, php-format -msgid "Error %d: Unable to create subscription. Please try again." -msgstr "" - -#. translators: placeholder is an internal error number -#: includes/core/class-wc-subscriptions-checkout.php:222 -#, php-format -msgid "Error %d: Unable to add tax to subscription. Please try again." -msgstr "" - -#. translators: placeholder is an internal error number -#: includes/core/class-wc-subscriptions-checkout.php:234 -#, php-format -msgid "Error %d: Unable to create order. Please try again." -msgstr "" - -#. Translators: Placeholders are opening and closing strong and link tags. -#: includes/core/class-wc-subscriptions-checkout.php:522 -#, php-format -msgid "Purchasing a subscription product requires an account. Please go to the %1$sMy Account%2$s page to login or register." -msgstr "" - -#. Translators: Placeholders are opening and closing strong and link tags. -#: includes/core/class-wc-subscriptions-checkout.php:525 -#, php-format -msgid "Purchasing a subscription product requires an account. Please go to the %1$sMy Account%2$s page to login or contact us if you need assistance." -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:398 -msgctxt "custom post type setting" -msgid "Add Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:399 -msgctxt "custom post type setting" -msgid "Add New Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:400 -msgctxt "custom post type setting" -msgid "Edit" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:401 -msgctxt "custom post type setting" -msgid "Edit Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:402 -msgctxt "custom post type setting" -msgid "New Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:403 -#: includes/core/class-wc-subscriptions-core-plugin.php:404 -msgctxt "custom post type setting" -msgid "View Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:407 -msgctxt "custom post type setting" -msgid "No Subscriptions found in trash" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:408 -msgctxt "custom post type setting" -msgid "Parent Subscriptions" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:411 -msgid "This is where subscriptions are stored." -msgstr "" - -#. translators: placeholder is a post count. -#: includes/core/class-wc-subscriptions-core-plugin.php:469 -#, php-format -msgctxt "post status label including post count" -msgid "Active (%s)" -msgid_plural "Active (%s)" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a post count. -#: includes/core/class-wc-subscriptions-core-plugin.php:471 -#, php-format -msgctxt "post status label including post count" -msgid "Switched (%s)" -msgid_plural "Switched (%s)" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a post count. -#: includes/core/class-wc-subscriptions-core-plugin.php:473 -#, php-format -msgctxt "post status label including post count" -msgid "Expired (%s)" -msgid_plural "Expired (%s)" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is a post count. -#: includes/core/class-wc-subscriptions-core-plugin.php:475 -#, php-format -msgctxt "post status label including post count" -msgid "Pending Cancellation (%s)" -msgid_plural "Pending Cancellation (%s)" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:524 -msgid "Variable Subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:578 -#: includes/core/upgrades/templates/wcs-about-2-0.php:36 -msgctxt "short for documents" -msgid "Docs" -msgstr "" - -#: includes/core/class-wc-subscriptions-core-plugin.php:579 -msgid "Support" -msgstr "" - -#. translators: placeholders are opening and closing tags. Leads to docs on upgrading WooCommerce Subscriptions -#: includes/core/class-wc-subscriptions-core-plugin.php:602 -#, php-format -msgid "Warning! Version 2.0 is a major update to the WooCommerce Subscriptions extension. Before updating, please create a backup, update all WooCommerce extensions and test all plugins, custom code and payment gateways with version 2.0 on a staging site. %1$sLearn more about updating older versions of WooCommerce Subscriptions »%2$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:134 -msgid "Sign Up Fee Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:135 -msgid "Sign Up Fee % Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:136 -msgid "Recurring Product Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:137 -msgid "Recurring Product % Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:448 -msgid "Sorry, this coupon is only valid for an initial payment and the cart does not require an initial payment." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:454 -msgid "Sorry, this coupon is only valid for new subscriptions." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:459 -msgid "Sorry, this coupon is only valid for subscription products." -msgstr "" - -#. translators: 1$: coupon code that is being removed -#: includes/core/class-wc-subscriptions-coupon.php:465 -#, php-format -msgid "Sorry, the \"%1$s\" coupon is only valid for renewals." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:470 -msgid "Sorry, this coupon is only valid for subscription products with a sign-up fee." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:496 -msgid "Sorry, recurring coupons can only be applied to subscriptions or subscription orders." -msgstr "" - -#. translators: placeholder is coupon code -#: includes/core/class-wc-subscriptions-coupon.php:500 -#, php-format -msgid "Sorry, \"%s\" can only be applied to subscription parent orders which contain a product with signup fees." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:503 -msgid "Sorry, only recurring coupons can be applied to subscriptions." -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:677 -msgid "Renewal % discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:678 -msgid "Renewal product discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:679 -msgid "Renewal cart discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:680 -msgid "Initial payment discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:697 -msgid "Renewal Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-coupon.php:700 -#: build/index.js:11 -#: client/core/recurring-totals/index.js:72 -msgid "Discount" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:247 -msgid "Send trial is ending notification" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:251 -msgid "Send upcoming subscription expiration notification" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:255 -msgid "Send upcoming renewal notification" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:271 -msgid "Customer Notifications" -msgstr "" - -#. translators: Link to WC Settings > Email. -#: includes/core/class-wc-subscriptions-email-notifications.php:275 -#, php-format -msgid "To enable/disable individual notifications and customize templates, visit the Email settings." -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:278 -msgid "Enable Reminders" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:279 -msgid "Send notification emails to customers for subscription renewals and expirations." -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:288 -msgid "Reminder Timing" -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:289 -msgid "How long before the event should the notification be sent." -msgstr "" - -#: includes/core/class-wc-subscriptions-email-notifications.php:294 -#: includes/core/emails/class-wcs-email-customer-notification.php:60 -#: includes/core/privacy/class-wcs-privacy.php:281 -#: templates/gifting/order-details-customer.php:26 -msgid "N/A" -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:194 -msgid "Subscription Product length." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:200 -msgid "Subscription Product trial period." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:207 -msgid "Subscription Product trial interval." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:213 -msgid "Subscription Product signup fees." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:219 -msgid "Subscription Product signup fees taxes." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:225 -msgid "Indicates whether this product is being used to resubscribe the customer to an existing, expired subscription." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:234 -msgid "Indicates whether this product a subscription update, downgrade, cross grade or none of the above." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:243 -msgid "Synchronization data for the subscription." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:247 -msgid "Synchronization day if subscription is annual." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:251 -msgid "Synchronization month if subscription is annual." -msgstr "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:306 -#, php-format -msgid "Shipment every %d year" -msgid_plural "Shipment every %d years" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:306 -msgid "Yearly Shipment" -msgstr "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:310 -#, php-format -msgid "Shipment every %d month" -msgid_plural "Shipment every %d months" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:310 -msgid "Monthly Shipment" -msgstr "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:314 -#, php-format -msgid "Shipment every %d week" -msgid_plural "Shipment every %d weeks" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:314 -msgid "Weekly Shipment" -msgstr "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:318 -#, php-format -msgid "Shipment every %d day" -msgid_plural "Shipment every %d days" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d subscription interval. -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:318 -msgid "Daily Shipment" -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:491 -msgid "Subscription key" -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:516 -msgid "Subscription length." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:522 -msgid "Cart total amounts provided using the smallest unit of the currency." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:528 -msgid "Total price of items in the cart." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:534 -msgid "Total tax on items in the cart." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:540 -msgid "Total price of any applied fees." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:546 -msgid "Total tax on fees." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:552 -msgid "Total discount from applied coupons." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:558 -msgid "Total tax removed due to discount from applied coupons." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:564 -msgid "Total price of shipping. If shipping has not been calculated, a null response will be sent." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:570 -msgid "Total tax on shipping. If shipping has not been calculated, a null response will be sent." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:576 -msgid "Total price the customer will pay." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:582 -msgid "Total tax applied to items and shipping." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:588 -msgid "Lines of taxes applied to items and shipping." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:596 -msgid "The name of the tax." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:602 -msgid "The amount of tax charged." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:611 -msgid "Currency code (in ISO format) for returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:617 -msgid "Currency symbol for the currency which can be used to format returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:623 -msgid "Currency minor unit (number of digits after the decimal separator) for returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:629 -msgid "Decimal separator for the currency which can be used to format returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:635 -msgid "Thousand separator for the currency which can be used to format returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:641 -#: includes/core/class-wc-subscriptions-extend-store-endpoint.php:647 -msgid "Price prefix for the currency which can be used to format returned prices." -msgstr "" - -#: includes/core/class-wc-subscriptions-frontend-scripts.php:53 -msgid "To enable automatic renewals for this subscription, you will first need to add a payment method." -msgstr "" - -#: includes/core/class-wc-subscriptions-frontend-scripts.php:53 -msgid "Would you like to add a payment method now?" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:114 -#: includes/core/class-wc-subscriptions-manager.php:2065 -#: includes/core/class-wc-subscriptions-manager.php:2080 -msgctxt "used in order note as reason for why subscription status changed" -msgid "Subscription renewal payment due:" -msgstr "" - -#. translators: placeholder %1 is an order note. %2 is the error message that was thrown. -#: includes/core/class-wc-subscriptions-manager.php:151 -#, php-format -msgid "Error: Unable to create renewal order with note \"%1$s\". Message: %2$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:161 -msgid "Manual renewal order awaiting customer payment." -msgstr "" - -#. translators: placeholder is a subscription ID. -#. translators: %d: subscription ID. -#: includes/core/class-wc-subscriptions-manager.php:194 -#: includes/gateways/class-wc-subscriptions-payment-gateways.php:77 -#, php-format -msgid "Subscription doesn't exist in scheduled action: %d" -msgstr "" - -#. translators: $1: order number, $2: error message -#: includes/core/class-wc-subscriptions-manager.php:346 -#, php-format -msgid "Failed to activate subscription status for order #%1$s: %2$s" -msgstr "" - -#. translators: $1: order number, $2: error message -#: includes/core/class-wc-subscriptions-manager.php:374 -#, php-format -msgid "Failed to update subscription status after order #%1$s was put on-hold: %2$s" -msgstr "" - -#. translators: $1: order number, $2: error message -#: includes/core/class-wc-subscriptions-manager.php:402 -#, php-format -msgid "Failed to cancel subscription after order #%1$s was cancelled: %2$s" -msgstr "" - -#. translators: $1: order number, $2: error message -#: includes/core/class-wc-subscriptions-manager.php:430 -#, php-format -msgid "Failed to set subscription as expired for order #%1$s: %2$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:460 -msgid "Subscription sign up failed." -msgstr "" - -#. translators: $1: order number, $2: error message -#: includes/core/class-wc-subscriptions-manager.php:485 -#, php-format -msgid "Failed to process failed payment on subscription for order #%1$s: %2$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:565 -msgid "Error: Unable to create subscription. Please try again." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:587 -msgid "Error: Unable to add product to created subscription. Please try again." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:632 -msgid "Pending subscription created." -msgstr "" - -#. translators: %s is the email address of the recipient. -#: includes/core/class-wc-subscriptions-manager.php:1041 -#, php-format -msgid "The gifted subscription moved to the purchaser after the recipient user with email address %s was deleted." -msgstr "" - -#. Translators: 1: The subscription ID number. 2: The current user's username. -#: includes/core/class-wc-subscriptions-manager.php:1061 -#, php-format -msgid "The related subscription #%1$s has been deleted after the customer was deleted by %2$s." -msgstr "" - -#. Translators: Placeholder is the subscription ID number. -#: includes/core/class-wc-subscriptions-manager.php:1064 -#, php-format -msgid "The related subscription #%s has been deleted after the customer was deleted." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1210 -#: includes/core/wcs-functions.php:224 -msgctxt "Subscription status" -msgid "Active" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1213 -#: includes/core/wcs-functions.php:226 -msgctxt "Subscription status" -msgid "Cancelled" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1216 -#: includes/core/wcs-functions.php:228 -msgctxt "Subscription status" -msgid "Expired" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1219 -#: includes/core/wcs-functions.php:223 -msgctxt "Subscription status" -msgid "Pending" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1222 -msgctxt "Subscription status" -msgid "Failed" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:1226 -msgctxt "Subscription status" -msgid "On-hold" -msgstr "" - -#. translators: 1$: month number (e.g. "01"), 2$: month abbreviation (e.g. "Jan") -#: includes/core/class-wc-subscriptions-manager.php:1978 -#, php-format -msgctxt "used in a select box" -msgid "%1$s-%2$s" -msgstr "" - -#. translators: all fields are full html nodes: 1$: month input, 2$: day input, 3$: year input, 4$: hour input, 5$: minute input. Change the order if you'd like -#: includes/core/class-wc-subscriptions-manager.php:1991 -#, php-format -msgid "%1$s%2$s, %3$s @ %4$s : %5$s" -msgstr "" - -#. translators: all fields are full html nodes: 1$: month input, 2$: day input, 3$: year input. Change the order if you'd like -#: includes/core/class-wc-subscriptions-manager.php:1995 -#, php-format -msgid "%1$s%2$s, %3$s" -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:2000 -msgid "Change" -msgstr "" - -#. translators: placeholder is subscription ID -#: includes/core/class-wc-subscriptions-manager.php:2330 -#, php-format -msgid "Failed sign-up for subscription %s." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:2421 -msgid "Invalid security token, please reload the page and try again." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:2425 -msgid "Only store managers can edit payment dates." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:2429 -msgid "Please enter all date fields." -msgstr "" - -#: includes/core/class-wc-subscriptions-manager.php:2454 -msgid "Date Changed" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:362 -msgid "Your subscription will be activated when payment clears." -msgid_plural "Your subscriptions will be activated when payment clears." -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/class-wc-subscriptions-order.php:369 -#, php-format -msgid "View the status of your subscription in %1$syour account%2$s." -msgid_plural "View the status of your subscriptions in %1$syour account%2$s." -msgstr[0] "" -msgstr[1] "" - -#: includes/core/class-wc-subscriptions-order.php:431 -msgid "Subscription Relationship" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:531 -msgid "Payment completed on order after subscription was cancelled." -msgstr "" - -#. translators: %d: subscription ID. -#: includes/core/class-wc-subscriptions-order.php:610 -#, php-format -msgid "Order cancelled due to subscription #%d cancellation." -msgstr "" - -#. translators: $1: opening link tag, $2: order number, $3: closing link tag -#: includes/core/class-wc-subscriptions-order.php:1196 -#, php-format -msgid "Subscription cancelled for refunded order %1$s#%2$s%3$s." -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2594 -msgctxt "An order type" -msgid "Original" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2595 -msgctxt "An order type" -msgid "Subscription Parent" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2596 -msgctxt "An order type" -msgid "Subscription Renewal" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2597 -msgctxt "An order type" -msgid "Subscription Resubscribe" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2598 -msgctxt "An order type" -msgid "Subscription Switch" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2599 -msgctxt "An order type" -msgid "Non-subscription" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2608 -msgid "All orders types" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2641 -msgid "Renewal Order" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2643 -msgid "Resubscribe Order" -msgstr "" - -#: includes/core/class-wc-subscriptions-order.php:2645 -msgid "Parent Order" -msgstr "" - -#. translators: %1$s refers to the price. This string is meant to prefix another string below, e.g. "$5 now, and $5 on March 15th each year" -#: includes/core/class-wc-subscriptions-product.php:313 -#, php-format -msgid "%1$s now, and " -msgstr "" - -#. translators: 1$: recurring amount string, 2$: day of the week (e.g. "$10 every Wednesday"). -#. translators: 1$: recurring amount string, 2$: day of the week (e.g. "$10 every Wednesday") -#. translators: %1$: recurring amount (e.g. "$15"), %2$: subscription period (e.g. "month") (e.g. "$15 every 2nd month") -#: includes/core/class-wc-subscriptions-product.php:322 -#: includes/core/wcs-formatting-functions.php:116 -#: includes/core/wcs-formatting-functions.php:201 -#, php-format -msgid "%1$s every %2$s" -msgstr "" - -#. translators: 1$: recurring amount string, 2$: period, 3$: day of the week (e.g. "$10 every 2nd week on Wednesday"). -#. translators: 1$: recurring amount string, 2$: period, 3$: day of the week (e.g. "$10 every 2nd week on Wednesday") -#: includes/core/class-wc-subscriptions-product.php:326 -#: includes/core/wcs-formatting-functions.php:125 -#, php-format -msgid "%1$s every %2$s on %3$s" -msgstr "" - -#. translators: placeholder is recurring amount. -#. translators: placeholder is recurring amount -#: includes/core/class-wc-subscriptions-product.php:337 -#: includes/core/wcs-formatting-functions.php:143 -#, php-format -msgid "%s on the last day of each month" -msgstr "" - -#. translators: 1$: recurring amount, 2$: day of the month (e.g. "23rd") (e.g. "$5 every 23rd of each month"). -#. translators: 1$: recurring amount, 2$: day of the month (e.g. "23rd") (e.g. "$5 every 23rd of each month") -#: includes/core/class-wc-subscriptions-product.php:341 -#: includes/core/wcs-formatting-functions.php:146 -#, php-format -msgid "%1$s on the %2$s of each month" -msgstr "" - -#. translators: 1$: recurring amount, 2$: interval (e.g. "3rd") (e.g. "$10 on the last day of every 3rd month"). -#. translators: 1$: recurring amount, 2$: interval (e.g. "3rd") (e.g. "$10 on the last day of every 3rd month") -#: includes/core/class-wc-subscriptions-product.php:350 -#: includes/core/wcs-formatting-functions.php:162 -#, php-format -msgid "%1$s on the last day of every %2$s month" -msgstr "" - -#. translators: 1$: on the, 2$: day of every, 3$: month (e.g. "$10 on the 23rd day of every 2nd month"). -#. translators: 1$: recurring amount, 2$: day of the month (e.g. "23rd") (e.g. "$5 every 23rd of each month") -#: includes/core/class-wc-subscriptions-product.php:357 -#: includes/core/wcs-formatting-functions.php:165 -#, php-format -msgid "%1$s on the %2$s day of every %3$s month" -msgstr "" - -#. translators: 1$: on, 2$: , 3$: each year (e.g. "$15 on March 15th each year"). -#. translators: 1$: recurring amount, 2$: month (e.g. "March"), 3$: day of the month (e.g. "23rd") (e.g. "$15 on March 15th every 3rd year") -#: includes/core/class-wc-subscriptions-product.php:369 -#: includes/core/wcs-formatting-functions.php:178 -#, php-format -msgid "%1$s on %2$s %3$s each year" -msgstr "" - -#. translators: 1$: recurring amount, 2$: month (e.g. "March"), 3$: day of the month (e.g. "23rd"). -#. translators: 1$: recurring amount, 2$: month (e.g. "March"), 3$: day of the month (e.g. "23rd") (e.g. "$15 on March 15th every 3rd year") -#: includes/core/class-wc-subscriptions-product.php:377 -#: includes/core/wcs-formatting-functions.php:187 -#, php-format -msgid "%1$s on %2$s %3$s every %4$s year" -msgstr "" - -#. translators: 1$: recurring amount, 2$: subscription period (e.g. "month" or "3 months") (e.g. "$15 / month" or "$15 every 2nd month"). -#. translators: 1$: recurring amount, 2$: subscription period (e.g. "month" or "3 months") (e.g. "$15 / month" or "$15 every 2nd month") -#: includes/core/class-wc-subscriptions-product.php:389 -#: includes/core/wcs-formatting-functions.php:198 -#, php-format -msgid "%1$s / %2$s" -msgid_plural "%1$s every %2$s" -msgstr[0] "" -msgstr[1] "" - -#. translators: billing period (e.g. "every week"). -#: includes/core/class-wc-subscriptions-product.php:399 -#, php-format -msgid "every %s" -msgstr "" - -#. translators: 1$: subscription string (e.g. "$10 up front then $5 on March 23rd every 3rd year"), 2$: length (e.g. "4 years"). -#. translators: 1$: subscription string (e.g. "$10 up front then $5 on March 23rd every 3rd year"), 2$: length (e.g. "4 years") -#: includes/core/class-wc-subscriptions-product.php:409 -#: includes/core/wcs-formatting-functions.php:209 -#, php-format -msgid "%1$s for %2$s" -msgstr "" - -#. translators: 1$: subscription string (e.g. "$15 on March 15th every 3 years for 6 years"), 2$: trial length (e.g.: "with 4 months free trial"). -#: includes/core/class-wc-subscriptions-product.php:415 -#, php-format -msgid "%1$s with %2$s free trial" -msgstr "" - -#. translators: 1$: subscription string (e.g. "$15 on March 15th every 3 years for 6 years with 2 months free trial"), 2$: signup fee price (e.g. "and a $30 sign-up fee"). -#: includes/core/class-wc-subscriptions-product.php:420 -#, php-format -msgid "%1$s and a %2$s sign-up fee" -msgstr "" - -#: includes/core/class-wc-subscriptions-product.php:1009 -msgid "This variation can not be removed because it is associated with existing subscriptions. To remove this variation, please permanently delete any related subscriptions." -msgstr "" - -#. translators: placeholder is order ID -#: includes/core/class-wc-subscriptions-renewal-order.php:159 -#, php-format -msgid "Order %s created to record renewal." -msgstr "" - -#: includes/core/class-wc-subscriptions-renewal-order.php:179 -msgid "Subscription renewal orders cannot be cancelled." -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:48 -msgid "Synchronise renewals" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:49 -msgid "Align the payment date for all customers who purchase this subscription to a specific day of the week or month." -msgstr "" - -#. translators: placeholder is a year (e.g. "2016") -#: includes/core/class-wc-subscriptions-synchroniser.php:51 -#, php-format -msgctxt "used in subscription product edit screen" -msgid "Align the payment date for this subscription to a specific day of the year. If the date has already taken place this year, the first payment will be processed in %s. Set the day to 0 to disable payment syncing for this product." -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:200 -msgid "Synchronisation" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/class-wc-subscriptions-synchroniser.php:203 -#, php-format -msgctxt "used in the general subscription options page" -msgid "Align subscription renewal to a specific day of the week, month or year. For example, the first day of the month. %1$sLearn more%2$s." -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:209 -msgid "Align Subscription Renewal Day" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:216 -msgid "Prorate First Renewal" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:217 -msgid "If a subscription is synchronised to a specific day of the week, month or year, charge a prorated amount for the subscription at the time of sign up." -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:224 -msgctxt "when to prorate first payment / subscription length" -msgid "Never (do not charge any recurring amount)" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:225 -msgctxt "when to prorate first payment / subscription length" -msgid "Never (charge the full recurring amount at sign-up)" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:226 -#: includes/switching/class-wc-subscriptions-switcher.php:442 -msgctxt "when to prorate first payment / subscription length" -msgid "For Virtual Subscription Products Only" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:227 -#: includes/switching/class-wc-subscriptions-switcher.php:443 -msgctxt "when to prorate first payment / subscription length" -msgid "For All Subscription Products" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:233 -msgid "Sign-up grace period" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:234 -msgctxt "there's a number immediately in front of this text" -msgid "days prior to Renewal Day" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:238 -msgid "Subscriptions created within this many days prior to the Renewal Day will not be charged at sign-up. Set to zero for all new Subscriptions to be charged the full recurring amount. Must be a positive number." -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:308 -msgid "Month for Synchronisation" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:760 -#: includes/core/class-wc-subscriptions-synchroniser.php:777 -msgid "Do not synchronise" -msgstr "" - -#. translators: placeholder is a day of the week -#: includes/core/class-wc-subscriptions-synchroniser.php:785 -#, php-format -msgid "%s each week" -msgstr "" - -#. translators: placeholder is a number of day with language specific suffix applied (e.g. "1st", "3rd", "5th", etc...) -#: includes/core/class-wc-subscriptions-synchroniser.php:791 -#, php-format -msgid "%s day of the month" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:793 -msgid "Last day of the month" -msgstr "" - -#: includes/core/class-wc-subscriptions-synchroniser.php:850 -msgid "Today!" -msgstr "" - -#. translators: placeholder is a date -#: includes/core/class-wc-subscriptions-synchroniser.php:857 -#, php-format -msgid "First payment prorated. Next payment: %s" -msgstr "" - -#. translators: placeholder is a date -#: includes/core/class-wc-subscriptions-synchroniser.php:860 -#, php-format -msgid "First payment: %s" -msgstr "" - -#: includes/core/class-wcs-cached-data-manager.php:75 -#, php-format -msgid "Related order caching is now handled by %1$s." -msgstr "" - -#: includes/core/class-wcs-cached-data-manager.php:82 -#, php-format -msgid "Customer subscription caching is now handled by %1$s." -msgstr "" - -#: includes/core/class-wcs-cached-data-manager.php:106 -#: includes/core/class-wcs-cached-data-manager.php:238 -#, php-format -msgid "Customer subscription caching is now handled by %1$s and %2$s." -msgstr "" - -#: includes/core/class-wcs-cached-data-manager.php:123 -msgid "new related order methods in WCS_Related_Order_Store" -msgstr "" - -#: includes/core/class-wcs-cached-data-manager.php:223 -msgid "Weekly" -msgstr "" - -#: includes/core/class-wcs-cart-initial-payment.php:85 -#: includes/core/class-wcs-cart-renewal.php:200 -msgid "That doesn't appear to be your order." -msgstr "" - -#: includes/core/class-wcs-cart-renewal.php:215 -msgid "This order can no longer be paid because the corresponding subscription does not require payment at this time." -msgstr "" - -#: includes/core/class-wcs-cart-renewal.php:236 -msgid "Complete checkout to renew your subscription." -msgstr "" - -#. translators: placeholder is an item name -#: includes/core/class-wcs-cart-renewal.php:333 -#, php-format -msgid "The %s product has been deleted and can no longer be renewed. Please choose a new product or contact us for assistance." -msgstr "" - -#. translators: %s is subscription's number -#: includes/core/class-wcs-cart-renewal.php:368 -#, php-format -msgid "Subscription #%s has not been added to the cart." -msgstr "" - -#. translators: %s is order's number -#: includes/core/class-wcs-cart-renewal.php:371 -#, php-format -msgid "Order #%s has not been added to the cart." -msgstr "" - -#: includes/core/class-wcs-cart-renewal.php:410 -msgid "We couldn't find the original subscription for an item in your cart. The item was removed." -msgid_plural "We couldn't find the original subscriptions for items in your cart. The items were removed." -msgstr[0] "" -msgstr[1] "" - -#: includes/core/class-wcs-cart-renewal.php:417 -msgid "We couldn't find the original renewal order for an item in your cart. The item was removed." -msgid_plural "We couldn't find the original renewal orders for items in your cart. The items were removed." -msgstr[0] "" -msgstr[1] "" - -#: includes/core/class-wcs-cart-renewal.php:713 -msgid "All linked subscription items have been removed from the cart." -msgstr "" - -#: includes/core/class-wcs-cart-renewal.php:742 -msgctxt "Used in WooCommerce by removed item notification: \"_All linked subscription items were_ removed. Undo?\" Filter for item title." -msgid "All linked subscription items were" -msgstr "" - -#: includes/core/class-wcs-cart-renewal.php:1569 -msgctxt "The place order button text while renewing a subscription" -msgid "Renew subscription" -msgstr "" - -#: includes/core/class-wcs-cart-resubscribe.php:77 -msgid "There was an error with your request to resubscribe. Please try again." -msgstr "" - -#: includes/core/class-wcs-cart-resubscribe.php:79 -#: includes/early-renewal/class-wcs-cart-early-renewal.php:94 -msgid "That subscription does not exist. Has it been deleted?" -msgstr "" - -#: includes/core/class-wcs-cart-resubscribe.php:87 -msgid "You can not resubscribe to that subscription. Please contact us if you need assistance." -msgstr "" - -#: includes/core/class-wcs-cart-resubscribe.php:95 -#: includes/core/class-wcs-cart-resubscribe.php:123 -msgid "Complete checkout to resubscribe." -msgstr "" - -#. translators: %s: order number. -#: includes/core/class-wcs-cart-resubscribe.php:324 -#, php-format -msgid "Customer resubscribed in order #%s" -msgstr "" - -#: includes/core/class-wcs-cart-resubscribe.php:342 -msgctxt "The place order button text while resubscribing to a subscription" -msgid "Resubscribe" -msgstr "" - -#: includes/core/class-wcs-change-payment-method-admin.php:119 -msgid "Please choose a valid payment gateway to change to." -msgstr "" - -#. Translators: Placeholder is the payment gateway title. -#: includes/core/class-wcs-change-payment-method-admin.php:152 -#, php-format -msgid "Admin turned on automatic renewals by changing payment method to \"%s\" via the Edit Subscription screen." -msgstr "" - -#: includes/core/class-wcs-failed-scheduled-action-manager.php:227 -msgid "Ignore this error" -msgstr "" - -#: includes/core/class-wcs-limiter.php:47 -msgid "Limit subscription" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/class-wcs-limiter.php:49 -#, php-format -msgid "Only allow a customer to have one subscription to this product. %1$sLearn more%2$s." -msgstr "" - -#: includes/core/class-wcs-limiter.php:51 -msgid "Do not limit" -msgstr "" - -#: includes/core/class-wcs-limiter.php:52 -msgid "Limit to one active subscription" -msgstr "" - -#: includes/core/class-wcs-limiter.php:53 -msgid "Limit to one of any status" -msgstr "" - -#: includes/core/class-wcs-my-account-auto-renew-toggle.php:101 -msgid "Customer turned off automatic renewals via their My Account page." -msgstr "" - -#: includes/core/class-wcs-my-account-auto-renew-toggle.php:126 -msgid "Customer turned on automatic renewals via their My Account page." -msgstr "" - -#: includes/core/class-wcs-my-account-auto-renew-toggle.php:155 -msgid "Auto Renewal Toggle" -msgstr "" - -#: includes/core/class-wcs-my-account-auto-renew-toggle.php:156 -msgid "Display the auto renewal toggle" -msgstr "" - -#: includes/core/class-wcs-my-account-auto-renew-toggle.php:157 -msgid "Allow customers to turn on and off automatic renewals from their View Subscription page." -msgstr "" - -#: includes/core/class-wcs-my-account-payment-methods.php:113 -msgid "The deleted payment method was used for automatic subscription payments, we couldn't find an alternative token payment method token to change your subscriptions to." -msgstr "" - -#. translators: 1: deleted token, 2: new token. -#: includes/core/class-wcs-my-account-payment-methods.php:131 -#, php-format -msgctxt "used in subscription note" -msgid "Payment method meta updated after customer deleted a token from their My Account page. Payment meta changed from %1$s to %2$s" -msgstr "" - -#. translators: $1: the token/credit card label, 2$-3$: opening and closing strong and link tags -#: includes/core/class-wcs-my-account-payment-methods.php:136 -#, php-format -msgid "The deleted payment method was used for automatic subscription payments. To avoid failed renewal payments in future the subscriptions using this payment method have been updated to use your %1$s. To change the payment method of individual subscriptions go to your %2$sMy Account > Subscriptions%3$s page." -msgstr "" - -#. translators: 1: token display name, 2: opening link tag, 4: closing link tag, 3: opening link tag. -#: includes/core/class-wcs-my-account-payment-methods.php:191 -#, php-format -msgid "Would you like to update your subscriptions to use this new payment method - %1$s?%2$sYes%4$s | %3$sNo%4$s" -msgstr "" - -#. translators: 1: previous token, 2: new token. -#: includes/core/class-wcs-my-account-payment-methods.php:232 -#, php-format -msgctxt "used in subscription note" -msgid "Payment method meta updated after customer changed their default token and opted to update their subscriptions. Payment meta changed from %1$s to %2$s" -msgstr "" - -#. translators: %1$s opening strong HTML tag, %2$s closing strong HTML tag. -#: includes/core/class-wcs-my-account-payment-methods.php:254 -#, php-format -msgid "That payment method cannot be deleted because it is linked to an automatic subscription. Please %1$sadd a payment method%2$s, before trying again." -msgstr "" - -#. translators: %1$s opening strong and em HTML tags, %2$s closing em HTML tag, %3$s closing strong HTML tag. -#: includes/core/class-wcs-my-account-payment-methods.php:260 -#, php-format -msgid "That payment method cannot be deleted because it is linked to an automatic subscription. Please choose a %1$sdefault%2$s payment method%3$s, before trying again." -msgstr "" - -#: includes/core/class-wcs-notifications-batch-processor.php:258 -msgid "Background process for updating subscription notifications started." -msgstr "" - -#: includes/core/class-wcs-notifications-batch-processor.php:273 -msgid "Background process for updating subscription notifications stopped." -msgstr "" - -#. translators: 1$-2$: opening and closing tags. -#: includes/core/class-wcs-permalink-manager.php:91 -#, php-format -msgid "Error saving Subscriptions endpoints: %1$sSubscriptions%2$s, %1$sView subscription%2$s and %1$sSubscription payment method%2$s cannot be the same. The changes have been reverted." -msgstr "" - -#. translators: %s: invalid type of update argument. -#: includes/core/class-wcs-post-meta-cache-manager.php:200 -#, php-format -msgid "Invalid update type: %s. Post update types supported are \"add\" or \"delete\". Updates are done on post meta directly." -msgstr "" - -#. translators: placeholder is a page number. -#: includes/core/class-wcs-query.php:106 -#, php-format -msgid "Subscriptions (page %d)" -msgstr "" - -#: includes/core/class-wcs-query.php:131 -msgid "My Subscription" -msgstr "" - -#: includes/core/class-wcs-query.php:290 -msgid "Endpoint for the My Account → Subscriptions page" -msgstr "" - -#: includes/core/class-wcs-query.php:298 -msgid "View subscription" -msgstr "" - -#: includes/core/class-wcs-query.php:299 -msgid "Endpoint for the My Account → View Subscription page" -msgstr "" - -#: includes/core/class-wcs-query.php:307 -msgid "Subscription payment method" -msgstr "" - -#: includes/core/class-wcs-query.php:308 -msgid "Endpoint for the My Account → Change Subscription Payment Method page" -msgstr "" - -#. translators: %d: subscription ID. -#: includes/core/class-wcs-remove-item.php:79 -#, php-format -msgctxt "hash before subscription ID" -msgid "Subscription #%d does not exist." -msgstr "" - -#. translators: 1$: product name, 2$: product id -#: includes/core/class-wcs-remove-item.php:114 -#, php-format -msgctxt "used in order note" -msgid "Customer added \"%1$s\" (Product ID: #%2$d) via the My Account page." -msgstr "" - -#: includes/core/class-wcs-remove-item.php:119 -msgid "Your request to undo your previous action was unsuccessful." -msgstr "" - -#. translators: 1$: product name, 2$: product id -#: includes/core/class-wcs-remove-item.php:137 -#, php-format -msgctxt "used in order note" -msgid "Customer removed \"%1$s\" (Product ID: #%2$d) via the My Account page." -msgstr "" - -#. translators: placeholders are 1$: item name, and, 2$: opening and, 3$: closing link tags -#: includes/core/class-wcs-remove-item.php:140 -#, php-format -msgid "You have successfully removed \"%1$s\" from your subscription. %2$sUndo?%3$s" -msgstr "" - -#: includes/core/class-wcs-remove-item.php:180 -#: includes/core/class-wcs-user-change-status-handler.php:108 -msgid "Security error. Please contact us if you need assistance." -msgstr "" - -#: includes/core/class-wcs-remove-item.php:184 -msgid "You cannot modify a subscription that does not belong to you." -msgstr "" - -#: includes/core/class-wcs-remove-item.php:188 -msgid "You cannot remove an item that does not exist. " -msgstr "" - -#: includes/core/class-wcs-remove-item.php:192 -msgid "The item was not removed because this Subscription's payment method does not support removing an item." -msgstr "" - -#. translators: 1-2: opening/closing tags - linked to staging site, 3: link to live site. -#: includes/core/class-wcs-staging.php:41 -#, php-format -msgid "Payment processing skipped - renewal order created on %1$sstaging site%2$s under staging site lock. Live site is at %3$s" -msgstr "" - -#: includes/core/class-wcs-staging.php:84 -msgid "Subscription locked to Manual Renewal while the store is in staging mode. Payment method changes will take effect in live mode." -msgstr "" - -#. translators: placeholder is a payment method title. -#: includes/core/class-wcs-staging.php:98 -#, php-format -msgid "Subscription locked to Manual Renewal while the store is in staging mode. Live payment method: %s" -msgstr "" - -#. translators: 1$-2$: opening and closing tags. 3$-4$: opening and closing link tags for learn more. Leads to duplicate site article on docs. 5$-6$: Opening and closing link to production URL. 7$: Production URL . -#: includes/core/class-wcs-staging.php:129 -#, php-format -msgid "It looks like this site has moved or is a duplicate site. %1$sWooCommerce Subscriptions%2$s has disabled automatic payments and subscription related emails on this site to prevent duplicate payments from a staging or test environment. %1$sWooCommerce Subscriptions%2$s considers %5$s%7$s%6$s to be the site's URL. %3$sLearn more »%4$s." -msgstr "" - -#: includes/core/class-wcs-staging.php:142 -msgid "Quit nagging me (but don't enable automatic payments)" -msgstr "" - -#: includes/core/class-wcs-staging.php:147 -msgid "Enable automatic payments" -msgstr "" - -#: includes/core/class-wcs-template-loader.php:103 -#: templates/gifting/emails/new-recipient-customer.php:49 -msgid "My Account" -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:58 -msgctxt "order note left on subscription after user action" -msgid "Subscription reactivated by the subscriber from their account page." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:59 -msgctxt "Notice displayed to user confirming their action." -msgid "Your subscription has been reactivated." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:62 -msgid "You can not reactivate that subscription until paying to renew it. Please contact us if you need assistance." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:68 -msgctxt "order note left on subscription after user action" -msgid "Subscription put on hold by the subscriber from their account page." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:69 -msgctxt "Notice displayed to user confirming their action." -msgid "Your subscription has been put on hold." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:72 -msgid "You can not suspend that subscription - the suspension limit has been reached. Please contact us if you need assistance." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:77 -msgctxt "order note left on subscription after user action" -msgid "Subscription cancelled by the subscriber from their account page." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:78 -msgctxt "Notice displayed to user confirming their action." -msgid "Your subscription has been cancelled." -msgstr "" - -#: includes/core/class-wcs-user-change-status-handler.php:104 -msgid "That subscription does not exist. Please contact us if you need assistance." -msgstr "" - -#. translators: placeholder is subscription's new status, translated -#: includes/core/class-wcs-user-change-status-handler.php:117 -#, php-format -msgid "That subscription can not be changed to %s. Please contact us if you need assistance." -msgstr "" - -#: includes/core/data-stores/class-wcs-customer-store-cached-cpt.php:87 -msgid "Generate Customer Subscription Cache" -msgstr "" - -#: includes/core/data-stores/class-wcs-customer-store-cached-cpt.php:87 -msgid "This will generate the persistent cache for linking users with subscriptions. The caches will be generated overtime in the background (via Action Scheduler)." -msgstr "" - -#: includes/core/data-stores/class-wcs-customer-store-cached-cpt.php:88 -msgid "Delete Customer Subscription Cache" -msgstr "" - -#: includes/core/data-stores/class-wcs-customer-store-cached-cpt.php:88 -msgid "This will clear the persistent cache of all of subscriptions stored against users in your store. Expect slower performance of checkout, renewal and other subscription related functions after taking this action. The caches will be regenerated overtime as queries to find a given user's subscriptions are run." -msgstr "" - -#. translators: 1: subscription ID, 2: subscription status -#: includes/core/data-stores/class-wcs-orders-table-subscription-data-store.php:352 -#, php-format -msgid "Subscription %1$d cannot be restored from the trash: it has already been restored to status \"%2$s\"." -msgstr "" - -#. translators: 1: subscription ID, 2: subscription status -#: includes/core/data-stores/class-wcs-orders-table-subscription-data-store.php:370 -#, php-format -msgid "The previous status of subscription %1$d (\"%2$s\") is invalid. It has been restored to \"pending\" status instead." -msgstr "" - -#. translators: 1: subscription ID, 2: subscription status -#: includes/core/data-stores/class-wcs-orders-table-subscription-data-store.php:382 -#, php-format -msgid "The previous status of subscription %1$d (\"%2$s\") is invalid. It could not be restored." -msgstr "" - -#. translators: 1: subscription ID, 2: subscription status -#: includes/core/data-stores/class-wcs-orders-table-subscription-data-store.php:433 -#, php-format -msgid "Something went wrong when trying to restore subscription %d from the trash. It could not be restored." -msgstr "" - -#: includes/core/data-stores/class-wcs-related-order-store-cached-cpt.php:131 -msgid "Generate Related Order Cache" -msgstr "" - -#: includes/core/data-stores/class-wcs-related-order-store-cached-cpt.php:131 -msgid "This will generate the persistent cache of all renewal, switch, resubscribe and other order types for all subscriptions in your store. The caches will be generated overtime in the background (via Action Scheduler)." -msgstr "" - -#: includes/core/data-stores/class-wcs-related-order-store-cached-cpt.php:132 -msgid "Delete Related Order Cache" -msgstr "" - -#: includes/core/data-stores/class-wcs-related-order-store-cached-cpt.php:132 -msgid "This will clear the persistent cache of all renewal, switch, resubscribe and other order types for all subscriptions in your store. Expect slower performance of checkout, renewal and other subscription related functions after taking this action. The caches will be regenerated overtime as related order queries are run." -msgstr "" - -#. translators: %s: Order date -#: includes/core/data-stores/class-wcs-subscription-data-store-cpt.php:275 -#, php-format -msgid "Subscription – %s" -msgstr "" - -#. translators: %s: Order date -#. translators: placeholders are strftime() strings. -#: includes/core/data-stores/class-wcs-subscription-data-store-cpt.php:275 -#: includes/core/wcs-order-functions.php:321 -msgctxt "Order date parsed by DateTime::format" -msgid "M d, Y @ h:i A" -msgstr "" - -#. translators: placeholder is Subscriptions version number. -#: includes/core/deprecated/deprecation-handlers/class-wc-subscriptions-deprecation-handler.php:271 -#, php-format -msgid "Warning! You are running version %s of WooCommerce Subscriptions plugin code but your database has been upgraded to Subscriptions version 2.0. This will cause major problems on your store." -msgstr "" - -#. translators: opening/closing tags - linked to ticket form. -#: includes/core/deprecated/deprecation-handlers/class-wc-subscriptions-deprecation-handler.php:273 -#, php-format -msgid "Please upgrade the WooCommerce Subscriptions plugin to version 2.0 or newer immediately. If you need assistance, after upgrading to Subscriptions v2.0, please %1$sopen a support ticket%2$s." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:25 -msgid "Cancelled Subscription" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:26 -msgid "Cancelled Subscription emails are sent when a customer's subscription is cancelled (either by a store manager, or the customer)." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:28 -msgid "Subscription Cancelled" -msgstr "" - -#. translators: placeholder is {site_title}, a variable that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:30 -#, php-format -msgctxt "default email subject for cancelled emails sent to the admin" -msgid "[%s] Subscription Cancelled" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:57 -msgid "Always Send" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:59 -msgid "Send this email whenever a subscription is updated to \"Pending Cancellation\" or \"Cancelled\"." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:167 -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:209 -#: includes/core/emails/class-wcs-email-expired-subscription.php:140 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:139 -msgctxt "an email notification" -msgid "Enable/Disable" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:169 -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:211 -#: includes/core/emails/class-wcs-email-expired-subscription.php:142 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:141 -msgid "Enable this email notification" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:173 -#: includes/core/emails/class-wcs-email-expired-subscription.php:146 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:145 -msgctxt "of an email" -msgid "Recipient(s)" -msgstr "" - -#. translators: placeholder is admin email -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:176 -#: includes/core/emails/class-wcs-email-expired-subscription.php:149 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:148 -#, php-format -msgid "Enter recipients (comma separated) for this email. Defaults to %s." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:181 -#: includes/core/emails/class-wcs-email-expired-subscription.php:154 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:153 -msgctxt "of an email" -msgid "Subject" -msgstr "" - -#. translators: %s: default e-mail subject. -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:184 -#: includes/core/emails/class-wcs-email-expired-subscription.php:157 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:156 -#, php-format -msgid "This controls the email subject line. Leave blank to use the default subject: %s." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:189 -#: includes/core/emails/class-wcs-email-expired-subscription.php:162 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:161 -msgctxt "Name the setting that controls the main heading contained within the email notification" -msgid "Email Heading" -msgstr "" - -#. translators: %s: default e-mail heading. -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:192 -#, php-format -msgid "This controls the main heading contained within the email notification. Leave blank to use the default heading: %s." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:197 -#: includes/core/emails/class-wcs-email-expired-subscription.php:170 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:169 -msgctxt "text, html or multipart" -msgid "Email type" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:199 -#: includes/core/emails/class-wcs-email-customer-notification.php:68 -#: includes/core/emails/class-wcs-email-expired-subscription.php:172 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:171 -msgid "Choose which format of email to send." -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:203 -#: includes/core/emails/class-wcs-email-expired-subscription.php:176 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:175 -msgctxt "email type" -msgid "Plain text" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:204 -#: includes/core/emails/class-wcs-email-expired-subscription.php:177 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:176 -msgctxt "email type" -msgid "HTML" -msgstr "" - -#: includes/core/emails/class-wcs-email-cancelled-subscription.php:205 -#: includes/core/emails/class-wcs-email-expired-subscription.php:178 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:177 -msgctxt "email type" -msgid "Multipart" -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-renewal-order.php:24 -msgid "Completed Renewal Order" -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-renewal-order.php:25 -msgid "Renewal order complete emails are sent to the customer when a subscription renewal order is marked complete and usually indicates that the item for that renewal period has been shipped." -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-renewal-order.php:28 -msgctxt "Default email heading for email to customer on completed renewal order" -msgid "Your renewal order is complete" -msgstr "" - -#. translators: $1: {site_title}, $2: {order_date}, variables that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-completed-renewal-order.php:30 -#, php-format -msgctxt "Default email subject for email to customer on completed renewal order" -msgid "Your %1$s renewal order from %2$s is complete" -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-switch-order.php:30 -msgid "Subscription Switch Complete" -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-switch-order.php:31 -msgid "Subscription switch complete emails are sent to the customer when a subscription is switched successfully." -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-switch-order.php:34 -msgid "Your subscription change is complete" -msgstr "" - -#: includes/core/emails/class-wcs-email-completed-switch-order.php:35 -msgid "Your {site_title} subscription change from {order_date} is complete" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-renewal.php:24 -msgid "Customer Notification: Automatic renewal notice" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-renewal.php:25 -msgid "Customer Notification: Automatic renewal notice emails are sent when customer's subscription is about to be renewed automatically." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-renewal.php:27 -msgid "Automatic renewal notice" -msgstr "" - -#. translators: $1: {site_title}, $2: {customers_first_name}, $3: {time_until_renewal}, variables that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-customer-notification-auto-renewal.php:31 -#, php-format -msgctxt "default email subject for subscription's automatic renewal notice" -msgid "[%1$s] %2$s, your subscription automatically renews in %3$s!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-renewal.php:57 -msgid "Thank you for being a loyal customer, {customers_first_name} — we appreciate your business." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-trial-expiration.php:24 -msgid "Customer Notification: Free trial expiration: automatic payment notice" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-trial-expiration.php:25 -msgid "Free trial expiry notification emails are sent when customer's free trial for an automatically renewd subscription is about to expire." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-auto-trial-expiration.php:27 -msgid "Free trial expiration: automatic payment notice" -msgstr "" - -#. translators: $1: {site_title}, $2: {customers_first_name}, variables that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-customer-notification-auto-trial-expiration.php:29 -#, php-format -msgctxt "default email subject for free trial expiry notification emails sent to the customer" -msgid "[%1$s] %2$s, your paid subscription starts soon!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-renewal.php:24 -msgid "Customer Notification: Manual renewal notice" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-renewal.php:25 -msgid "Customer Notification: Manual renewal notice are sent when customer's subscription needs to be manually renewed." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-renewal.php:27 -msgid "Manual renewal notice" -msgstr "" - -#. translators: $1: {site_title}, $2: {customers_first_name}, variables that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-customer-notification-manual-renewal.php:29 -#, php-format -msgctxt "default email subject for notification for a manually renewed subscription sent to the customer" -msgid "[%1$s] %2$s, your subscription is ready to be renewed!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-renewal.php:51 -msgid "Thanks again for choosing {site_title}." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-trial-expiration.php:25 -msgid "Customer Notification: Free trial expiration: manual payment required" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-trial-expiration.php:26 -msgid "Free trial expiry notification emails are sent when customer's free trial for a manually renewed subscription is about to expire." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-manual-trial-expiration.php:28 -msgid "Free trial expiration: manual payment required" -msgstr "" - -#. translators: $1: {site_title}, $2: {customers_first_name}, variables that will be substituted when email is sent out. -#: includes/core/emails/class-wcs-email-customer-notification-manual-trial-expiration.php:30 -#, php-format -msgctxt "default email subject for an email notification for a manually renewed subscription with free trial expiry emails sent to the customer" -msgid "[%1$s] %2$s, your free trial is almost up!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-subscription-expiration.php:24 -msgid "Customer Notification: Subscription expiration notice" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-subscription-expiration.php:25 -msgid "Subscription expiration notification emails are sent when customer's subscription is about to expire." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-subscription-expiration.php:27 -msgid "Subscription expiration notice" -msgstr "" - -#. translators: $1: {site_title}, $2: {customers_first_name}, variables that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-customer-notification-subscription-expiration.php:29 -#, php-format -msgctxt "default email subject for subscription expiry notification email sent to the customer" -msgid "[%1$s] %2$s, your subscription is about to expire!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification-subscription-expiration.php:51 -msgid "Thank you for choosing {site_title}, {customers_first_name}." -msgstr "" - -#. translators: %s: list of placeholders -#: includes/core/emails/class-wcs-email-customer-notification.php:32 -#, php-format -msgid "Available placeholders: %s" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:35 -msgid "Enable/Disable" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:37 -msgid "Enable this email notification. Disabled automatically on staging sites." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:41 -msgid "Subject" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:49 -msgid "Email heading" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:57 -msgid "Additional content" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:58 -msgid "Text to appear below the main email content." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:66 -msgid "Email type" -msgstr "" - -#. translators: 1: Notification type, 2: customer's email. -#: includes/core/emails/class-wcs-email-customer-notification.php:101 -#, php-format -msgid "%1$s was successfully sent to %2$s." -msgstr "" - -#. translators: 1: Notification type, 2: customer's email. -#: includes/core/emails/class-wcs-email-customer-notification.php:104 -#, php-format -msgid "Attempt to send %1$s to %2$s failed." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:253 -msgid "Thank you for choosing {site_title}!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:271 -msgid "Reminder emails disabled." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:277 -msgid "Not a production site, or notifications have been globally disabled" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:281 -msgid "Recipient not found" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-notification.php:285 -msgid "Subscription billing cycle too short" -msgstr "" - -#. translators: %1$s: email title, %2$s: list of reasons why email was skipped. -#: includes/core/emails/class-wcs-email-customer-notification.php:304 -#, php-format -msgid "Skipped sending \"%1$s\": %2$s" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-on-hold-renewal-order.php:22 -msgid "On-hold Renewal Order" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-on-hold-renewal-order.php:23 -msgid "This is an order notification sent to customers containing order details after a renewal order is placed on-hold." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-on-hold-renewal-order.php:24 -msgid "Your {site_title} renewal order has been received!" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-on-hold-renewal-order.php:25 -msgid "Thank you for your renewal order" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:39 -msgid "Customer Renewal Invoice" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:40 -msgid "Sent to a customer when the subscription is due for renewal and the renewal requires a manual payment, either because it uses manual renewals or the automatic recurring payment failed for the initial attempt and all automatic retries (if any). The email contains renewal order information and payment links." -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:47 -msgid "Invoice for renewal order {order_number} from {order_date}" -msgstr "" - -#: includes/core/emails/class-wcs-email-customer-renewal-invoice.php:48 -msgid "Invoice for renewal order {order_number}" -msgstr "" - -#: includes/core/emails/class-wcs-email-expired-subscription.php:25 -msgid "Expired Subscription" -msgstr "" - -#: includes/core/emails/class-wcs-email-expired-subscription.php:26 -msgid "Expired Subscription emails are sent when a customer's subscription expires." -msgstr "" - -#: includes/core/emails/class-wcs-email-expired-subscription.php:28 -msgid "Subscription Expired" -msgstr "" - -#. translators: placeholder is {site_title}, a variable that will be substituted when email is sent out -#: includes/core/emails/class-wcs-email-expired-subscription.php:30 -#, php-format -msgctxt "default email subject for expired emails sent to the admin" -msgid "[%s] Subscription Expired" -msgstr "" - -#: includes/core/emails/class-wcs-email-expired-subscription.php:77 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:76 -msgid "Subscription argument passed in is not an object." -msgstr "" - -#. translators: %s: default e-mail heading. -#: includes/core/emails/class-wcs-email-expired-subscription.php:165 -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:164 -#, php-format -msgid "This controls the main heading contained within the email notification. Leave blank to use the default heading: %s." -msgstr "" - -#: includes/core/emails/class-wcs-email-new-renewal-order.php:21 -msgid "New Renewal Order" -msgstr "" - -#: includes/core/emails/class-wcs-email-new-renewal-order.php:22 -msgid "New renewal order emails are sent when a subscription renewal payment is processed." -msgstr "" - -#: includes/core/emails/class-wcs-email-new-renewal-order.php:24 -msgid "New subscription renewal order" -msgstr "" - -#: includes/core/emails/class-wcs-email-new-renewal-order.php:25 -msgid "[{site_title}] New subscription renewal order ({order_number}) - {order_date}" -msgstr "" - -#: includes/core/emails/class-wcs-email-new-switch-order.php:26 -#: includes/core/emails/class-wcs-email-new-switch-order.php:29 -msgid "Subscription Switched" -msgstr "" - -#: includes/core/emails/class-wcs-email-new-switch-order.php:27 -msgid "Subscription switched emails are sent when a customer switches a subscription." -msgstr "" - -#: includes/core/emails/class-wcs-email-new-switch-order.php:30 -msgid "[{site_title}] Subscription Switched ({order_number}) - {order_date}" -msgstr "" - -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:25 -msgid "Suspended Subscription" -msgstr "" - -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:26 -msgid "Suspended Subscription emails are sent when a customer manually suspends their subscription." -msgstr "" - -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:28 -msgid "Subscription Suspended" -msgstr "" - -#: includes/core/emails/class-wcs-email-on-hold-subscription.php:29 -msgctxt "default email subject for suspended emails sent to the admin" -msgid "[{site_title}] Subscription Suspended" -msgstr "" - -#: includes/core/emails/class-wcs-email-processing-renewal-order.php:23 -msgid "Processing Renewal order" -msgstr "" - -#: includes/core/emails/class-wcs-email-processing-renewal-order.php:24 -msgid "This is an order notification sent to the customer after payment for a subscription renewal order is completed. It contains the renewal order details." -msgstr "" - -#: includes/core/emails/class-wcs-email-processing-renewal-order.php:27 -#: includes/gifting/emails/class-wcsg-email-processing-renewal-order.php:33 -msgid "Thank you for your order" -msgstr "" - -#: includes/core/emails/class-wcs-email-processing-renewal-order.php:28 -msgid "Your {site_title} renewal order receipt from {order_date}" -msgstr "" - -#. translators: 1-2: opening/closing tags - link to documentation. -#: includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php:176 -#, php-format -msgid "Sorry, it seems there are no available payment methods which support subscriptions. Please see %1$sEnabling Payment Gateways for Subscriptions%2$s if you require assistance." -msgstr "" - -#: includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php:178 -msgid "Sorry, it seems there are no available payment methods which support subscriptions. Please contact us if you require assistance or wish to make alternate arrangements." -msgstr "" - -#: includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php:269 -msgid "Supported features:" -msgstr "" - -#: includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php:272 -msgid "Subscription features:" -msgstr "" - -#: includes/core/gateways/class-wc-subscriptions-core-payment-gateways.php:276 -msgid "Change payment features:" -msgstr "" - -#. Translators: placeholder is a 0 price formatted with the the store's currency and decimal settings. -#: includes/core/gateways/class-wc-subscriptions-gateway-restrictions-manager.php:44 -#, php-format -msgid "Please enter a price greater than %s." -msgstr "" - -#. Translators: Placeholder is a localized price string (eg. $1.00). -#: includes/core/gateways/class-wc-subscriptions-gateway-restrictions-manager.php:64 -#, php-format -msgid "Warning! Your store cannot create subscriptions less than %s" -msgstr "" - -#: includes/core/gateways/paypal/class-wcs-paypal.php:223 -msgid "Unable to find order for PayPal billing agreement." -msgstr "" - -#: includes/core/gateways/paypal/class-wcs-paypal.php:285 -msgid "An error occurred, please try again or try an alternate form of payment." -msgstr "" - -#: includes/core/gateways/paypal/class-wcs-paypal.php:365 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:208 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:320 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:336 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:365 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:384 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-request.php:150 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-request.php:156 -msgctxt "hash before the order number. Used as a character to remove from the actual order number" -msgid "#" -msgstr "" - -#. translators: placeholders are PayPal API error code and PayPal API error message -#: includes/core/gateways/paypal/class-wcs-paypal.php:389 -#, php-format -msgid "PayPal API error: (%1$d) %2$s" -msgstr "" - -#. translators: placeholder is PayPal transaction status message -#: includes/core/gateways/paypal/class-wcs-paypal.php:394 -#, php-format -msgid "PayPal Transaction Held: %s" -msgstr "" - -#. translators: placeholder is PayPal transaction status message -#: includes/core/gateways/paypal/class-wcs-paypal.php:406 -#, php-format -msgid "PayPal payment declined: %s" -msgstr "" - -#. translators: placeholder is a transaction ID. -#: includes/core/gateways/paypal/class-wcs-paypal.php:410 -#, php-format -msgid "PayPal payment approved (ID: %s)" -msgstr "" - -#: includes/core/gateways/paypal/class-wcs-paypal.php:469 -msgid "" -"Are you sure you want to change the payment method from PayPal standard?\n" -"\n" -"This will suspend the subscription at PayPal." -msgstr "" - -#: includes/core/gateways/paypal/class-wcs-paypal.php:649 -msgctxt "used in User Agent data sent to PayPal to help identify where a payment came from" -msgid "WooCommerce Subscriptions PayPal" -msgstr "" - -#. translators: $1 and $2 are opening and closing strong tags, respectively. -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:63 -#, php-format -msgid "It is %1$sstrongly recommended you do not change the Receiver Email address%2$s if you have active subscriptions with PayPal. Doing so can break existing subscriptions." -msgstr "" - -#. translators: placeholders are opening and closing link tags. 1$-2$: to docs on woocommerce, 3$-4$ to gateway settings on the site -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:114 -#, php-format -msgid "PayPal is inactive for subscription transactions. Please %1$sset up the PayPal IPN%2$s and %3$senter your API credentials%4$s to enable PayPal for Subscriptions." -msgstr "" - -#. translators: opening/closing tags - links to documentation. -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:126 -#, php-format -msgid "%1$sPayPal Reference Transactions are not enabled on your account%2$s, some subscription management features are not enabled. Please contact PayPal and request they %3$senable PayPal Reference Transactions%4$s on your account. %5$sCheck PayPal Account%6$s %3$sLearn more %7$s" -msgstr "" - -#. translators: opening/closing tags - links to documentation. -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:130 -#, php-format -msgid "%1$sPayPal Reference Transactions are not enabled on your account%2$s. If you wish to use PayPal Reference Transactions with Subscriptions, please contact PayPal and request they %3$senable PayPal Reference Transactions%4$s on your account. %5$sCheck PayPal Account%6$s %3$sLearn more %7$s" -msgstr "" - -#. translators: placeholders are opening and closing strong tags. -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:152 -#, php-format -msgid "%1$sPayPal Reference Transactions are enabled on your account%2$s. All subscription management features are now enabled. Happy selling!" -msgstr "" - -#. translators: placeholders are link opening and closing tags. 1$-2$: to gateway settings, 3$-4$: support docs on woocommerce.com -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:163 -#, php-format -msgid "There is a problem with PayPal. Your API credentials may be incorrect. Please update your %1$sAPI credentials%2$s. %3$sLearn more%4$s." -msgstr "" - -#. translators: placeholders are opening and closing link tags. 1$-2$: docs on woocommerce, 3$-4$: dismiss link -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:176 -#, php-format -msgid "There is a problem with PayPal. Your PayPal account is issuing out-of-date subscription IDs. %1$sLearn more%2$s. %3$sDismiss%4$s." -msgstr "" - -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:198 -msgid "Ignore this error (not recommended)" -msgstr "" - -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:203 -msgid "Open a ticket" -msgstr "" - -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:290 -msgid "PayPal Subscription ID:" -msgstr "" - -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:316 -msgid "Enable PayPal Standard for Subscriptions" -msgstr "" - -#. translators: Placeholders are the opening and closing link tags. -#: includes/core/gateways/paypal/includes/admin/class-wcs-paypal-admin.php:324 -#, php-format -msgid "Before enabling PayPal Standard for Subscriptions, please note, when using PayPal Standard, customers are locked into using PayPal Standard for the life of their subscription, and PayPal Standard has a number of limitations. Please read the guide on %1$swhy we don't recommend PayPal Standard%2$s for Subscriptions before choosing to enable this option." -msgstr "" - -#. translators: placeholder is blogname -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:71 -#, php-format -msgctxt "data sent to paypal" -msgid "Orders with %s" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:279 -msgid "Total Discount" -msgstr "" - -#. translators: placeholder is blogname -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:306 -#, php-format -msgid "%s - Order" -msgstr "" - -#. translators: 1$: new status (e.g. "Cancel"), 2$: blog name -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:416 -#, php-format -msgctxt "data sent to paypal" -msgid "%1$s subscription event triggered at %2$s" -msgstr "" - -#. translators: %s: product SKU. -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-request.php:536 -#, php-format -msgid "SKU: %s" -msgstr "" - -#. translators: placeholder is localised datetime -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-response-payment.php:119 -#, php-format -msgid "expected clearing date %s" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-response.php:136 -msgctxt "used in api error message if there is no severity code from PayPal" -msgid "Error" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-response.php:138 -msgctxt "used in api error message if there is no long message" -msgid "Unknown error" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-api-response.php:150 -#: templates/admin/deprecated/order-shipping-html.php:14 -#: templates/admin/deprecated/order-tax-html.php:9 -msgctxt "no information about something" -msgid "N/A" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-reference-transaction-ipn-handler.php:94 -msgid "Billing agreement cancelled at PayPal." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:275 -msgctxt "when it is a payment change, and there is a subscr_signup message, this will be a confirmation message that PayPal accepted it being the new payment method" -msgid "IPN subscription payment method changed to PayPal." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:279 -msgid "IPN subscription sign up completed." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:332 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:416 -msgid "IPN subscription payment completed." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:378 -msgid "IPN subscription failing payment method changed." -msgstr "" - -#. translators: placeholder is payment status (e.g. "completed") -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:426 -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:435 -#, php-format -msgctxt "used in order note" -msgid "IPN subscription payment %s." -msgstr "" - -#. translators: 1: payment status (e.g. "completed"), 2: pending reason. -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:439 -#, php-format -msgctxt "used in order note" -msgid "IPN subscription payment %1$s for reason: %2$s." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:468 -msgid "IPN subscription suspended." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:491 -msgid "IPN subscription cancelled." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:507 -msgid "IPN subscription payment failure." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-ipn-handler.php:649 -msgid "Invalid PayPal IPN Payload: unable to find matching subscription." -msgstr "" - -#. translators: 1$: subscription ID, 2$: names of items, comma separated -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-request.php:75 -#, php-format -msgctxt "item name sent to paypal" -msgid "Subscription %1$s - %2$s" -msgstr "" - -#. translators: 1$: subscription ID, 2$: order ID, 3$: names of items, comma separated -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-request.php:78 -#, php-format -msgctxt "item name sent to paypal" -msgid "Subscription %1$s (Order %2$s) - %3$s" -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-standard-switcher.php:271 -msgid "Subscription changed from PayPal Standard to PayPal Reference Transactions via customer initiated switch. The PayPal Standard subscription has been suspended." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-status-manager.php:42 -msgid "Subscription cancelled with PayPal." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-status-manager.php:53 -msgid "Subscription suspended with PayPal." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-status-manager.php:66 -msgid "Subscription reactivated with PayPal." -msgstr "" - -#: includes/core/gateways/paypal/includes/class-wcs-paypal-status-manager.php:113 -msgid "PayPal API error - credentials are incorrect." -msgstr "" - -#: includes/core/gateways/paypal/includes/templates/html-ipn-failure-notice.php:18 -#, php-format -msgid "A fatal error has occurred while processing a recent subscription payment with PayPal. Please %1$sopen a new ticket at WooCommerce Support%3$s immediately to get this resolved. See our documentation on %2$sdebugging IPN issues in PayPal Standard to Learn more »%3$s" -msgstr "" - -#: includes/core/gateways/paypal/includes/templates/html-ipn-failure-notice.php:26 -msgid "Last recorded error:" -msgstr "" - -#: includes/core/gateways/paypal/includes/templates/html-ipn-failure-notice.php:36 -#, php-format -msgid "To see the full error, view the %1$s log file from the %2$sWooCommerce logs screen.%3$s." -msgstr "" - -#. Translators: %s subscription number. -#: includes/core/privacy/class-wcs-privacy-erasers.php:71 -#, php-format -msgid "Removed personal data from subscription %s." -msgstr "" - -#. Translators: %s subscription number. -#: includes/core/privacy/class-wcs-privacy-erasers.php:75 -#, php-format -msgid "Personal data within subscription %s has been retained." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-erasers.php:189 -msgid "Personal data removed." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:77 -msgid "Subscription Number" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:78 -msgid "Created Date" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:79 -msgid "Recurring Total" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:80 -msgid "Subscription Items" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:81 -msgid "IP Address" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:82 -msgid "Browser User Agent" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:83 -#: includes/core/wcs-functions.php:275 -msgid "Billing Address" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:84 -#: includes/core/wcs-functions.php:274 -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:191 -#: templates/gifting/new-recipient-account.php:39 -msgid "Shipping Address" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:85 -msgid "Phone Number" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy-exporters.php:86 -msgid "Email Address" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:52 -#: includes/core/privacy/class-wcs-privacy.php:53 -msgid "Subscriptions Data" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:103 -msgid "By using WooCommerce Subscriptions, you may be storing personal data and depending on which third-party payment processors you’re using to take subscription payments, you may be sharing personal data with external sources." -msgstr "" - -#. translators: placeholders are opening and closing link tags, linking to additional privacy policy documentation. -#: includes/core/privacy/class-wcs-privacy.php:105 -msgid "What we collect and store" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:106 -msgid "For the purposes of processing recurring subscription payments, we store the customer's name, billing address, shipping address, email address, phone number and credit card/payment details." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:107 -msgid "What we share with others" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:108 -msgid "What personal information your store shares with external sources depends on which third-party payment processor plugins you are using to collect subscription payments. We recommend that you consult with their privacy policies to inform this section of your privacy policy." -msgstr "" - -#. translators: placeholders are opening and closing link tags, linking to additional privacy policy documentation. -#: includes/core/privacy/class-wcs-privacy.php:110 -#, php-format -msgid "If you are using PayPal Standard or PayPal Reference transactions please see the %1$sPayPal Privacy Policy%2$s for more details." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:123 -#: includes/core/privacy/class-wcs-privacy.php:371 -msgid "Cancel and remove personal data" -msgstr "" - -#. translators: %d: number of subscriptions affected. -#: includes/core/privacy/class-wcs-privacy.php:221 -#, php-format -msgid "Removed personal data from %d subscription." -msgid_plural "Removed personal data from %d subscriptions." -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholders are opening and closing tags. -#: includes/core/privacy/class-wcs-privacy.php:240 -#, php-format -msgid "%1$sNote:%2$s Orders which are related to subscriptions will not be included in the orders affected by these settings." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:260 -msgid "account erasure request" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:266 -msgid "Remove personal data from subscriptions" -msgstr "" - -#. Translators: %s URL to erasure request screen. -#: includes/core/privacy/class-wcs-privacy.php:268 -#, php-format -msgid "When handling an %s, should personal data within subscriptions be retained or removed?" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:277 -msgid "Retain ended subscriptions" -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:278 -msgid "Retain ended subscriptions and their related orders for a specified duration before anonymizing the personal data within them." -msgstr "" - -#: includes/core/privacy/class-wcs-privacy.php:322 -msgid "Customers with a subscription are excluded from this setting." -msgstr "" - -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:302 -msgid "A database upgrade is required to use Subscriptions. Upgrades from the previously installed version is no longer supported. You will need to install an older version of WooCommerce Subscriptions or WooCommerce Payments to proceed with the upgrade before you can use a newer version." -msgstr "" - -#. translators: 1-2: opening/closing tags, 3: active version of Subscriptions, 4: current version of Subscriptions, 5-6: opening/closing tags linked to ticket form, 7-8: opening/closing tags linked to documentation. -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:364 -#, php-format -msgid "%1$sWarning!%2$s It appears that you have downgraded %1$sWooCommerce Subscriptions%2$s from %3$s to %4$s. Downgrading the plugin in this way may cause issues. Please update to %3$s or higher, or %5$sopen a new support ticket%6$s for further assistance. %7$sLearn more »%8$s" -msgstr "" - -#. translators: placeholder is a list of version numbers (e.g. "1.3 & 1.4 & 1.5") -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:503 -#, php-format -msgid "Database updated to version %s" -msgstr "" - -#. translators: placeholder is number of upgraded subscriptions -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:511 -#, php-format -msgctxt "used in the subscriptions upgrader" -msgid "Marked %s subscription products as \"sold individually\"." -msgstr "" - -#. translators: 1$: number of action scheduler hooks upgraded, 2$: "{execution_time}", will be replaced on front end with actual time -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:520 -#, php-format -msgid "Migrated %1$s subscription related hooks to the new scheduler (in %2$s seconds)." -msgstr "" - -#. translators: 1$: number of subscriptions upgraded, 2$: "{execution_time}", will be replaced on front end with actual time it took -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:532 -#, php-format -msgid "Migrated %1$s subscriptions to the new structure (in %2$s seconds)." -msgstr "" - -#. translators: placeholder is "{time_left}", will be replaced on front end with actual time -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:535 -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:581 -#, php-format -msgctxt "Message that gets sent to front end." -msgid "Estimated time left (minutes:seconds): %s" -msgstr "" - -#. translators: 1$: error message, 2$: opening link tag, 3$: closing link tag, 4$: break tag -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:545 -#, php-format -msgid "Unable to upgrade subscriptions.%4$sError: %1$s%4$sPlease refresh the page and try again. If problem persists, %2$scontact support%3$s." -msgstr "" - -#. translators: placeholder is the number of subscriptions repaired -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:560 -#, php-format -msgctxt "Repair message that gets sent to front end." -msgid "Repaired %d subscriptions with incorrect dates, line tax data or missing customer notes." -msgstr "" - -#. translators: placeholder is number of subscriptions that were checked and did not need repairs. There's a space at the beginning! -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:566 -#, php-format -msgctxt "Repair message that gets sent to front end." -msgid " %d other subscription was checked and did not need any repairs." -msgid_plural "%d other subscriptions were checked and did not need any repairs." -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is "{execution_time}", which will be replaced on front end with actual time -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:570 -#, php-format -msgctxt "Repair message that gets sent to front end." -msgid "(in %s seconds)" -msgstr "" - -#. translators: $1: "Repaired x subs with incorrect dates...", $2: "X others were checked and no repair needed", $3: "(in X seconds)". Ordering for RTL languages. -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:573 -#, php-format -msgctxt "The assembled repair message that gets sent to front end." -msgid "%1$s%2$s %3$s" -msgstr "" - -#. translators: 1$: error message, 2$: opening link tag, 3$: closing link tag, 4$: break tag -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:592 -#, php-format -msgctxt "Error message that gets sent to front end when upgrading Subscriptions" -msgid "Unable to repair subscriptions.%4$sError: %1$s%4$sPlease refresh the page and try again. If problem persists, %2$scontact support%3$s." -msgstr "" - -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:800 -msgid "Welcome to WooCommerce Subscriptions 2.1" -msgstr "" - -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:800 -msgid "About WooCommerce Subscriptions" -msgstr "" - -#. translators: 1-2: opening/closing tags, 3-4: opening/closing tags linked to ticket form. -#: includes/core/upgrades/class-wc-subscriptions-upgrader.php:1038 -#, php-format -msgid "%1$sWarning!%2$s We discovered an issue in %1$sWooCommerce Subscriptions 2.3.0 - 2.3.2%2$s that may cause your subscription renewal order and customer subscription caches to contain invalid data. For information about how to update the cached data, please %3$sopen a new support ticket%4$s." -msgstr "" - -#: includes/core/upgrades/class-wcs-repair-suspended-paypal-subscriptions.php:56 -msgid "Subscription suspended by Database repair script. This subscription was suspended via PayPal." -msgstr "" - -#: includes/core/upgrades/class-wcs-upgrade-2-2-7.php:63 -msgid "Subscription end date in the past" -msgstr "" - -#. translators: placeholder is Subscription version string ('2.3') -#: includes/core/upgrades/templates/update-welcome-notice.php:2 -#: includes/core/upgrades/templates/wcs-about-2-0.php:23 -#: includes/core/upgrades/templates/wcs-about.php:22 -msgid "Thank you for updating to the latest version of WooCommerce Subscriptions." -msgstr "" - -#. translators: placeholder $1 is the Subscription version string ('2.3'), $2-3 are opening and closing tags -#: includes/core/upgrades/templates/update-welcome-notice.php:5 -#, php-format -msgid "Version %1$s brings some new improvements requested by store managers just like you (and possibly even by %2$syou%3$s)." -msgstr "" - -#: includes/core/upgrades/templates/update-welcome-notice.php:6 -#: includes/core/upgrades/templates/wcs-about-2-0.php:25 -#: includes/core/upgrades/templates/wcs-about.php:24 -msgid "We hope you enjoy it!" -msgstr "" - -#: includes/core/upgrades/templates/update-welcome-notice.php:8 -msgid "What's new?" -msgstr "" - -#. translators: placeholder is Subscription version string ('2.3') -#: includes/core/upgrades/templates/update-welcome-notice.php:16 -#, php-format -msgid "Want to know more about Subscriptions %s?" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:20 -msgid "Welcome to Subscriptions 2.0" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:24 -msgid "Version 2.0 has been in development for more than a year. We've reinvented the extension to take into account 3 years of feedback from store managers." -msgstr "" - -#. translators: placeholder is version number -#: includes/core/upgrades/templates/wcs-about-2-0.php:31 -#: includes/core/upgrades/templates/wcs-about.php:30 -#, php-format -msgid "Version %s" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:42 -#: includes/core/upgrades/templates/wcs-about.php:41 -msgid "Check Out What's New" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:51 -msgid "Multiple Subscriptions" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:52 -msgid "It's now easier for your customers to buy more subscriptions!" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:53 -msgid "Customers can now purchase different subscription products in one transaction. The products can bill on any schedule and have any combination of sign-up fees and/or free trials." -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:56 -#, php-format -msgid "Learn more about the new %smultiple subscriptions%s feature." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:68 -msgid "New Add/Edit Subscription Screen" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:69 -msgid "Subscriptions v2.0 introduces a new administration interface to add or edit a subscription. You can make all the familiar changes, like modifying recurring totals or subscription status. You can also make some new modifications, like changing the expiration date, adding a shipping cost or adding a product line item." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:72 -#, php-format -msgid "The new interface is also built on the existing %sEdit Order%s screen. If you've ever modified an order, you already know how to modify a subscription." -msgstr "" - -#. translators: placeholders are link tags: 1$-2$ new subscription page, 3$-4$: docs on woocommerce.com -#: includes/core/upgrades/templates/wcs-about-2-0.php:76 -#, php-format -msgid "%1$sAdd a subscription%2$s now or %3$slearn more%4$s about the new interface." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:87 -msgid "New View Subscription Page" -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:91 -#, php-format -msgid "Your customers can now view the full details of a subscription, including line items, billing and shipping address, billing schedule and renewal orders, from a special %sMy Account > View Subscription%s page." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:93 -msgid "This new page is also where the customer can suspend or cancel their subscription, change payment method, change shipping address or upgrade/downgrade an item." -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:97 -#, php-format -msgid "Learn more about the new %sView Subscription page%s." -msgstr "" - -#. translators: placeholders are for opening and closing link () tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:111 -#, php-format -msgid "By default, adding new files to an existing subscription product will automatically provide active subscribers with access to the new files. However, now you can enable a %snew content dripping setting%s to provide subscribers with access to new files only after the next renewal payment." -msgstr "" - -#. translators: placeholders are for opening and closing link () tags -#. translators: placeholders are opening and closing anchor tags linking to documentation -#: includes/core/upgrades/templates/wcs-about-2-0.php:115 -#: includes/core/upgrades/templates/wcs-about-2-0.php:128 -#: includes/core/upgrades/templates/wcs-about-2-0.php:141 -#: includes/core/upgrades/templates/wcs-about.php:120 -#: includes/core/upgrades/templates/wcs-about.php:131 -#: includes/core/upgrades/templates/wcs-about.php:142 -#: includes/core/upgrades/templates/wcs-about.php:170 -#: includes/core/upgrades/templates/wcs-about.php:191 -#, php-format -msgid "%sLearn more »%s" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:121 -msgctxt "h3 on the About Subscriptions page for this new feature" -msgid "Change Payment Method" -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:124 -#, php-format -msgid "For a store manager to change a subscription from automatic to manual renewal payments (or manual to automatic) with Subscriptions v1.5, the database needed to be modified directly. Subscriptions now provides a way for payment gateways to allow you to change that from the new %sEdit Subscription%s interface." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:134 -msgid "Change Trial and End Dates" -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:137 -#, php-format -msgid "It was already possible to change a subscription's next payment date, but some store managers wanted to provide a customer with an extended free trial or add an extra month to the expiration date. Now you can change all of these dates from the %sEdit Subscription%s screen." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:150 -msgid "And much more..." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:157 -#: includes/core/upgrades/templates/wcs-about.php:151 -msgid "Peek Under the Hood for Developers" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:158 -msgid "Subscriptions 2.0 introduces a new architecture built on the WooCommerce Custom Order Types API." -msgstr "" - -#. translators: placeholders are opening and closing code tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:164 -#, php-format -msgid "New %sshop_subscription%s Post Type" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:166 -msgid "By making a subscription a Custom Order Type, a subscription is also now a custom post type. This makes it faster to query subscriptions and it uses a database schema that is as scalable as WordPress posts and pages." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:169 -#, php-format -msgid "Developers can also now use all the familiar WordPress functions, like %sget_posts()%s, to query or modify subscription data." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about-2-0.php:175 -#, php-format -msgid "New %sWC_Subscription%s Object" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:177 -msgid "Subscriptions 2.0 introduces a new object for working with a subscription at the application level. The cumbersome APIs for retrieving or modifying a subscription's data are gone!" -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about-2-0.php:180 -#, php-format -msgid "Because the %sWC_Subscription%s class extends %sWC_Order%s, you can use its familiar methods, like %s$subscription->update_status()%s or %s$subscription->get_total()%s." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:184 -msgid "REST API Endpoints" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:185 -msgid "We didn't just improve interfaces for humans, we also improved them for computers. Your applications can now create, read, update or delete subscriptions via RESTful API endpoints." -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about-2-0.php:188 -#, php-format -msgid "Want to list all the subscriptions on a site? Get %sexample.com/wc-api/v2/subscriptions/%s. Want the details of a specific subscription? Get %s/wc-api/v2/subscriptions//%s." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about-2-0.php:194 -msgid "Go to WooCommerce Subscriptions Settings" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:19 -msgid "Welcome to Subscriptions 2.1!" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:23 -#, php-format -msgid "Version 2.1 introduces some great new features requested by store managers just like you (and possibly even by %syou%s)." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:35 -msgctxt "short for documents" -msgid "Documentation" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:49 -msgid "Subscription Reports" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:50 -msgid "How many customers stay subscribed for more than 6 months? What is the average lifetime value of your subscribers? How much renewal revenue will your store earn next month?" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:51 -msgid "These are important questions for any subscription commerce business." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:52 -msgid "Prior to Subscriptions 2.1, they were not easy to answer. Subscriptions 2.1 introduces new reports to answer these questions, and many more." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:54 -msgid "View Reports" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:55 -msgctxt "learn more link to subscription reports documentation" -msgid "Learn More" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:67 -msgid "Automatic Failed Payment Retry" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:68 -msgid "Failed recurring payments can now be retried automatically. This helps recover revenue that would otherwise be lost due to payment methods being declined only temporarily." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:69 -msgid "By default, Subscriptions will retry the payment 5 times over 7 days. The rules that control the retry system can be modified to customise:" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:71 -msgid "the total number of retry attempts" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:72 -msgid "how long to wait between retry attempts" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:73 -msgid "emails sent to the customer and store manager" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:74 -msgid "the status applied to the renewal order and subscription" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:76 -msgid "The retry system is disabled by default. To enable it, visit the Subscriptions settings administration screen." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:78 -msgid "Enable Automatic Retry" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:79 -msgctxt "learn more link to failed payment retry documentation" -msgid "Learn More" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:90 -msgid "New Subscription Emails" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:91 -msgid "Subscriptions 2.1 also introduces a number of new emails to notify you when:" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:93 -msgid "a customer suspends a subscription" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:94 -msgid "an automatic payment fails" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:95 -msgid "a subscription expires" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:97 -#, php-format -msgid "These emails can be enabled, disabled and customised under the %sWooCommerce > Settings > Emails%s administration screen." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:99 -msgid "View Email Settings" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:100 -msgctxt "learn more link to subscription emails documentation" -msgid "Learn More" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:108 -msgid "But wait, there's more!" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:109 -msgid "That's not all we've working on for the last 12 months when it comes to Subscriptions. We've also released mini-extensions to help you get the most from your subscription store." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:115 -msgid "Subscription Gifting" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:116 -msgid "What happens when a customer wants to purchase a subscription product for someone else?" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:117 -msgid "The Gifting extension makes it possible for one person to purchase a subscription product for someone else. It then shares control of the subscription between the purchaser and recipient, allowing both to manage the subscription over its lifecycle." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:126 -msgctxt "h3 on the About Subscriptions page for this new feature" -msgid "Import/Export Subscriptions" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:127 -msgid "Import subscriptions to WooCommerce via CSV, or export your subscriptions from WooCommerce to a CSV with the WooCommerce Subscriptions Importer/Exporter extension." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:128 -msgid "This free extension makes it possible to migrate subscribers from 3rd party systems to WooCommerce. It also makes it possible to export your subscription data for analysis in spreadsheet tools or 3rd party apps." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:137 -msgid "Subscribe All the Things" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:138 -msgid "Want your customers to be able to subscribe to non-subscription products?" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:139 -msgid "With WooCommerce Subscribe All the Things, they can! This experimental extension is exploring how to convert any product, including Product Bundles and Composite Products, into a subscription product. It also offers customers a way to subscribe to a cart of non-subscription products." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about.php:157 -msgid "Customise Retry Rules" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:159 -msgid "The best part about the new automatic retry system is that the retry rules are completely customisable." -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about.php:162 -#, php-format -msgid "With the %s'wcs_default_retry_rules'%s filter, you can define a set of default rules to apply to all failed payments in your store." -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about.php:166 -#, php-format -msgid "To apply a specific rule based on certain conditions, like high value orders or an infrequent renewal schedule, you can use the retry specific %s'wcs_get_retry_rule'%s filter. This provides the ID of the renewal order for the failed payment, which can be used to find information about the products, subscription and totals to which the failed payment relates." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:174 -msgid "WP REST API Endpoints" -msgstr "" - -#. translators: $1: opening tag linking to WC API docs, $2: closing tag, $3: opening tag linking to WP API docs, $4: closing tag -#: includes/core/upgrades/templates/wcs-about.php:177 -#, php-format -msgid "WooCommerce 2.6 added support for %1$sREST API%2$s endpoints built on WordPress core's %3$sREST API%4$s infrastructure." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:179 -msgid "Subscriptions 2.1 adds support for subscription data to this infrastructure." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:180 -msgid "Your applications can now create, read, update or delete subscriptions via RESTful API endpoints with the same design as the latest version of WooCommerce's REST API endpoints." -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about.php:183 -#, php-format -msgid "Want to list all the subscriptions on a site? Get %s/wp-json/wc/v1/subscriptions%s." -msgstr "" - -#. translators: all placeholders are opening and closing tags, no need to order them -#: includes/core/upgrades/templates/wcs-about.php:187 -#, php-format -msgid "Want the details of a specific subscription? Get %s/wp-json/wc/v1/subscriptions//%s." -msgstr "" - -#. translators: placeholders are opening and closing code tags -#: includes/core/upgrades/templates/wcs-about.php:197 -msgid "Honour Renewal Order Data" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:199 -msgid "In previous versions of Subscriptions, the subscription total was passed to payment gateways as the amount to charge for automatic renewal payments. This made it unnecessarily complicated to add one-time fees or discounts to a renewal." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about.php:202 -#, php-format -msgid "Subscriptions 2.1 now passes the renewal order's total, making it possible to add a fee or discount to the renewal order with simple one-liners like %s$order->add_fee()%s or %s$order->add_coupon()%s." -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-about.php:206 -#, php-format -msgid "Subscriptions also now uses the renewal order to setup the cart for %smanual renewals%s, making it easier to add products or discounts to a single renewal paid manually." -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:212 -msgid "See the full guide to What's New in Subscriptions version 2.1 »" -msgstr "" - -#: includes/core/upgrades/templates/wcs-about.php:213 -msgid "Go to WooCommerce Subscriptions Settings »" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade-in-progress.php:24 -msgid "WooCommerce Subscriptions Update in Progress" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade-in-progress.php:30 -msgid "The Upgrade is in Progress" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade-in-progress.php:31 -msgid "The WooCommerce Subscriptions plugin is currently running its database upgrade routine." -msgstr "" - -#. translators: placeholder is number of seconds -#: includes/core/upgrades/templates/wcs-upgrade-in-progress.php:34 -#, php-format -msgid "If you received a server error and reloaded the page to find this notice, please refresh the page in %s seconds and the upgrade routine will recommence without issues." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade-in-progress.php:36 -msgid "Rest assured, although the update process may take a little while, it is coded to prevent defects, your site is safe and will be up and running again, faster than ever, shortly." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:19 -msgid "WooCommerce Subscriptions Update" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:29 -msgid "Database Update Required" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:30 -msgid "The WooCommerce Subscriptions plugin has been updated!" -msgstr "" - -#. translators: placeholders are opening and closing tags -#: includes/core/upgrades/templates/wcs-upgrade.php:33 -#, php-format -msgid "Before we send you on your way, we need to update your database to the newest version. If you do not have a recent backup of your site, %snow is the time to create one%s." -msgstr "" - -#. translators: 1$: number of subscriptions on site, 2$, lower estimate (minutes), 3$: upper estimate -#: includes/core/upgrades/templates/wcs-upgrade.php:38 -#, php-format -msgid "The full update process for the %1$d subscriptions on your site will take between %2$d and %3$d minutes." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:41 -msgid "The update process may take a little while, so please be patient." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:43 -msgid "Customers and other non-administrative users can browse and purchase from your store without interruption while the update is in progress." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:45 -msgctxt "text on submit button" -msgid "Update Database" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:49 -msgid "Update in Progress" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:50 -msgid "This page will display the results of the process as each batch of subscriptions is updated." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:51 -msgid "Please keep this page open until the update process completes. No need to refresh or restart the process." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:53 -msgid "Remember, although the update process may take a while, customers and other non-administrative users can browse and purchase from your store without interruption while the update is in progress." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:61 -msgid "Update Complete" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:62 -msgid "Your database has been updated successfully!" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:63 -msgid "Continue" -msgstr "" - -#. translators: $1: placeholder is number of weeks, 2$: path to the file -#: includes/core/upgrades/templates/wcs-upgrade.php:74 -#, php-format -msgid "To record the progress of the update a new log file was created. This file will be automatically deleted in %1$d weeks. If you would like to delete it sooner, you can find it in the %2$sWooCommerce logs screen%3$s." -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:79 -msgid "Update Error" -msgstr "" - -#: includes/core/upgrades/templates/wcs-upgrade.php:80 -msgid "There was an error with the update. Please refresh the page and try again." -msgstr "" - -#. translators: %s: shipping method label. -#: includes/core/wcs-cart-functions.php:95 -#: includes/core/wcs-cart-functions.php:101 -#, php-format -msgid "Shipping via %s" -msgstr "" - -#: includes/core/wcs-cart-functions.php:260 -msgctxt "shipping method price" -msgid "Free" -msgstr "" - -#: includes/core/wcs-cart-functions.php:285 -msgid "[Remove]" -msgstr "" - -#: includes/core/wcs-cart-functions.php:315 -msgid "Free shipping coupon" -msgstr "" - -#. translators: placeholder is price string, denotes tax included in cart/order total -#: includes/core/wcs-cart-functions.php:353 -#, php-format -msgctxt "includes tax" -msgid "(includes %s)" -msgstr "" - -#. translators: placeholder is a date -#: includes/core/wcs-cart-functions.php:428 -#, php-format -msgid "First renewal: %s" -msgstr "" - -#. translators: placeholder is either subscription key or a subscription id, or, failing that, empty (e.g. "145_21" or "145") -#: includes/core/wcs-deprecated-functions.php:180 -#, php-format -msgid "Could not get subscription. Most likely the subscription key does not refer to a subscription. The key was: \"%s\"." -msgstr "" - -#: includes/core/wcs-formatting-functions.php:41 -msgctxt "initial payment on a subscription" -msgid "up front" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount string (e.g. "£10 / month" ) -#: includes/core/wcs-formatting-functions.php:99 -#, php-format -msgid "%1$s %2$s then %3$s" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount string, 4$: payment day of the week (e.g. "$15 up front, then $10 every Wednesday") -#: includes/core/wcs-formatting-functions.php:113 -#, php-format -msgid "%1$s %2$s then %3$s every %4$s" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front" ), 3$: recurring amount, 4$: interval (e.g. "2nd week"), 5$: day of the week (e.g. "Thursday"); (e.g. "$10 up front, then $20 every 2nd week on Wednesday") -#: includes/core/wcs-formatting-functions.php:122 -#, php-format -msgid "%1$s %2$s then %3$s every %4$s on %5$s" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount; (e.g. "$10 up front then $30 on the last day of each month") -#: includes/core/wcs-formatting-functions.php:135 -#, php-format -msgid "%1$s %2$s then %3$s on the last day of each month" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: day of the month (e.g. "23rd"); (e.g. "$10 up front then $40 on the 23rd of each month") -#: includes/core/wcs-formatting-functions.php:138 -#, php-format -msgid "%1$s %2$s then %3$s on the %4$s of each month" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: interval (e.g. "3rd") -#: includes/core/wcs-formatting-functions.php:154 -#, php-format -msgid "%1$s %2$s then %3$s on the last day of every %4$s month" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: day of the month (e.g. "23rd"), 5$: interval (e.g. "3rd") -#: includes/core/wcs-formatting-functions.php:157 -#, php-format -msgid "%1$s %2$s then %3$s on the %4$s day of every %5$s month" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: month of year (e.g. "March"), 5$: day of the month (e.g. "23rd") -#: includes/core/wcs-formatting-functions.php:175 -#, php-format -msgid "%1$s %2$s then %3$s on %4$s %5$s each year" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: month (e.g. "March"), 5$: day of the month (e.g. "23rd"), 6$: interval (e.g. "3rd") -#: includes/core/wcs-formatting-functions.php:184 -#, php-format -msgid "%1$s %2$s then %3$s on %4$s %5$s every %6$s year" -msgstr "" - -#. translators: 1$: initial amount, 2$: initial description (e.g. "up front"), 3$: recurring amount, 4$: subscription period (e.g. "month" or "3 months") -#: includes/core/wcs-formatting-functions.php:194 -#, php-format -msgid "%1$s %2$s then %3$s / %4$s" -msgid_plural "%1$s %2$s then %3$s every %4$s" -msgstr[0] "" -msgstr[1] "" - -#. translators: 1$: subscription string (e.g. "$10 up front then $5 on March 23rd every 3rd year"), 2$: trial length (e.g. "3 weeks") -#: includes/core/wcs-formatting-functions.php:216 -#, php-format -msgid "%1$s after %2$s free trial" -msgstr "" - -#. translators: 1$: trial length (e.g. "3 weeks"), 2$: subscription string (e.g. "$10 up front then $5 on March 23rd every 3rd year") -#: includes/core/wcs-formatting-functions.php:219 -#, php-format -msgid "%1$s free trial then %2$s" -msgstr "" - -#. translators: placeholder is human time diff (e.g. "3 weeks") -#: includes/core/wcs-formatting-functions.php:243 -#, php-format -msgid "in %s" -msgstr "" - -#. translators: placeholder is a localized date and time (e.g. "February 1, 2018 10:20 PM") -#: includes/core/wcs-formatting-functions.php:251 -#, php-format -msgctxt "wcs_get_human_time_diff" -msgid "%s" -msgstr "" - -#. translators: placeholder is a number, this is for the teens -#. translators: placeholder is a number, numbers ending in 4-9, 0 -#: includes/core/wcs-formatting-functions.php:296 -#: includes/core/wcs-formatting-functions.php:313 -#, php-format -msgid "%sth" -msgstr "" - -#. translators: placeholder is a number, numbers ending in 1 -#: includes/core/wcs-formatting-functions.php:301 -#, php-format -msgid "%sst" -msgstr "" - -#. translators: placeholder is a number, numbers ending in 2 -#: includes/core/wcs-formatting-functions.php:305 -#, php-format -msgid "%snd" -msgstr "" - -#. translators: placeholder is a number, numbers ending in 3 -#: includes/core/wcs-formatting-functions.php:309 -#, php-format -msgid "%srd" -msgstr "" - -#: includes/core/wcs-functions.php:145 -msgctxt "Error message while creating a subscription" -msgid "Invalid created date. The date must be a string and of the format: \"Y-m-d H:i:s\"." -msgstr "" - -#: includes/core/wcs-functions.php:149 -msgctxt "Error message while creating a subscription" -msgid "Subscription created date must be before current day." -msgstr "" - -#: includes/core/wcs-functions.php:154 -msgctxt "Error message while creating a subscription" -msgid "Invalid date. The date must be a string and of the format: \"Y-m-d H:i:s\"." -msgstr "" - -#: includes/core/wcs-functions.php:159 -msgctxt "Error message while creating a subscription" -msgid "Invalid subscription customer_id." -msgstr "" - -#: includes/core/wcs-functions.php:225 -msgctxt "Subscription status" -msgid "On hold" -msgstr "" - -#: includes/core/wcs-functions.php:227 -msgctxt "Subscription status" -msgid "Switched" -msgstr "" - -#: includes/core/wcs-functions.php:229 -msgctxt "Subscription status" -msgid "Pending Cancellation" -msgstr "" - -#: includes/core/wcs-functions.php:245 -msgid "Can not get status name. Status is not a string." -msgstr "" - -#: includes/core/wcs-functions.php:268 -msgid "Can not get address type display name. Address type is not a string." -msgstr "" - -#: includes/core/wcs-functions.php:294 -#: templates/gifting/emails/recipient-email-subscriptions-table.php:17 -msgctxt "table heading" -msgid "Start Date" -msgstr "" - -#: includes/core/wcs-functions.php:295 -msgctxt "table heading" -msgid "Trial End" -msgstr "" - -#: includes/core/wcs-functions.php:296 -#: templates/myaccount/my-subscriptions.php:43 -msgctxt "table heading" -msgid "Next Payment" -msgstr "" - -#: includes/core/wcs-functions.php:297 -#: templates/emails/cancelled-subscription.php:41 -#: templates/emails/expired-subscription.php:26 -#: templates/emails/on-hold-subscription.php:26 -msgctxt "table heading" -msgid "Last Order Date" -msgstr "" - -#: includes/core/wcs-functions.php:298 -msgctxt "table heading" -msgid "Cancelled Date" -msgstr "" - -#: includes/core/wcs-functions.php:299 -#: templates/gifting/emails/recipient-email-subscriptions-table.php:18 -msgctxt "table heading" -msgid "End Date" -msgstr "" - -#: includes/core/wcs-functions.php:334 -msgid "Date type is not a string." -msgstr "" - -#: includes/core/wcs-functions.php:336 -msgid "Date type can not be an empty string." -msgstr "" - -#. translators: date placeholder for input, javascript format -#: includes/core/wcs-helper-functions.php:40 -msgid "YYYY-MM-DD" -msgstr "" - -#. translators: hour placeholder for time input, javascript format -#: includes/core/wcs-helper-functions.php:45 -msgid "HH" -msgstr "" - -#. translators: minute placeholder for time input, javascript format -#: includes/core/wcs-helper-functions.php:48 -msgid "MM" -msgstr "" - -#. translators: 1) passed sort order type argument, 2) 'ascending', 3) 'descending'. -#: includes/core/wcs-helper-functions.php:281 -#, php-format -msgid "Invalid sort order type: %1$s. The $sort_order argument must be %2$s or %3$s." -msgstr "" - -#: includes/core/wcs-order-functions.php:198 -msgctxt "In wcs_copy_order_meta error message. Refers to origin and target order objects." -msgid "Invalid data. Orders expected aren't orders." -msgstr "" - -#: includes/core/wcs-order-functions.php:202 -msgctxt "Refers to the type of the copy being performed: \"copy_order\", \"subscription\", \"renewal_order\", \"resubscribe_order\"" -msgid "Invalid data. Type of copy is not a string." -msgstr "" - -#. translators: placeholder %1 is the order type. %2 is the subscription ID we attempted to create the order for. -#: includes/core/wcs-order-functions.php:285 -#, php-format -msgid "There was an error fetching the new order (%1$s) for subscription %2$d." -msgstr "" - -#. translators: placeholder is a date. -#: includes/core/wcs-order-functions.php:326 -#, php-format -msgid "Subscription Renewal Order – %s" -msgstr "" - -#. translators: placeholder is a date. -#: includes/core/wcs-order-functions.php:330 -#, php-format -msgid "Resubscribe Order – %s" -msgstr "" - -#: includes/core/wcs-order-functions.php:349 -msgid "$type passed to the function was not a string." -msgstr "" - -#. translators: placeholder is an order type. -#: includes/core/wcs-order-functions.php:354 -#, php-format -msgid "\"%s\" is not a valid new order type." -msgstr "" - -#: includes/core/wcs-order-functions.php:604 -msgid "Invalid data. No valid subscription / order was passed in." -msgstr "" - -#: includes/core/wcs-order-functions.php:608 -msgid "Invalid data. No valid item id was passed in." -msgstr "" - -#. translators: placeholder is number of days. (e.g. "Bill this every day / 4 days") -#: includes/core/wcs-time-functions.php:31 -msgctxt "Subscription billing period." -msgid "day" -msgid_plural "%s days" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is number of weeks. (e.g. "Bill this every week / 4 weeks") -#: includes/core/wcs-time-functions.php:33 -msgctxt "Subscription billing period." -msgid "week" -msgid_plural "%s weeks" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is number of months. (e.g. "Bill this every month / 4 months") -#: includes/core/wcs-time-functions.php:35 -msgctxt "Subscription billing period." -msgid "month" -msgid_plural "%s months" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is number of years. (e.g. "Bill this every year / 4 years") -#: includes/core/wcs-time-functions.php:37 -msgctxt "Subscription billing period." -msgid "year" -msgid_plural "%s years" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/wcs-time-functions.php:88 -msgctxt "Subscription length" -msgid "Do not stop until cancelled" -msgstr "" - -#: includes/core/wcs-time-functions.php:93 -msgctxt "Subscription lengths. e.g. \"For 1 day...\"" -msgid "1 day" -msgstr "" - -#: includes/core/wcs-time-functions.php:97 -msgctxt "Subscription lengths. e.g. \"For 1 week...\"" -msgid "1 week" -msgstr "" - -#: includes/core/wcs-time-functions.php:101 -msgctxt "Subscription lengths. e.g. \"For 1 month...\"" -msgid "1 month" -msgstr "" - -#: includes/core/wcs-time-functions.php:105 -msgctxt "Subscription lengths. e.g. \"For 1 year...\"" -msgid "1 year" -msgstr "" - -#: includes/core/wcs-time-functions.php:159 -msgctxt "period interval (eg \"$10 _every_ 2 weeks\")" -msgid "every" -msgstr "" - -#. translators: period interval, placeholder is ordinal (eg "$10 every _2nd/3rd/4th_", etc) -#: includes/core/wcs-time-functions.php:163 -#, php-format -msgctxt "period interval with ordinal number (e.g. \"every 2nd\"" -msgid "every %s" -msgstr "" - -#: includes/core/wcs-time-functions.php:188 -msgctxt "Used in the trial period dropdown. Number is in text field. 0, 2+ will need plural, 1 will need singular." -msgid "day" -msgid_plural "days" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/wcs-time-functions.php:189 -msgctxt "Used in the trial period dropdown. Number is in text field. 0, 2+ will need plural, 1 will need singular." -msgid "week" -msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/wcs-time-functions.php:190 -msgctxt "Used in the trial period dropdown. Number is in text field. 0, 2+ will need plural, 1 will need singular." -msgid "month" -msgid_plural "months" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/wcs-time-functions.php:191 -msgctxt "Used in the trial period dropdown. Number is in text field. 0, 2+ will need plural, 1 will need singular." -msgid "year" -msgid_plural "years" -msgstr[0] "" -msgstr[1] "" - -#: includes/core/wcs-time-functions.php:210 -msgctxt "no trial period" -msgid "no" -msgstr "" - -#: includes/core/wcs-user-functions.php:319 -#: templates/single-product/add-to-cart/subscription.php:41 -#: templates/single-product/add-to-cart/variable-subscription.php:40 -msgid "Resubscribe" -msgstr "" - -#: includes/early-renewal/class-wcs-cart-early-renewal.php:74 -msgid "Renew now" -msgstr "" - -#: includes/early-renewal/class-wcs-cart-early-renewal.php:102 -msgid "You can not renew this subscription early. Please contact us if you need assistance." -msgstr "" - -#: includes/early-renewal/class-wcs-cart-early-renewal.php:108 -msgid "Complete checkout to renew now." -msgstr "" - -#. translators: %s: order ID (linked to details page). -#: includes/early-renewal/class-wcs-cart-early-renewal.php:225 -#, php-format -msgid "Order %s created to record early renewal." -msgstr "" - -#: includes/early-renewal/class-wcs-cart-early-renewal.php:294 -#: includes/early-renewal/class-wcs-cart-early-renewal.php:627 -#: includes/gifting/class-wcsg-recipient-management.php:161 -msgid "Cancel" -msgstr "" - -#: includes/early-renewal/class-wcs-cart-early-renewal.php:595 -msgctxt "used in order note as reason for why subscription status changed" -msgid "Customer requested to renew early:" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-manager.php:53 -msgid "Early Renewal" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-manager.php:54 -msgid "Accept Early Renewal Payments" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-manager.php:55 -msgid "With early renewals enabled, customers can renew their subscriptions before the next payment date." -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-manager.php:63 -msgid "Accept Early Renewal Payments via a Modal" -msgstr "" - -#. translators: 1-2: opening/closing tags , 2-3: opening/closing tags for a link to docs on early renewal. -#: includes/early-renewal/class-wcs-early-renewal-manager.php:66 -#, php-format -msgid "Allow customers to bypass the checkout and renew their subscription early from their %1$sMy Account > View Subscription%2$s page. %3$sLearn more.%4$s" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:39 -msgid "Pay now" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:61 -msgid "Renew early" -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:118 -msgid "We were unable to locate that subscription, please try again." -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:123 -msgid "You can't renew the subscription at this time. Please try again." -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:133 -msgid "We couldn't create a renewal order for your subscription, please try again." -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:150 -msgid "Payment for the renewal order was unsuccessful with your payment method on file, please try again." -msgstr "" - -#: includes/early-renewal/class-wcs-early-renewal-modal-handler.php:162 -msgid "Your early renewal order was successful." -msgstr "" - -#. translators: placeholder contains a link to the order's edit screen. -#: includes/early-renewal/wcs-early-renewal-functions.php:143 -#, php-format -msgid "Customer successfully renewed early with order %s." -msgstr "" - -#. translators: placeholder contains a link to the order's edit screen. -#: includes/early-renewal/wcs-early-renewal-functions.php:146 -#, php-format -msgid "Failed to update subscription dates after customer renewed early with order %s." -msgstr "" - -#. translators: $1-$2: opening and closing tags. Link to documents->payment gateways, 3$-4$: opening and closing tags. Link to WooCommerce extensions shop page -#: includes/gateways/class-wc-subscriptions-payment-gateways.php:152 -#, php-format -msgid "Find new gateways that %1$ssupport automatic subscription payments%2$s in the official %3$sWooCommerce Marketplace%4$s." -msgstr "" - -#: includes/gifting/class-wcs-gifting.php:171 -msgid "Please enter someone else's email address." -msgstr "" - -#: includes/gifting/class-wcs-gifting.php:175 -msgid " Invalid email address." -msgstr "" - -#: includes/gifting/class-wcs-gifting.php:326 -msgid "Recipient's Email Address" -msgstr "" - -#: includes/gifting/class-wcs-gifting.php:377 -msgctxt "table heading" -msgid "Renewing" -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$ plugin name, 4$ required plugin version, 5$-6$: opening and closing link tags, leads to plugins.php in admin, 7$: line break, 8$-9$ Opening and closing small tags. -#: includes/gifting/class-wcs-gifting.php:471 -#, php-format -msgid "%1$sWooCommerce Subscriptions Gifting Membership integration is inactive.%2$s In order to integrate with WooCommerce Memberships, WooCommerce Subscriptions Gifting requires %3$s %4$s or newer. %5$sPlease update »%6$s %7$s%8$sNote: All other WooCommerce Subscriptions Gifting features will remain available, however purchasing membership plans for recipients will fail to grant the membership to the gift recipient.%9$s" -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$ plugin name, 4$ required plugin version, 5$-6$: opening and closing link tags, leads to plugins.php in admin. -#: includes/gifting/class-wcs-gifting.php:474 -#, php-format -msgid "%1$sWooCommerce Subscriptions Gifting is inactive.%2$s This version of WooCommerce Subscriptions Gifting requires %3$s %4$s or newer. %5$sPlease update »%6$s" -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$:opening link tag, leads to WooCommerce Payments plugin product page, 4$:opening link tag, leads to WooCommerce Subscriptions plugin product page, 5$-6$: opening and closing link tags, leads to plugins.php in admin. -#: includes/gifting/class-wcs-gifting.php:488 -#, php-format -msgid "%1$sWooCommerce Subscriptions Gifting is inactive.%2$s WooCommerce Subscriptions Gifting requires either the %3$sWooCommerce Payments%6$s or %4$sWooCommerce Subscriptions%6$s plugin to be active to work correctly. Please %5$sinstall & activate either one »%6$s" -msgstr "" - -#. translators: 1$-2$: opening and closing tags, 3$ plugin name, 4$:opening link tag, leads to plugin product page, 5$-6$: opening and closing link tags, leads to plugins.php in admin. -#: includes/gifting/class-wcs-gifting.php:493 -#, php-format -msgid "%1$sWooCommerce Subscriptions Gifting is inactive.%2$s WooCommerce Subscriptions Gifting requires the %4$s%3$s%6$s plugin to be active to work correctly. Please %5$sinstall & activate %3$s »%6$s" -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:41 -msgid "Subscriptions Gifting" -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:42 -msgid "This section shows any information about Subscriptions Gifting." -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:66 -msgctxt "name for the system status page" -msgid "Subscriptions Gifting Template Theme Overrides" -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:67 -msgctxt "label for the system status page" -msgid "Subscriptions Gifting Template Theme Overrides" -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:142 -msgctxt "name for the system status page" -msgid "Gifted Subscriptions Count" -msgstr "" - -#: includes/gifting/class-wcsg-admin-system-status.php:143 -msgctxt "label for the system status page" -msgid "Gifted Subscriptions Count" -msgstr "" - -#. translators: $1: is subscription order number,$2: is recipient user's name, $3: is the purchaser user's name. -#: includes/gifting/class-wcsg-admin.php:138 -#, php-format -msgctxt "Subscription title on admin table. (e.g.: #211 for John Doe Purchased by: Jane Doe)" -msgid "%1$s for %2$s purchased by %3$s" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:185 -msgid "Enable gifting" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:186 -msgid "Allow shoppers to gift a subscription" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:194 -msgid "You can override this global setting on each product." -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:201 -msgid "Enabled for all products" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:202 -msgid "Disabled for all products" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:206 -msgid "Gifting Checkbox Text" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:207 -msgid "This is what shoppers will see in the product page and cart." -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:209 -#: includes/gifting/class-wcsg-blocks-integration.php:72 -#: templates/gifting/html-add-recipient.php:17 -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:167 -#: client/gifting/components/line-item-gift-recipient/index.js:172 -msgid "This is a gift" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:275 -#: includes/gifting/class-wcsg-recipient-management.php:480 -msgid "Recipient:" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:291 -#: includes/gifting/class-wcsg-admin.php:299 -msgid "Search for a recipient…" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:329 -msgid "Error saving subscription recipient: customer and recipient cannot be the same. The recipient user has been removed." -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:399 -msgid "All Subscriptions" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:400 -msgid "Gifted Subscriptions" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:401 -msgid "Non-gifted subscriptions" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:490 -msgid "Resend \"new recipient account\" email" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:538 -msgid "Follow global setting (enabled)" -msgstr "" - -#: includes/gifting/class-wcsg-admin.php:539 -msgid "Follow global setting (disabled)" -msgstr "" - -#. translators: %1$s opening anchor tag with url, %2$s closing anchor tag -#: includes/gifting/class-wcsg-admin.php:551 -#, php-format -msgid "Overriding your %1$sstore's settings%2$s" -msgstr "" - -#: includes/gifting/class-wcsg-cart.php:179 -msgid "You cannot add additional products to the cart. Please pay for the subscription renewal first." -msgstr "" - -#: includes/gifting/class-wcsg-checkout.php:172 -msgid "Please enter the gift recipient’s shipping address here, or we’ll collect it directly from them when they log in." -msgstr "" - -#: includes/gifting/class-wcsg-checkout.php:196 -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:182 -msgid "Gifting to" -msgstr "" - -#: includes/gifting/class-wcsg-download-handler.php:142 -msgid "Downloadable Products" -msgstr "" - -#: includes/gifting/class-wcsg-download-handler.php:143 -msgid "Allow both purchaser and recipient to download subscription products." -msgstr "" - -#: includes/gifting/class-wcsg-download-handler.php:148 -msgid "If you want both the recipient and purchaser of a subscription to have access to downloadable products." -msgstr "" - -#: includes/gifting/class-wcsg-download-handler.php:198 -#: includes/gifting/class-wcsg-recipient-management.php:404 -msgid "Recipient" -msgstr "" - -#: includes/gifting/class-wcsg-download-handler.php:198 -msgid "Purchaser" -msgstr "" - -#. Translators: placeholder is the number of files. -#: includes/gifting/class-wcsg-download-handler.php:356 -#, php-format -msgid "File %d" -msgstr "" - -#. Translators: placeholder is a subscription ID. -#: includes/gifting/class-wcsg-email.php:397 -#, php-format -msgctxt "Used in email heading before line items table, placeholder is subscription ID" -msgid "Subscription #%s" -msgstr "" - -#. Translators: placeholder is an order ID. -#: includes/gifting/class-wcsg-email.php:400 -#, php-format -msgctxt "Used in email heading before line items table, placeholder is order ID" -msgid "Order #%s" -msgstr "" - -#: includes/gifting/class-wcsg-query.php:67 -msgid "Account details" -msgstr "" - -#. Translators: 1) opening tag, 2) closing tag. -#: includes/gifting/class-wcsg-recipient-addresses.php:80 -#, php-format -msgid "%1$sNote:%2$s This will not update the shipping address of subscriptions you have purchased for others." -msgstr "" - -#. Translators: 1) opening tag, 2) closing tag. -#: includes/gifting/class-wcsg-recipient-addresses.php:84 -#, php-format -msgid "%1$sNote:%2$s This will not update the billing address of subscriptions purchased for you by someone else." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:128 -msgid "Please enter both password fields." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:132 -msgid "is a required field." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:142 -msgid "The passwords you have entered do not match." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:148 -msgid "Please enter a valid postcode/ZIP." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:215 -msgid "Your account has been updated." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:221 -msgid "There was an error with your request to update your account. Please try again." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:250 -msgid "Set my billing address to the same as above." -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:261 -msgid "First Name" -msgstr "" - -#: includes/gifting/class-wcsg-recipient-details.php:268 -msgid "Last Name" -msgstr "" - -#: includes/gifting/class-wcsg-recipient-management.php:475 -msgid "Shipping:" -msgstr "" - -#: includes/gifting/class-wcsg-recipient-management.php:542 -msgid "WARNING:" -msgstr "" - -#: includes/gifting/class-wcsg-recipient-management.php:543 -msgid "The following recipient will be removed from their subscriptions:" -msgid_plural "The following recipients will be removed from their subscriptions:" -msgstr[0] "" -msgstr[1] "" - -#: includes/gifting/emails/class-wcsg-email-completed-renewal-order.php:30 -msgid "Completed Renewal Order - Recipient" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-completed-renewal-order.php:31 -msgid "Renewal order complete emails are sent to the recipient when a subscription renewal order is marked complete and usually indicates that the item for that renewal period has been shipped." -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-completed-renewal-order.php:33 -msgid "Your renewal order is complete" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-completed-renewal-order.php:34 -msgid "Your {blogname} renewal order from {order_date} is complete" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-customer-new-account.php:59 -msgid "New Recipient Account" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-customer-new-account.php:60 -msgid "New account notification emails are sent to the subscription recipient when an account is created for them." -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-customer-new-account.php:62 -msgid "Your account on {site_title}" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-customer-new-account.php:63 -msgid "Welcome to {site_title}" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-processing-renewal-order.php:30 -msgid "Processing Renewal Order - Recipient" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-processing-renewal-order.php:31 -msgid "This is an order notification sent to the recipient after payment for a subscription renewal order is completed. It contains the renewal order details." -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-processing-renewal-order.php:34 -msgid "Your {blogname} renewal order receipt from {order_date}" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-recipient-new-initial-order.php:51 -msgid "New Initial Order - Recipient" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-recipient-new-initial-order.php:52 -msgid "This email is sent to recipients notifying them of subscriptions purchased for them." -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-recipient-new-initial-order.php:54 -msgid "New Order" -msgstr "" - -#: includes/gifting/emails/class-wcsg-email-recipient-new-initial-order.php:55 -msgid "Your new subscriptions at {site_title}" -msgstr "" - -#. Translators: %s Order number. -#: includes/gifting/privacy/class-wcsg-privacy-erasers.php:103 -#, php-format -msgid "Removed personal data from order %s." -msgstr "" - -#. Translators: %s Order number. -#: includes/gifting/privacy/class-wcsg-privacy-erasers.php:109 -#, php-format -msgid "Removed recipient personal data from order %s line items." -msgstr "" - -#. Translators: %s Order number. -#: includes/gifting/privacy/class-wcsg-privacy-erasers.php:114 -#, php-format -msgid "Personal data within order %s has been retained." -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:59 -msgid "Subscriptions Purchased for You" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:159 -msgid "Orders Purchased for You" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:189 -msgid "Order Date" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy-exporters.php:190 -msgid "Items Purchased" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy.php:22 -msgid "WooCommerce Subscriptions Gifting" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy.php:28 -#: includes/gifting/privacy/class-wcsg-privacy.php:31 -msgid "Recipient Subscription Data" -msgstr "" - -#: includes/gifting/privacy/class-wcsg-privacy.php:29 -#: includes/gifting/privacy/class-wcsg-privacy.php:32 -msgid "Recipient Order Data" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:67 -msgid "Automatic Failed Payment Retries" -msgstr "" - -#. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:121 -#, php-format -msgid "%d Pending Payment Retry" -msgid_plural "%d Pending Payment Retries" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:125 -#, php-format -msgid "%d Processing Payment Retry" -msgid_plural "%d Processing Payment Retries" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:129 -#, php-format -msgid "%d Failed Payment Retry" -msgid_plural "%d Failed Payment Retries" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:133 -#, php-format -msgid "%d Successful Payment Retry" -msgid_plural "%d Successful Payment Retries" -msgstr[0] "" -msgstr[1] "" - -#. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:137 -#, php-format -msgid "%d Cancelled Payment Retry" -msgid_plural "%d Cancelled Payment Retries" -msgstr[0] "" -msgstr[1] "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:180 -msgid "Retry Failed Payments" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:181 -msgid "Enable automatic retry of failed recurring payments" -msgstr "" - -#. translators: 1,2: opening/closing link tags (to documentation). -#: includes/payment-retry/admin/class-wcs-retry-admin.php:186 -#, php-format -msgid "Attempt to recover recurring revenue that would otherwise be lost due to payment methods being declined only temporarily. %1$sLearn more%2$s." -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:208 -msgctxt "label for the system status page" -msgid "Custom Retry Rules" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:216 -msgctxt "label for the system status page" -msgid "Custom Retry Rule Class" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:224 -msgctxt "label for the system status page" -msgid "Custom Raw Retry Rule" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:232 -msgctxt "label for the system status page" -msgid "Custom Retry Rule" -msgstr "" - -#: includes/payment-retry/admin/class-wcs-retry-admin.php:240 -msgctxt "label for the system status page" -msgid "Retries Migration Status" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:17 -msgid "Retry Date" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:19 -msgid "Retry Status" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:20 -msgid "The status of the automatic payment retry: pending means the retry will be processed in the future, failed means the payment was not successful when retried and completed means the payment succeeded when retried." -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:23 -msgid "Status of Order" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:24 -msgid "The status applied to the order for the time between when the renewal payment failed or last retry occurred and when this retry was processed." -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:27 -msgid "Status of Subscription" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:28 -msgid "The status applied to the subscription for the time between when the renewal payment failed or last retry occurred and when this retry was processed." -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:31 -msgid "Email" -msgstr "" - -#: includes/payment-retry/admin/html-retries-table.php:32 -msgid "The email sent to the customer when the renewal payment or payment retry failed to notify them that the payment would be retried." -msgstr "" - -#. translators: php date format -#: includes/payment-retry/admin/html-retries-table.php:44 -msgctxt "post date" -msgid "Y/m/d g:i:s A" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:140 -msgctxt "table heading" -msgid "Renewal Payment Retry" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:250 -msgctxt "used in order note as reason for why status changed" -msgid "Retry rule applied:" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:288 -msgctxt "used in order note as reason for why status changed" -msgid "Retry rule reapplied:" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:345 -msgctxt "used in order note as reason for why order status changed" -msgid "Subscription renewal payment retry:" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:349 -msgctxt "used in order note as reason for why subscription status changed" -msgid "Subscription renewal payment retry:" -msgstr "" - -#: includes/payment-retry/class-wcs-retry-manager.php:365 -msgid "Payment retry attempted on renewal order with multiple related subscriptions with no payment method in common." -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:38 -msgid "Payment retry posts store details about the automatic retry of failed renewal payments." -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:48 -msgctxt "Post type name" -msgid "Renewal Payment Retries" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:49 -msgid "Renewal Payment Retry" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:50 -msgctxt "Admin menu name" -msgid "Renewal Payment Retries" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:51 -msgid "Add" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:52 -msgid "Add New Retry" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:54 -msgid "Edit Retry" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:55 -msgid "New Retry" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:56 -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:57 -msgid "View Retry" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:58 -msgid "Search Renewal Payment Retries" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:59 -msgid "No retries found" -msgstr "" - -#: includes/payment-retry/data-stores/class-wcs-retry-post-store.php:60 -msgid "No retries found in trash" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-customer-payment-retry.php:30 -msgid "Customer Payment Retry" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-customer-payment-retry.php:31 -msgid "Sent to a customer when an attempt to automatically process a subscription renewal payment has failed and a retry rule has been applied to retry the payment in the future. The email contains the renewal order information, date of the scheduled retry and payment links to allow the customer to pay for the renewal order manually instead of waiting for the automatic retry." -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-customer-payment-retry.php:38 -msgid "Automatic payment failed for {order_number}, we will retry {retry_time}" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-customer-payment-retry.php:39 -msgid "Automatic payment failed for order {order_number}" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-payment-retry.php:32 -msgid "Payment Retry" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-payment-retry.php:33 -msgid "Payment retry emails are sent to chosen recipient(s) when an attempt to automatically process a subscription renewal payment has failed and a retry rule has been applied to retry the payment in the future." -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-payment-retry.php:35 -msgid "Automatic renewal payment failed" -msgstr "" - -#: includes/payment-retry/emails/class-wcs-email-payment-retry.php:36 -msgid "[{site_title}] Automatic payment failed for {order_number}, retry scheduled to run {retry_time}" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:198 -msgid "You have a subscription to this product. Choosing a new subscription will replace your existing subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:200 -msgid "Choose a new subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:240 -#: includes/switching/class-wc-subscriptions-switcher.php:1231 -msgid "Your cart contained an invalid subscription switch request. It has been removed." -msgid_plural "Your cart contained invalid subscription switch requests. They have been removed." -msgstr[0] "" -msgstr[1] "" - -#: includes/switching/class-wc-subscriptions-switcher.php:282 -msgid "You have already subscribed to this product and it is limited to one per customer. You can not purchase the product again." -msgstr "" - -#. translators: 1$: is the "You have already subscribed to this product" notice, 2$-4$: opening/closing link tags, 3$: an order number -#: includes/switching/class-wc-subscriptions-switcher.php:291 -#, php-format -msgid "%1$s Complete payment on %2$sOrder %3$s%4$s to be able to change your subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:387 -msgid "Switching" -msgstr "" - -#. translators: placeholders are opening and closing link tags -#: includes/switching/class-wc-subscriptions-switcher.php:390 -#, php-format -msgid "Allow subscribers to switch (upgrade or downgrade) between different subscriptions. %1$sLearn more%2$s." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:398 -msgid "Prorate Recurring Payment" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:399 -msgid "When switching to a subscription with a different recurring payment or billing period, should the price paid for the existing billing period be prorated when switching to the new subscription?" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:407 -#: includes/switching/class-wc-subscriptions-switcher.php:441 -msgctxt "when to allow a setting" -msgid "Never" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:408 -msgctxt "when to prorate recurring fee when switching" -msgid "For Upgrades of Virtual Subscription Products Only" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:409 -msgctxt "when to prorate recurring fee when switching" -msgid "For Upgrades of All Subscription Products" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:410 -msgctxt "when to prorate recurring fee when switching" -msgid "For Upgrades & Downgrades of Virtual Subscription Products Only" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:411 -msgctxt "when to prorate recurring fee when switching" -msgid "For Upgrades & Downgrades of All Subscription Products" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:416 -msgid "Prorate Sign up Fee" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:417 -msgid "When switching to a subscription with a sign up fee, you can require the customer pay only the gap between the existing subscription's sign up fee and the new subscription's sign up fee (if any)." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:425 -msgctxt "when to prorate signup fee when switching" -msgid "Never (do not charge a sign up fee)" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:426 -msgctxt "when to prorate signup fee when switching" -msgid "Never (charge the full sign up fee)" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:427 -msgctxt "when to prorate signup fee when switching" -msgid "Always" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:432 -msgid "Prorate Subscription Length" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:433 -msgid "When switching to a subscription with a length, you can take into account the payments already completed by the customer when determining how many payments the subscriber needs to make for the new subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:448 -msgid "Switch Button Text" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:449 -msgid "Customise the text displayed on the button next to the subscription on the subscriber's account page. The default is \"Switch Subscription\", but you may wish to change this to \"Upgrade\" or \"Change Subscription\"." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:453 -#: includes/switching/class-wc-subscriptions-switcher.php:555 -msgid "Upgrade or Downgrade" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:492 -msgid "Allow Switching" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:499 -msgctxt "when to allow switching" -msgid "Between Subscription Variations" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:503 -msgctxt "when to allow switching" -msgid "Between Grouped Subscriptions" -msgstr "" - -#. translators: %s: order number. -#: includes/switching/class-wc-subscriptions-switcher.php:1165 -#, php-format -msgid "Switch order cancelled due to a new switch order being created #%s." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1368 -msgid "You can only switch to a subscription product." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1374 -msgid "We can not find your old subscription item." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1396 -msgid "You can not switch to the same subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1443 -msgid "You can not switch this subscription. It appears you do not own the subscription." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1484 -msgid "There was an error locating the switch details." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1833 -msgctxt "a switch type" -msgid "Downgrade" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1836 -msgctxt "a switch type" -msgid "Upgrade" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1839 -msgctxt "a switch type" -msgid "Crossgrade" -msgstr "" - -#. translators: %1: product subtotal, %2: HTML span tag, %3: direction (upgrade, downgrade, crossgrade), %4: closing HTML span tag -#: includes/switching/class-wc-subscriptions-switcher.php:1844 -#, php-format -msgctxt "product subtotal string" -msgid "%1$s %2$s(%3$s)%4$s" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1960 -msgid "The original subscription item being switched cannot be found." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:1962 -msgid "The item on the switch order cannot be found." -msgstr "" - -#. translators: 1$: old item, 2$: new item when switching -#: includes/switching/class-wc-subscriptions-switcher.php:1973 -#, php-format -msgctxt "used in order notes" -msgid "Customer switched from: %1$s to %2$s." -msgstr "" - -#. translators: %s: new item name. -#: includes/switching/class-wc-subscriptions-switcher.php:1976 -#, php-format -msgctxt "used in order notes" -msgid "Customer added %s." -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:2376 -msgid "Switch Order" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:2391 -msgid "Switched Subscription" -msgstr "" - -#: includes/switching/class-wc-subscriptions-switcher.php:2574 -msgctxt "add to cart button text while switching a subscription" -msgid "Switch subscription" -msgstr "" - -#: includes/switching/class-wcs-cart-switch.php:180 -msgctxt "The place order button text while switching a subscription" -msgid "Switch subscription" -msgstr "" - -#. translators: placeholder is a switch type. -#: includes/switching/class-wcs-switch-cart-item.php:328 -#, php-format -msgid "Invalid switch type \"%s\". Switch must be one of: \"upgrade\", \"downgrade\" or \"crossgrade\"." -msgstr "" - -#: includes/switching/class-wcs-switch-totals-calculator.php:202 -msgid "Your cart contained an invalid subscription switch request. It has been removed from your cart." -msgstr "" - -#. translators: placeholder is a currency symbol / code -#: templates/admin/deprecated/html-variation-price.php:20 -#: templates/admin/deprecated/html-variation-price.php:30 -#, php-format -msgid "Subscription Price (%s)" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:31 -#: templates/admin/deprecated/html-variation-price.php:86 -msgctxt "example price" -msgid "e.g. 9.90" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:46 -msgid "Subscription Periods" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:59 -msgctxt "Edit product screen, between the Billing Period and Subscription Length dropdowns" -msgid "for" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:69 -msgid "Subscription Length" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:85 -#, php-format -msgid "Sign-up Fee (%s)" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:97 -#: templates/admin/deprecated/html-variation-price.php:104 -msgid "Free Trial" -msgstr "" - -#: templates/admin/deprecated/html-variation-price.php:105 -msgctxt "example number of days / weeks / months" -msgid "e.g. 3" -msgstr "" - -#. translators: placeholder is trial period validation message if passed an invalid value (e.g. "Trial period can not exceed 4 weeks") -#: templates/admin/deprecated/html-variation-price.php:118 -#: templates/admin/html-variation-price.php:83 -#, php-format -msgctxt "Trial period dropdown's description in pricing fields" -msgid "An optional period of time to wait before charging the first recurring payment. Any sign up fee will still be charged at the outset of the subscription. %s" -msgstr "" - -#: templates/admin/deprecated/html-variation-synchronisation.php:30 -msgid "Synchronise Renewals" -msgstr "" - -#: templates/admin/deprecated/html-variation-synchronisation.php:36 -#: templates/admin/html-variation-synchronisation.php:48 -msgctxt "input field placeholder for day field for annual subscriptions" -msgid "Day" -msgstr "" - -#: templates/admin/deprecated/order-shipping-html.php:8 -msgid "Label" -msgstr "" - -#: templates/admin/deprecated/order-shipping-html.php:13 -msgid "Shipping Method" -msgstr "" - -#: templates/admin/deprecated/order-shipping-html.php:34 -#: templates/admin/deprecated/order-shipping-html.php:36 -msgid "Other" -msgstr "" - -#: templates/admin/deprecated/order-tax-html.php:17 -msgid "Recurring Sales Tax:" -msgstr "" - -#: templates/admin/deprecated/order-tax-html.php:21 -msgid "Shipping Tax:" -msgstr "" - -#: templates/admin/html-admin-empty-list-table.php:14 -msgid "This is where you'll see and manage all subscriptions in your store. Create a subscription product to turn one-time purchases into a steady income." -msgstr "" - -#: templates/admin/html-admin-empty-list-table.php:16 -msgid "Create subscription product" -msgstr "" - -#: templates/admin/html-failed-scheduled-action-notice.php:26 -#, php-format -msgid "An error has occurred while processing a recent subscription related event. For steps on how to fix the affected subscription and to learn more about the possible causes of this error, please read our guide %1$shere%2$s." -msgid_plural "An error has occurred while processing recent subscription related events. For steps on how to fix the affected subscriptions and to learn more about the possible causes of this error, please read our guide %1$shere%2$s." -msgstr[0] "" -msgstr[1] "" - -#: templates/admin/html-failed-scheduled-action-notice.php:36 -msgid "Affected event:" -msgid_plural "Affected events:" -msgstr[0] "" -msgstr[1] "" - -#. translators: $1 the log file name $2 and $3 are opening and closing link tags, respectively. -#: templates/admin/html-failed-scheduled-action-notice.php:43 -#, php-format -msgid "To see further details about these errors, view the %1$s log file from the %2$sWooCommerce logs screen.%2$s" -msgstr "" - -#: templates/admin/html-variation-price.php:35 -msgid "Billing interval:" -msgstr "" - -#: templates/admin/html-variation-price.php:42 -msgid "Billing Period:" -msgstr "" - -#: templates/admin/html-variation-price.php:56 -msgctxt "Subscription Length dropdown's description in pricing fields" -msgid "Automatically stop renewing the subscription after this length of time. This length is in addition to any free trial or amount of time provided before a synchronised first renewal date." -msgstr "" - -#: templates/admin/html-variation-price.php:75 -msgctxt "example price" -msgid "e.g." -msgstr "" - -#: templates/admin/html-variation-price.php:90 -msgid "Subscription trial period:" -msgstr "" - -#: templates/cart/cart-recurring-shipping.php:32 -msgid "Shipping costs will be calculated once you have provided your address." -msgstr "" - -#: templates/cart/cart-recurring-shipping.php:34 -msgid "There are no shipping methods available. Please double check your address, or contact us if you need any help." -msgstr "" - -#: templates/checkout/form-change-payment-method.php:19 -#: templates/emails/email-order-details.php:67 -#: templates/gifting/subscription-totals.php:25 -#: templates/myaccount/subscription-totals-table.php:20 -msgctxt "table headings in notification email" -msgid "Product" -msgstr "" - -#: templates/checkout/form-change-payment-method.php:20 -#: templates/emails/email-order-details.php:68 -msgctxt "table headings in notification email" -msgid "Quantity" -msgstr "" - -#: templates/checkout/form-change-payment-method.php:21 -msgctxt "table headings in notification email" -msgid "Totals" -msgstr "" - -#: templates/checkout/form-change-payment-method.php:46 -msgctxt "text on button on checkout page" -msgid "Change payment method" -msgstr "" - -#: templates/checkout/form-change-payment-method.php:48 -msgctxt "text on button on checkout page" -msgid "Add payment method" -msgstr "" - -#: templates/checkout/form-change-payment-method.php:83 -msgid "Sorry, it seems no payment gateways support changing the recurring payment method. Please contact us if you require assistance or to make alternate arrangements." -msgstr "" - -#. translators: $1: opening tag, $2: closing tag -#: templates/checkout/form-change-payment-method.php:92 -#, php-format -msgid "Use this payment method for %1$sall%2$s of my current subscriptions" -msgstr "" - -#: templates/checkout/recurring-subscription-totals.php:18 -#: templates/checkout/recurring-subscription-totals.php:19 -msgid "Recurring total" -msgstr "" - -#: templates/checkout/recurring-subtotals.php:18 -#: templates/checkout/recurring-subtotals.php:19 -msgid "Subtotal" -msgstr "" - -#: templates/checkout/recurring-totals.php:17 -msgid "Recurring totals" -msgstr "" - -#. translators: placeholder is the subscription order number wrapped in tags -#: templates/checkout/subscription-receipt.php:18 -#: templates/emails/plain/email-order-details.php:19 -#, php-format -msgid "Subscription Number: %s" -msgstr "" - -#. translators: placeholder is the subscription's next payment date (either human readable or normal date) wrapped in tags -#: templates/checkout/subscription-receipt.php:24 -#, php-format -msgid "Next Payment Date: %s" -msgstr "" - -#. translators: placeholder is the formatted total to be paid for the subscription wrapped in tags -#: templates/checkout/subscription-receipt.php:30 -#, php-format -msgid "Total: %s" -msgstr "" - -#. translators: placeholder is the display name of the payment method -#: templates/checkout/subscription-receipt.php:37 -#, php-format -msgid "Payment Method: %s" -msgstr "" - -#. translators: $1: customer's billing first name and last name -#: templates/emails/admin-new-renewal-order.php:22 -#: templates/emails/plain/admin-new-renewal-order.php:16 -#, php-format -msgctxt "Used in admin email: new renewal order" -msgid "You have received a subscription renewal order from %1$s. Their order is as follows:" -msgstr "" - -#. translators: $1: customer's first name and last name -#. translators: $1: customer's first name and last name, $2: how many subscriptions customer switched -#: templates/emails/admin-new-switch-order.php:28 -#: templates/emails/plain/admin-new-switch-order.php:18 -#, php-format -msgctxt "Used in switch notification admin email" -msgid "Customer %1$s has switched their subscription. The details of their new subscription are as follows:" -msgid_plural "Customer %1$s has switched %2$d of their subscriptions. The details of their new subscriptions are as follows:" -msgstr[0] "" -msgstr[1] "" - -#. translators: $1: customer's first name and last name, $2: how many subscriptions customer switched -#: templates/emails/admin-new-switch-order.php:31 -#, php-format -msgctxt "Used in switch notification admin email" -msgid "Customer %1$s has switched %2$d of their subscriptions. The details of their new subscriptions are as follows:" -msgstr "" - -#: templates/emails/admin-new-switch-order.php:37 -msgid "Switch Order Details" -msgstr "" - -#: templates/emails/admin-new-switch-order.php:53 -#: templates/emails/customer-completed-switch-order.php:39 -msgid "New subscription details" -msgstr "" - -#. translators: %1$s: an order number, %2$s: the customer's full name, %3$s: lowercase human time diff in the form returned by wcs_get_human_time_diff(), e.g. 'in 12 hours' -#: templates/emails/admin-payment-retry.php:23 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "The automatic recurring payment for order #%1$d from %2$s has failed. The payment will be retried %3$s." -msgstr "" - -#: templates/emails/admin-payment-retry.php:24 -#: templates/emails/plain/admin-payment-retry.php:29 -msgid "The renewal order is as follows:" -msgstr "" - -#. translators: $1$s customer's billing first name and last name %2$s: date on which the subscription ends. -#: templates/emails/cancelled-subscription.php:21 -#, php-format -msgid "A subscription belonging to %1$s is now pending cancellation, and will end on %2$s. Their subscription's details are as follows:" -msgstr "" - -#. translators: $1$s customer's billing first name and last name. -#. translators: $1: customer's billing first name and last name -#: templates/emails/cancelled-subscription.php:28 -#: templates/emails/plain/cancelled-subscription.php:16 -#, php-format -msgid "A subscription belonging to %1$s has been cancelled. Their subscription's details are as follows:" -msgstr "" - -#: templates/emails/cancelled-subscription.php:40 -#: templates/emails/email-order-details.php:69 -#: templates/emails/expired-subscription.php:25 -#: templates/emails/on-hold-subscription.php:25 -msgctxt "table headings in notification email" -msgid "Price" -msgstr "" - -#: templates/emails/cancelled-subscription.php:42 -msgctxt "table headings in notification email" -msgid "End of Prepaid Term" -msgstr "" - -#: templates/emails/cancelled-subscription.php:59 -#: templates/emails/expired-subscription.php:44 -#: templates/emails/on-hold-subscription.php:44 -msgid "-" -msgstr "" - -#. translators: %s: Customer first name -#: templates/emails/customer-completed-renewal-order.php:22 -#: templates/emails/customer-completed-switch-order.php:22 -#: templates/emails/customer-on-hold-renewal-order.php:20 -#: templates/emails/customer-payment-retry.php:17 -#: templates/emails/customer-processing-renewal-order.php:17 -#: templates/emails/customer-renewal-invoice.php:17 -#: templates/emails/plain/customer-completed-renewal-order.php:16 -#: templates/emails/plain/customer-completed-switch-order.php:16 -#: templates/emails/plain/customer-on-hold-renewal-order.php:16 -#: templates/emails/plain/customer-payment-retry.php:16 -#: templates/emails/plain/customer-processing-renewal-order.php:16 -#: templates/emails/plain/customer-renewal-invoice.php:16 -#, php-format -msgid "Hi %s," -msgstr "" - -#: templates/emails/customer-completed-renewal-order.php:23 -#: templates/emails/plain/customer-completed-renewal-order.php:17 -msgid "We have finished processing your subscription renewal order." -msgstr "" - -#: templates/emails/customer-completed-switch-order.php:23 -#: templates/emails/plain/customer-completed-switch-order.php:17 -msgid "You have successfully changed your subscription items. Your new order and subscription details are shown below for your reference:" -msgstr "" - -#. translators: %s: Customer first name -#: templates/emails/customer-notification-auto-renewal.php:26 -#: templates/emails/customer-notification-manual-renewal.php:25 -#: templates/emails/plain/customer-notification-auto-renewal.php:19 -#: templates/emails/plain/customer-notification-manual-renewal.php:19 -#, php-format -msgid "Hi %s." -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/customer-notification-auto-renewal.php:37 -#, php-format -msgid "Your subscription will automatically renew in %1$s — that’s %2$s." -msgstr "" - -#. translators: %s: link to subscription detail in the customer's dashboard. -#: templates/emails/customer-notification-auto-renewal.php:74 -#, php-format -msgid "You can manage this subscription from your %s" -msgstr "" - -#: templates/emails/customer-notification-auto-renewal.php:75 -#: templates/emails/customer-notification-auto-trial-ending.php:54 -msgid "account dashboard" -msgstr "" - -#. translators: %s: Customer first name -#: templates/emails/customer-notification-auto-trial-ending.php:25 -#: templates/emails/plain/customer-notification-auto-trial-ending.php:19 -#, php-format -msgid "Hi, %s." -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/customer-notification-auto-trial-ending.php:36 -#, php-format -msgid "Your paid subscription begins when your free trial expires in %1$s — that’s %2$s." -msgstr "" - -#. translators: %1$s: link to account dashboard. -#: templates/emails/customer-notification-auto-trial-ending.php:53 -#, php-format -msgid "Payment will be deducted using the payment method on file. You can manage this subscription from your %1$s." -msgstr "" - -#. translators: %s: Customer first name -#: templates/emails/customer-notification-expiring-subscription.php:23 -#: templates/emails/customer-notification-manual-trial-ending.php:25 -#: templates/emails/plain/customer-notification-expiring-subscription.php:19 -#: templates/emails/plain/customer-notification-manual-trial-ending.php:19 -#, php-format -msgid "Heads up, %s." -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/customer-notification-expiring-subscription.php:36 -#, php-format -msgid "Your subscription expires in %1$s — that’s %2$s." -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/customer-notification-manual-renewal.php:38 -#, php-format -msgid "Your subscription is up for renewal in %1$s — that’s %2$s." -msgstr "" - -#: templates/emails/customer-notification-manual-renewal.php:53 -#: templates/emails/plain/customer-notification-manual-renewal.php:40 -msgid "This subscription will not renew automatically." -msgstr "" - -#: templates/emails/customer-notification-manual-renewal.php:59 -msgid "You can renew it manually in a few short steps via the Subscriptions tab in your account dashboard." -msgstr "" - -#: templates/emails/customer-notification-manual-renewal.php:76 -msgid "Renew Subscription" -msgstr "" - -#: templates/emails/customer-notification-manual-renewal.php:78 -msgid "Manage Subscription" -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/customer-notification-manual-trial-ending.php:36 -#, php-format -msgid "Your free trial expires in %1$s — that’s %2$s." -msgstr "" - -#: templates/emails/customer-on-hold-renewal-order.php:21 -#: templates/emails/plain/customer-on-hold-renewal-order.php:17 -msgid "Thanks for your renewal order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of your order:" -msgstr "" - -#. translators: %s: lowercase human time diff in the form returned by wcs_get_human_time_diff(), e.g. 'in 12 hours' -#: templates/emails/customer-payment-retry.php:19 -#: templates/emails/plain/customer-payment-retry.php:18 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "The automatic payment to renew your subscription has failed. We will retry the payment %s." -msgstr "" - -#. translators: %1$s %2$s: link markup to checkout payment url, note: no full stop due to url at the end -#: templates/emails/customer-payment-retry.php:22 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "To reactivate the subscription now, you can also log in and pay for the renewal from your account page: %1$sPay Now »%2$s" -msgstr "" - -#. translators: %s: Order number -#: templates/emails/customer-processing-renewal-order.php:19 -#: templates/emails/plain/customer-processing-renewal-order.php:18 -#, php-format -msgid "Just to let you know — we've received your subscription renewal order #%s, and it is now being processed:" -msgstr "" - -#. translators: %1$s: name of the blog, %2$s: link to checkout payment url, note: no full stop due to url at the end. -#. translators: %1$s: name of the blog, %2$s: link to checkout payment url, note: no full stop due to url at the end -#: templates/emails/customer-renewal-invoice.php:25 -#: templates/emails/plain/customer-renewal-invoice.php:20 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "An order has been created for you to renew your subscription on %1$s. To pay for this invoice please use the following link: %2$s" -msgstr "" - -#: templates/emails/customer-renewal-invoice.php:32 -#: templates/emails/customer-renewal-invoice.php:54 -msgid "Pay Now »" -msgstr "" - -#. translators: %1$s: name of the blog, %2$s: link to checkout payment url, note: no full stop due to url at the end. -#. translators: %1$s: name of the blog, %2$s: link to checkout payment url, note: no full stop due to url at the end -#: templates/emails/customer-renewal-invoice.php:47 -#: templates/emails/plain/customer-renewal-invoice.php:23 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "The automatic payment to renew your subscription with %1$s has failed. To reactivate the subscription, please log in and pay for the renewal from your account page: %2$s" -msgstr "" - -#. translators: %s: Order or subscription ID. -#: templates/emails/email-order-details.php:31 -#, php-format -msgid "Order #%s" -msgstr "" - -#. translators: %s: Order or subscription ID. -#. Translators: placeholder is a subscription number. -#: templates/emails/email-order-details.php:31 -#: templates/gifting/emails/plain/recipient-email-subscriptions-table.php:14 -#, php-format -msgid "Subscription #%s" -msgstr "" - -#: templates/emails/email-order-details.php:36 -msgid "Order summary" -msgstr "" - -#: templates/emails/email-order-details.php:36 -msgid "Subscription summary" -msgstr "" - -#: templates/emails/email-order-details.php:106 -msgid "Customer note" -msgstr "" - -#. translators: $1: customer's billing first name and last name -#: templates/emails/expired-subscription.php:17 -#: templates/emails/plain/expired-subscription.php:16 -#, php-format -msgid "A subscription belonging to %1$s has expired. Their subscription's details are as follows:" -msgstr "" - -#: templates/emails/expired-subscription.php:27 -msgctxt "table headings in notification email" -msgid "End Date" -msgstr "" - -#. translators: $1: customer's billing first name and last name -#: templates/emails/on-hold-subscription.php:17 -#: templates/emails/plain/on-hold-subscription.php:16 -#, php-format -msgid "A subscription belonging to %1$s has been suspended by the user. Their subscription's details are as follows:" -msgstr "" - -#: templates/emails/on-hold-subscription.php:27 -msgctxt "table headings in notification email" -msgid "Date Suspended" -msgstr "" - -#: templates/emails/plain/admin-payment-retry.php:22 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "The automatic recurring payment for order #%1$s from %2$s has failed. The payment will be retried %3$s." -msgstr "" - -#. translators: placeholder is last time subscription was paid -#: templates/emails/plain/cancelled-subscription.php:32 -#: templates/emails/plain/expired-subscription.php:32 -#, php-format -msgid "Last Order Date: %s" -msgstr "" - -#. translators: placeholder is localised date string -#: templates/emails/plain/cancelled-subscription.php:39 -#, php-format -msgid "End of Prepaid Term: %s" -msgstr "" - -#. translators: %s: subscription URL -#: templates/emails/plain/cancelled-subscription.php:45 -#: templates/emails/plain/expired-subscription.php:45 -#: templates/emails/plain/on-hold-subscription.php:40 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "View Subscription: %s" -msgstr "" - -#. translators: placeholder is order's view url -#: templates/emails/plain/customer-completed-switch-order.php:24 -#, php-format -msgid "View your order: %s" -msgstr "" - -#. translators: placeholder is subscription's view url -#: templates/emails/plain/customer-completed-switch-order.php:35 -#, php-format -msgid "View your subscription: %s" -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/plain/customer-notification-auto-renewal.php:29 -#, php-format -msgid "Your subscription will automatically renew in %1$s — that’s %2$s." -msgstr "" - -#: templates/emails/plain/customer-notification-auto-renewal.php:46 -msgid "You can manage this subscription from your account dashboard: " -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/plain/customer-notification-auto-trial-ending.php:29 -#, php-format -msgid "Your paid subscription begins when your free trial expires in %1$s — that’s %2$s." -msgstr "" - -#. translators: %1$s: link to account dashboard. -#: templates/emails/plain/customer-notification-auto-trial-ending.php:41 -msgid "Payment will be deducted using the payment method on file. You can manage this subscription from your account dashboard: " -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/plain/customer-notification-expiring-subscription.php:29 -#, php-format -msgid "Your subscription expires in %1$s — that’s %2$s." -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/plain/customer-notification-manual-renewal.php:29 -#, php-format -msgid "Your subscription is up for renewal in %1$s — that’s %2$s." -msgstr "" - -#: templates/emails/plain/customer-notification-manual-renewal.php:43 -msgid "You can renew it manually in a few short steps via the Subscriptions tab in your account dashboard." -msgstr "" - -#: templates/emails/plain/customer-notification-manual-renewal.php:52 -msgid "Renew my subscription: " -msgstr "" - -#: templates/emails/plain/customer-notification-manual-renewal.php:55 -msgid "Manage my subscription: " -msgstr "" - -#. translators: %1$s: human readable time difference (eg 3 days, 1 day), %2$s: date in local format. -#: templates/emails/plain/customer-notification-manual-trial-ending.php:29 -#, php-format -msgid "Your free trial expires in %1$s — that’s %2$s." -msgstr "" - -#. translators: %1$s: link to checkout payment url, note: no full stop due to url at the end -#: templates/emails/plain/customer-payment-retry.php:21 -#, php-format -msgctxt "In customer renewal invoice email" -msgid "To reactivate the subscription now, you can also log in and pay for the renewal from your account page: %1$s" -msgstr "" - -#: templates/emails/plain/email-order-details.php:16 -#, php-format -msgid "Order number: %s" -msgstr "" - -#: templates/emails/plain/email-order-details.php:17 -#, php-format -msgid "Order date: %s" -msgstr "" - -#. translators: placeholder is localised date string -#. Translators: placeholder is a date. -#: templates/emails/plain/expired-subscription.php:39 -#: templates/gifting/emails/plain/recipient-email-subscriptions-table.php:20 -#, php-format -msgid "End Date: %s" -msgstr "" - -#. translators: placeholder is last time subscription was paid -#: templates/emails/plain/on-hold-subscription.php:32 -#, php-format -msgid "Last Order: %s" -msgstr "" - -#. translators: placeholder is localised date string -#: templates/emails/plain/on-hold-subscription.php:36 -#, php-format -msgid "Date Suspended: %s" -msgstr "" - -#: templates/emails/plain/subscription-info.php:19 -#: templates/emails/subscription-info.php:20 -msgid "Subscription information" -msgstr "" - -#. translators: placeholder is subscription's number -#: templates/emails/plain/subscription-info.php:24 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "Subscription: %s" -msgstr "" - -#. translators: placeholder is either view or edit url for the subscription -#: templates/emails/plain/subscription-info.php:26 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "View subscription: %s" -msgstr "" - -#. translators: placeholder is localised start date -#: templates/emails/plain/subscription-info.php:28 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "Start date: %s" -msgstr "" - -#. Translators: placeholder is a date. -#: templates/emails/plain/subscription-info.php:30 -#: templates/gifting/emails/plain/recipient-email-subscriptions-table.php:20 -#: templates/gifting/emails/recipient-email-subscriptions-table.php:27 -msgctxt "Used as end date for an indefinite subscription" -msgid "When Cancelled" -msgstr "" - -#. translators: placeholder is localised end date, or "when cancelled" -#: templates/emails/plain/subscription-info.php:32 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "End date: %s" -msgstr "" - -#. translators: placeholder is the formatted order total for the subscription -#: templates/emails/plain/subscription-info.php:34 -#, php-format -msgctxt "in plain emails for subscription information" -msgid "Recurring price: %s" -msgstr "" - -#. Translators: placeholder is the next payment date. -#: templates/emails/plain/subscription-info.php:37 -#: templates/emails/subscription-info.php:43 -#, php-format -msgid "Next payment: %s" -msgstr "" - -#: templates/emails/plain/subscription-info.php:53 -#, php-format -msgid "This subscription is set to renew automatically using your payment method on file. You can manage or cancel this subscription from your my account page. %s" -msgid_plural "These subscriptions are set to renew automatically using your payment method on file. You can manage or cancel your subscriptions from your my account page. %s" -msgstr[0] "" -msgstr[1] "" - -#: templates/emails/subscription-info.php:24 -msgctxt "subscription ID table heading" -msgid "ID" -msgstr "" - -#: templates/emails/subscription-info.php:25 -msgctxt "table heading" -msgid "Start date" -msgstr "" - -#: templates/emails/subscription-info.php:26 -msgctxt "table heading" -msgid "End date" -msgstr "" - -#: templates/emails/subscription-info.php:27 -msgctxt "table heading" -msgid "Recurring total" -msgstr "" - -#. Translators: placeholder is the subscription number. -#. Translators: placeholder is a subscription number. -#: templates/emails/subscription-info.php:35 -#: templates/gifting/emails/recipient-email-subscriptions-table.php:25 -#, php-format -msgctxt "subscription number in email table. (eg: #106)" -msgid "#%s" -msgstr "" - -#: templates/emails/subscription-info.php:37 -msgctxt "Used as end date for an indefinite subscription" -msgid "When cancelled" -msgstr "" - -#. Translators: Placeholders are opening and closing My Account link tags. -#: templates/emails/subscription-info.php:64 -#, php-format -msgid "This subscription is set to renew automatically using your payment method on file. You can manage or cancel this subscription from your %1$smy account page%2$s." -msgid_plural "These subscriptions are set to renew automatically using your payment method on file. You can manage or cancel your subscriptions from your %1$smy account page%2$s." -msgstr[0] "" -msgstr[1] "" - -#: templates/gifting/emails/new-recipient-customer.php:17 -#: templates/gifting/emails/plain/new-recipient-customer.php:15 -#: templates/gifting/emails/plain/recipient-new-initial-order.php:12 -#: templates/gifting/emails/recipient-new-initial-order.php:15 -msgid "Hi there," -msgstr "" - -#. Translators: 1) is the purchaser's name, 2) is the blog's name. -#: templates/gifting/emails/new-recipient-customer.php:21 -#: templates/gifting/emails/plain/new-recipient-customer.php:17 -#, php-format -msgid "%1$s just purchased a subscription for you at %2$s so we've created an account for you to manage the subscription." -msgstr "" - -#. Translators: placeholder is a username. -#: templates/gifting/emails/new-recipient-customer.php:28 -#: templates/gifting/emails/plain/new-recipient-customer.php:20 -#, php-format -msgid "Your username is: %s" -msgstr "" - -#: templates/gifting/emails/new-recipient-customer.php:32 -msgid "Click here to set your password" -msgstr "" - -#. Translators: placeholder is a link to "My Account" for setting up the recipient's details. -#: templates/gifting/emails/new-recipient-customer.php:38 -#, php-format -msgid "To complete your account we just need you to fill in your shipping address here: %s." -msgstr "" - -#: templates/gifting/emails/new-recipient-customer.php:39 -msgid "My Account Details" -msgstr "" - -#. Translators: placeholder is a link to "My Account". -#. Translators: placeholder is the URL for "My Account". -#: templates/gifting/emails/new-recipient-customer.php:48 -#: templates/gifting/emails/plain/new-recipient-customer.php:28 -#, php-format -msgid "Once completed you may access your account area to view your subscription here: %s." -msgstr "" - -#. Translators: placeholder is the URL for resetting the password. -#: templates/gifting/emails/plain/new-recipient-customer.php:23 -#, php-format -msgid "Go here to set your password: %s" -msgstr "" - -#. Translators: placeholder is the URL for setting up the recipient's details. -#: templates/gifting/emails/plain/new-recipient-customer.php:26 -#, php-format -msgid "To complete your account we just need you to fill in your shipping address and you to change your password here: %s." -msgstr "" - -#. translators: placeholder is the name of the site. -#: templates/gifting/emails/plain/recipient-completed-renewal-order.php:15 -#: templates/gifting/emails/recipient-completed-renewal-order.php:18 -#, php-format -msgid "Hi there. Your subscription renewal order with %s has been completed. Your order details are shown below for your reference:" -msgstr "" - -#: templates/gifting/emails/plain/recipient-email-address-table.php:13 -#: templates/gifting/emails/recipient-email-address-table.php:16 -#: templates/gifting/order-details-customer.php:22 -msgid "Shipping address" -msgstr "" - -#. Translators: placeholder is the product name. -#: templates/gifting/emails/plain/recipient-email-order-items.php:19 -#, php-format -msgid "Product: %s" -msgstr "" - -#. Translators: placeholder is the product SKU. -#: templates/gifting/emails/plain/recipient-email-order-items.php:23 -#, php-format -msgid "SKU: #%s" -msgstr "" - -#. Translators: placeholder is the item's quantity. -#: templates/gifting/emails/plain/recipient-email-order-items.php:48 -#, php-format -msgid "Quantity: %s" -msgstr "" - -#. Translators: placeholder is a purchase note. -#: templates/gifting/emails/plain/recipient-email-order-items.php:53 -#, php-format -msgid "Purchase Note: %s" -msgstr "" - -#. Translators: placeholder is a date. -#: templates/gifting/emails/plain/recipient-email-subscriptions-table.php:17 -#, php-format -msgid "Start Date: %s" -msgstr "" - -#. Translators: placeholder is a subscription's price string. For example, "$5 / month for 12 months". -#: templates/gifting/emails/plain/recipient-email-subscriptions-table.php:32 -#, php-format -msgid "Period: %s" -msgstr "" - -#. translators: 1$: Purchaser's name and email, 2$ The name of the site. -#. Translators: 1) is the subscription's purchaser, 2) is either the singular or plural form of "subscription" and 3) is the blog's name. -#: templates/gifting/emails/plain/recipient-new-initial-order.php:14 -#: templates/gifting/emails/recipient-new-initial-order.php:19 -#, php-format -msgid "%1$s just purchased %2$s for you at %3$s." -msgstr "" - -#. translators: 1$: Purchaser's name and email, 2$ The name of the site. -#. Translators: 1) is the subscription's purchaser, 2) is either the singular or plural form of "subscription" and 3) is the blog's name. -#: templates/gifting/emails/plain/recipient-new-initial-order.php:14 -#: templates/gifting/emails/recipient-new-initial-order.php:19 -msgid "a subscription" -msgid_plural "subscriptions" -msgstr[0] "" -msgstr[1] "" - -#. translators: placeholder is the singular or plural form of "subscription". -#. Translators: placeholder is either the singular or plural form of "subscription". -#: templates/gifting/emails/plain/recipient-new-initial-order.php:16 -#: templates/gifting/emails/recipient-new-initial-order.php:23 -#, php-format -msgid " Details of the %s are shown below." -msgstr "" - -#. translators: placeholder is the singular or plural form of "subscription". -#. translators: 1) is the singular or plural form of "subscription", 2) is a link to "My Account". -#. Translators: placeholder is either the singular or plural form of "subscription". -#: templates/gifting/emails/plain/recipient-new-initial-order.php:16 -#: templates/gifting/emails/plain/recipient-new-initial-order.php:24 -#: templates/gifting/emails/recipient-new-initial-order.php:23 -#: templates/gifting/emails/recipient-new-initial-order.php:43 -msgid "subscription" -msgid_plural "subscriptions" -msgstr[0] "" -msgstr[1] "" - -#: templates/gifting/emails/plain/recipient-new-initial-order.php:21 -#: templates/gifting/emails/recipient-new-initial-order.php:34 -msgid "We noticed you didn't have an account so we created one for you. Your account login details will have been sent to you in a separate email." -msgstr "" - -#. translators: 1) is the singular or plural form of "subscription", 2) is a link to "My Account". -#: templates/gifting/emails/plain/recipient-new-initial-order.php:24 -#, php-format -msgid "You may access your account area to view your new %1$s here: %2$s." -msgstr "" - -#: templates/gifting/emails/plain/recipient-processing-renewal-order.php:14 -#: templates/gifting/emails/recipient-processing-renewal-order.php:15 -msgid "Your subscription renewal order has been received and is now being processed. Your order details are shown below for your reference:" -msgstr "" - -#: templates/gifting/emails/recipient-email-order-details.php:17 -msgid "Quantity" -msgstr "" - -#: templates/gifting/emails/recipient-email-order-items.php:24 -msgid "Product image" -msgstr "" - -#. Translators: placeholder is a product SKU. -#: templates/gifting/emails/recipient-email-order-items.php:33 -#, php-format -msgid " (#%s)" -msgstr "" - -#: templates/gifting/emails/recipient-email-subscriptions-table.php:12 -msgid "Subscription Information" -msgstr "" - -#: templates/gifting/emails/recipient-email-subscriptions-table.php:19 -msgctxt "table heading" -msgid "Period" -msgstr "" - -#. Translators: 1) is either the singular or plural form of "subscription", 2) is an tag pointing to "My Account", 3) is the closing tag. -#: templates/gifting/emails/recipient-new-initial-order.php:42 -#, php-format -msgid "You may access your account area to view your new %1$s here: %2$sMy Account%3$s." -msgstr "" - -#: templates/gifting/html-add-recipient.php:23 -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:222 -msgid "Gifting recipient" -msgstr "" - -#: templates/gifting/html-add-recipient.php:44 -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:104 -#: client/gifting/components/line-item-gift-recipient/index.js:135 -msgid "Please enter a valid email address" -msgstr "" - -#: templates/gifting/html-flat-gifting-recipient-details.php:15 -msgid "Recipient: " -msgstr "" - -#: templates/gifting/new-recipient-account.php:16 -msgid "We just need a few details from you to complete your account creation." -msgstr "" - -#. translators: 1$: user's email, 2$-3$: opening and closing link tags, logs the user out. -#: templates/gifting/new-recipient-account.php:22 -#, php-format -msgid "(not %1$s? %2$sSign out%3$s)" -msgstr "" - -#: templates/gifting/new-recipient-account.php:57 -msgid "Save" -msgstr "" - -#: templates/gifting/related-orders.php:22 -#: templates/myaccount/related-orders.php:26 -msgid "Order" -msgstr "" - -#: templates/gifting/related-orders.php:72 -#: templates/myaccount/my-subscriptions.php:49 -#: templates/myaccount/related-orders.php:58 -#: templates/myaccount/related-subscriptions.php:43 -msgctxt "Used in data attribute. Escaped" -msgid "Total" -msgstr "" - -#. translators: $1: formatted order total for the order, $2: number of items bought. -#. translators: $1: formatted order total for the order, $2: number of items bought -#: templates/gifting/related-orders.php:75 -#: templates/myaccount/related-orders.php:61 -#, php-format -msgid "%1$s for %2$d item" -msgid_plural "%1$s for %2$d items" -msgstr[0] "" -msgstr[1] "" - -#: templates/gifting/related-orders.php:86 -#: templates/myaccount/related-orders.php:70 -msgctxt "pay for a subscription" -msgid "Pay" -msgstr "" - -#: templates/gifting/related-orders.php:93 -msgctxt "cancel subscription" -msgid "Cancel" -msgstr "" - -#: templates/gifting/related-orders.php:99 -#: templates/myaccount/my-subscriptions.php:53 -#: templates/myaccount/related-orders.php:89 -#: templates/myaccount/related-subscriptions.php:47 -msgctxt "view a subscription" -msgid "View" -msgstr "" - -#: templates/gifting/subscription-totals.php:18 -msgid "Subscription Item" -msgid_plural "Subscription Items" -msgstr[0] "" -msgstr[1] "" - -#: templates/gifting/subscription-totals.php:40 -msgid "Are you sure you want remove this item from your subscription?" -msgstr "" - -#: templates/html-early-renewal-modal-content.php:23 -#, php-format -msgid "By renewing your subscription early your next payment will be %s." -msgstr "" - -#: templates/html-early-renewal-modal-content.php:28 -#, php-format -msgid "By renewing your subscription early, your scheduled next payment on %s will be cancelled." -msgstr "" - -#: templates/html-early-renewal-modal-content.php:34 -#, php-format -msgid "Want to renew early via the checkout? Click %shere.%s" -msgstr "" - -#: templates/myaccount/my-subscriptions.php:23 -#: templates/myaccount/related-subscriptions.php:23 -#: templates/myaccount/related-subscriptions.php:40 -msgctxt "table heading" -msgid "Next payment" -msgstr "" - -#: templates/myaccount/my-subscriptions.php:33 -#: templates/myaccount/related-subscriptions.php:31 -msgid "ID" -msgstr "" - -#. translators: placeholder is a subscription number. -#: templates/myaccount/my-subscriptions.php:35 -#: templates/myaccount/related-subscriptions.php:33 -#, php-format -msgid "View subscription number %s" -msgstr "" - -#: templates/myaccount/my-subscriptions.php:64 -msgid "Previous" -msgstr "" - -#: templates/myaccount/my-subscriptions.php:68 -msgid "Next" -msgstr "" - -#: templates/myaccount/my-subscriptions.php:75 -#, php-format -msgid "You have reached the end of subscriptions. Go to the %sfirst page%s." -msgstr "" - -#: templates/myaccount/my-subscriptions.php:77 -msgid "You have no active subscriptions." -msgstr "" - -#: templates/myaccount/my-subscriptions.php:80 -msgid "Browse products" -msgstr "" - -#: templates/myaccount/related-orders-pagination.php:39 -msgctxt "Related orders pagination" -msgid "First" -msgstr "" - -#: templates/myaccount/related-orders-pagination.php:40 -msgctxt "Related orders pagination" -msgid "Previous" -msgstr "" - -#: templates/myaccount/related-orders-pagination.php:44 -msgctxt "Related orders pagination" -msgid "Next" -msgstr "" - -#: templates/myaccount/related-orders-pagination.php:45 -msgctxt "Related orders pagination" -msgid "Last" -msgstr "" - -#: templates/myaccount/related-orders.php:19 -msgid "Related orders" -msgstr "" - -#. translators: placeholder is an order number. -#: templates/myaccount/related-orders.php:48 -#, php-format -msgid "View order number %s" -msgstr "" - -#: templates/myaccount/related-subscriptions.php:15 -msgid "Related subscriptions" -msgstr "" - -#: templates/myaccount/subscription-details.php:24 -msgctxt "customer subscription table header" -msgid "Start date" -msgstr "" - -#: templates/myaccount/subscription-details.php:25 -msgctxt "customer subscription table header" -msgid "Last order date" -msgstr "" - -#: templates/myaccount/subscription-details.php:26 -msgctxt "customer subscription table header" -msgid "Next payment date" -msgstr "" - -#: templates/myaccount/subscription-details.php:27 -msgctxt "customer subscription table header" -msgid "End date" -msgstr "" - -#: templates/myaccount/subscription-details.php:28 -msgctxt "customer subscription table header" -msgid "Trial end date" -msgstr "" - -#: templates/myaccount/subscription-details.php:42 -msgid "Auto renew" -msgstr "" - -#: templates/myaccount/subscription-details.php:50 -msgid "Enable auto renew" -msgstr "" - -#: templates/myaccount/subscription-details.php:57 -msgid "Disable auto renew" -msgstr "" - -#: templates/myaccount/subscription-details.php:62 -msgid "Using the auto-renewal toggle is disabled while in staging mode." -msgstr "" - -#: templates/myaccount/subscription-details.php:71 -msgid "Payment" -msgstr "" - -#: templates/myaccount/subscription-details.php:81 -msgid "Actions" -msgstr "" - -#: templates/myaccount/subscription-details.php:107 -msgid "Subscription updates" -msgstr "" - -#: templates/myaccount/subscription-details.php:113 -msgctxt "date on subscription updates list. Will be localized" -msgid "l jS \\o\\f F Y, h:ia" -msgstr "" - -#: templates/myaccount/subscription-totals-table.php:46 -msgid "Are you sure you want to remove this item from your subscription?" -msgstr "" - -#: templates/myaccount/subscription-totals.php:23 -msgid "Subscription totals" -msgstr "" - -#: templates/single-product/add-to-cart/subscription.php:44 -#: templates/single-product/add-to-cart/variable-subscription.php:43 -msgid "You have an active subscription to this product already." -msgstr "" - -#: templates/single-product/add-to-cart/variable-subscription.php:23 -msgid "This product is currently out of stock and unavailable." -msgstr "" - -#: templates/single-product/add-to-cart/variable-subscription.php:47 -msgid "You have added a variation of this product to the cart already." -msgstr "" - -#: templates/single-product/add-to-cart/variable-subscription.php:58 -msgid "Clear" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/components/announcement/index.js:112 -#: client/components/announcement/index.js:163 -#: client/components/announcement/__tests__/index.test.js:118 -#: client/components/announcement/__tests__/index.test.js:127 -msgid "Close" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/components/announcement/index.js:131 -#: client/components/announcement/__tests__/index.test.js:70 -#: client/components/announcement/__tests__/index.test.js:95 -#: client/components/announcement/__tests__/index.test.js:263 -#: client/components/announcement/__tests__/index.test.js:297 -msgid "Step image" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/components/announcement/index.js:175 -#: client/components/announcement/__tests__/index.test.js:115 -msgid "Done" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:8 -msgid "Gifting is now part of WooCommerce Subscriptions" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:12 -msgid "Introducing subscription gifting" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:15 -msgid "No separate extension needed! The built-in gifting feature is fully compatible with product, cart and checkout blocks, plus you can now choose which subscription products can be gifted." -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:21 -msgid "The Gifting for WooCommerce Subscriptions extension can now be disabled via Plugins." -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:26 -msgid "Let your shoppers purchase subscriptions as gifts using the new built-in gifting feature in WooCommerce Subscriptions. It works seamlessly with product, cart and checkout blocks, and can be enabled storewide or managed per product." -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:33 -msgid "Go to plugins" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:34 -msgid "Set up gifting" -msgstr "" - -#: build/gifting-welcome-announcement.js:1 -#: client/gifting/data/welcome-announcement.js:42 -msgid "Maybe later" -msgstr "" - -#: build/index.js:1 -#: client/core/utils/index.js:8 -msgctxt "Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular." -msgid "day" -msgid_plural "days" -msgstr[0] "" -msgstr[1] "" - -#: build/index.js:1 -#: client/core/utils/index.js:15 -msgctxt "Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular." -msgid "week" -msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" - -#: build/index.js:1 -#: client/core/utils/index.js:22 -msgctxt "Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular." -msgid "month" -msgid_plural "months" -msgstr[0] "" -msgstr[1] "" - -#: build/index.js:1 -#: client/core/utils/index.js:29 -msgctxt "Used in recurring totals section in Cart. 2+ will need plural, 1 will need singular." -msgid "year" -msgid_plural "years" -msgstr[0] "" -msgstr[1] "" - -#. translators: %1$s is the price of the product. %2$s is the separator used e.g "every" or "/", %3$d is the length, %4$s is week, month, year -#: build/index.js:10 -#: client/core/utils/index.js:166 -#, js-format -msgid "%1$s %2$s %3$d %4$s" -msgstr "" - -#. translators: %s Field label. -#: build/index.js:11 -#: client/core/utils/address.js:94 -#, js-format -msgid "%s (optional)" -msgstr "" - -#: build/index.js:11 -#: client/core/recurring-totals/index.js:123 -msgid "Pickup" -msgstr "" - -#: build/index.js:11 -#: client/core/recurring-totals/index.js:124 -msgid "Delivery" -msgstr "" - -#: build/index.js:11 -#: client/core/recurring-totals/index.js:129 -msgid "No available delivery option" -msgstr "" - -#: build/index.js:11 -#: client/core/recurring-totals/index.js:133 -msgid "Enter address to calculate" -msgstr "" - -#: build/index.js:11 -#: client/core/recurring-totals/index.js:186 -msgid "Free" -msgstr "" - -#. translators: %s selected shipping rate (ex: flat rate) -#: build/index.js:14 -#: client/core/recurring-totals/index.js:201 -#, js-format -msgid "via %s" -msgstr "" - -#. Translators: %1$s is a date. -#: build/index.js:15 -#: client/core/recurring-totals/index.js:235 -#, js-format -msgid "Due: %1$s" -msgstr "" - -#. Translators: %1$s is a date. -#: build/index.js:16 -#: client/core/recurring-totals/index.js:240 -#, js-format -msgid "Starting: %1$s" -msgstr "" - -#: build/index.js:16 -#: client/core/utils/index.js:65 -msgid "Daily recurring total" -msgstr "" - -#: build/index.js:16 -#: client/core/utils/index.js:70 -msgid "Weekly recurring total" -msgstr "" - -#: build/index.js:16 -#: client/core/utils/index.js:75 -msgid "Monthly recurring total" -msgstr "" - -#: build/index.js:16 -#: client/core/utils/index.js:80 -msgid "Yearly recurring total" -msgstr "" - -#. translators: %1$s is week, month, year -#: build/index.js:17 -#: client/core/utils/index.js:89 -#, js-format -msgid "Recurring total every 2nd %1$s" -msgstr "" - -#. Translators: %1$s is week, month, year -#: build/index.js:18 -#: client/core/utils/index.js:99 -#, js-format -msgid "Recurring total every 3rd %1$s" -msgstr "" - -#. Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year -#: build/index.js:19 -#: client/core/utils/index.js:108 -#, js-format -msgid "Recurring total every %1$dth %2$s" -msgstr "" - -#: build/index.js:19 -#: client/core/recurring-totals/index.js:362 -msgid "Details" -msgstr "" - -#: build/index.js:19 -#: client/core/filters/index.js:33 -msgid "Total due today" -msgstr "" - -#. translators: the word used to describe billing frequency, e.g. "for" 1 day or "for" 1 month. -#: build/index.js:22 -#: client/core/filters/index.js:60 -msgid "for 1" -msgstr "" - -#. translators: the word used to describe billing frequency, e.g. "for" 6 days or "for" 2 weeks. -#: build/index.js:25 -#: client/core/filters/index.js:67 -msgid "for" -msgstr "" - -#. translators: the word used to describe billing frequency, e.g. "every" 6 days or "every" 2 weeks. -#: build/index.js:28 -#: client/core/filters/index.js:74 -msgid "every" -msgstr "" - -#. translators: %s Product name. -#: build/index.js:31 -#: client/core/filters/index.js:93 -#, js-format -msgid "%s (resubscription)" -msgstr "" - -#. translators: %1$s Product name, %2$s Switch type (upgraded, downgraded, or crossgraded). -#: build/index.js:34 -#: client/core/filters/index.js:100 -#, js-format -msgid "%1$s (%2$s)" -msgstr "" - -#: build/index.js:34 -#: client/core/utils/index.js:185 -msgid "Upgrade" -msgstr "" - -#: build/index.js:34 -#: client/core/utils/index.js:188 -msgid "Downgrade" -msgstr "" - -#: build/index.js:34 -#: client/core/utils/index.js:191 -msgid "Crossgrade" -msgstr "" - -#. translators: %s is the subscription price to pay immediately (ie: $10). -#: build/index.js:35 -#: client/core/filters/index.js:112 -#, js-format -msgid "Due today %s" -msgstr "" - -#. translators: %s is the subscription price to pay immediately (ie: $10). -#: build/index.js:36 -#: client/core/filters/index.js:117 -#, js-format -msgid "%s due today" -msgstr "" - -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:187 -msgid "Gifting to:" -msgstr "" - -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:198 -msgid "Remove gift recipient" -msgstr "" - -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:204 -msgid "Remove" -msgstr "" - -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:218 -msgid "Recipient's email address" -msgstr "" - -#: build/wcsg-blocks-integration.js:1 -#: client/gifting/components/line-item-gift-recipient/index.js:233 -msgid "Update" -msgstr "" diff --git a/phpstan.neon b/phpstan.neon index c10b5db..06d563f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -66,236 +66,6 @@ parameters: count: 3 path: includes/api/class-wc-rest-subscriptions-controller.php - - - message: "#^Access to an undefined property WC_API_Subscriptions_Customers\\:\\:\\$base\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Access to an undefined property WC_API_Subscriptions_Customers\\:\\:\\$server\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Access to constant READABLE on an unknown class WC_API_SERVER\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Access to private property WooCommerce\\:\\:\\$api\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Access to property \\$WC_API_Subscriptions on an unknown class WC_API\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions_Customers\\:\\:validate_request\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Parameter \\$server of method WC_API_Subscriptions_Customers\\:\\:__construct\\(\\) has invalid type WC_API_Server\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^WC_API_Subscriptions_Customers\\:\\:__construct\\(\\) calls parent\\:\\:__construct\\(\\) but WC_API_Subscriptions_Customers does not extend any class\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions-customers.php - - - - message: "#^Access to an undefined property WC_API_Subscriptions\\:\\:\\$post_type\\.$#" - count: 7 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to an undefined property WC_API_Subscriptions\\:\\:\\$server\\.$#" - count: 5 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to an undefined property WooCommerce\\:\\:\\$payment_gateways\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant ACCEPT_DATA on an unknown class WC_API_Server\\.$#" - count: 4 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant CREATABLE on an unknown class WC_API_Server\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant DELETABLE on an unknown class WC_API_SERVER\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant DELETABLE on an unknown class WC_API_Server\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant EDITABLE on an unknown class WC_API_SERVER\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant EDITABLE on an unknown class WC_API_Server\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to constant READABLE on an unknown class WC_API_Server\\.$#" - count: 7 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to private property WooCommerce\\:\\:\\$api\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to property \\$WC_API_Customers on an unknown class WC_API\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:create_order\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:create_order_note\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:delete\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:delete_order_note\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:edit_order\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:edit_order_note\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:get_order\\(\\)\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:get_order_note\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:get_order_notes\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:get_orders_count\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:is_readable\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:merge_query_args\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to an undefined method WC_API_Subscriptions\\:\\:validate_request\\(\\)\\.$#" - count: 4 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to method getCode\\(\\) on an unknown class WC_API_Exception\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to method getErrorCode\\(\\) on an unknown class WC_API_Exception\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Call to method getMessage\\(\\) on an unknown class WC_API_Exception\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Caught class WC_API_Exception not found\\.$#" - count: 2 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Default value of the parameter \\#4 \\$page \\(int\\) of method WC_API_Subscriptions\\:\\:get_subscriptions\\(\\) is incompatible with type null\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Instantiated class WC_API_Exception not found\\.$#" - count: 6 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^PHPDoc tag @param has invalid value \\(array data raw order data\\)\\: Unexpected token \"data\", expected variable at offset 67$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$fields$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$id$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^is_wp_error\\(WC_Subscription\\) will always evaluate to false\\.$#" - count: 1 - path: includes/api/legacy/class-wc-api-subscriptions.php - - - - message: "#^Access to an undefined property WooCommerce\\:\\:\\$payment_gateways\\.$#" - count: 1 - path: includes/api/legacy/class-wc-rest-subscriptions-controller.php - - - - message: "#^Call to an undefined static method WC_REST_Orders_Controller\\:\\:create_order\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-rest-subscriptions-controller.php - - - - message: "#^Call to an undefined static method WC_REST_Orders_Controller\\:\\:update_order\\(\\)\\.$#" - count: 1 - path: includes/api/legacy/class-wc-rest-subscriptions-controller.php - - message: "#^Call to an undefined method WC_Order_Item\\:\\:get_product\\(\\)\\.$#" count: 1 @@ -1416,351 +1186,6 @@ parameters: count: 1 path: includes/core/gateways/paypal/includes/templates/html-ipn-failure-notice.php - - - message: "#^Access to an undefined property WC_Product_Subscription_Legacy\\:\\:\\$product_custom_fields\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Legacy\\:\\:\\$product_type\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Legacy\\:\\:\\$subscription_limit\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Legacy\\:\\:\\$subscription_one_time_shipping\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Legacy\\:\\:\\$subscription_payment_sync_date\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Variation_Legacy\\:\\:\\$parent_product_type\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Variation_Legacy\\:\\:\\$product_type\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Variation_Legacy\\:\\:\\$variation_id\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Variation_Legacy\\:\\:\\$variation_inherited_meta_data\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Subscription_Variation_Legacy\\:\\:\\$variation_level_meta_data\\.$#" - count: 3 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Method WC_Product_Subscription_Variation\\:\\:__construct\\(\\) invoked with 2 parameters, 0\\-1 required\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$key$#" - count: 1 - path: includes/core/legacy/class-wc-product-subscription-variation-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$max_variation_price\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$min_variation_regular_price\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$subscription_length\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$subscription_sign_up_fee\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$subscription_trial_length\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property \\$this\\(WC_Product_Variable_Subscription_Legacy\\)\\:\\:\\$subscription_trial_period\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$max_variation_price\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$min_variation_price\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$min_variation_regular_price\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$parent_product_type\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$product_custom_fields\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_length\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_limit\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_one_time_shipping\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_payment_sync_date\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_sign_up_fee\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_trial_length\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Product_Variable_Subscription_Legacy\\:\\:\\$subscription_trial_period\\.$#" - count: 2 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Call to an undefined method WooCommerce\\:\\:clear_product_transients\\(\\)\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Method WC_Product_Variable_Subscription_Legacy\\:\\:get_price_hash\\(\\) invoked with 2 parameters, 0\\-1 required\\.$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(WC_Product\\)\\: Unexpected token \"\\\\n\\\\t \\* \", expected variable at offset 318$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$include_taxes$#" - count: 1 - path: includes/core/legacy/class-wc-product-variable-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_address_1\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_address_2\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_city\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_company\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_country\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_email\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_first_name\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_last_name\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_phone\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_postcode\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$billing_state\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$customer_note\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$order_key\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$payment_method\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$payment_method_title\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$post\\.$#" - count: 13 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$post_status\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$prices_include_tax\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_address_1\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_address_2\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_city\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_company\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_country\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_first_name\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_last_name\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_postcode\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Access to an undefined property WC_Subscription_Legacy\\:\\:\\$shipping_state\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Default value of the parameter \\#3 \\$meta_id \\(string\\) of method WC_Subscription_Legacy\\:\\:update_meta_data\\(\\) is incompatible with type int\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^Method WC_Subscription_Legacy\\:\\:set_last_order_date\\(\\) should return WC_DateTime\\|null but return statement is missing\\.$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(array\\|int Either an order item \\(in the array format returned by self\\:\\:get_items\\(\\)\\) or the ID of an order item\\.\\)\\: Unexpected token \"Either\", expected variable at offset 399$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(int\\)\\: Unexpected token \"\\\\n\\\\t \", expected variable at offset 61$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(string\\)\\: Unexpected token \"\\\\n\\\\t \\* \", expected variable at offset 555$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(string\\)\\: Unexpected token \"\\\\n\\\\t \\* \", expected variable at offset 573$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param has invalid value \\(string\\|integer\\|object\\)\\: Unexpected token \"\\\\n\\\\t \\* \", expected variable at offset 203$#" - count: 1 - path: includes/core/legacy/class-wc-subscription-legacy.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$product$#" - count: 1 - path: includes/core/legacy/class-wcs-array-property-post-meta-black-magic.php - - message: "#^Function as_next_scheduled_action not found\\.$#" count: 3 diff --git a/src/Internal/Telemetry/example.json5 b/src/Internal/Telemetry/example.json5 new file mode 100644 index 0000000..f92b829 --- /dev/null +++ b/src/Internal/Telemetry/example.json5 @@ -0,0 +1,256 @@ +// This data is sent under ['extensions']['wc_subscriptions]. +{ + + generation_timestamp: 1704067200, // int - unix timestamp when this data was generated + total_generation_time: 342.56, // float - time taken to generate this data in milliseconds + telemetry_cache: "miss" // string - hit|miss. Cache status - "hit" if from cache, "miss" if freshly generated + + // --- Orders data + order_trends: { + + by_order_type: { // object - monthly order data grouped by order type + store_gross: [ // array - store's total GMV (all orders, not just subscription-related) + { + month: "2025-01", // string - YYYY-MM format + gross: 1250.50, // float - total value of all orders in this month + }, + { + month: "2025-02", + gross: 1500.75, + }, + // ... more months + ], + + initial: [ // array - parent orders (orders that created subscriptions) + { + month: "2025-01", // string - YYYY-MM format + count: 15, // int - count of initial orders in this month + gross: 750.00, // float - total value of initial orders in this month + non_zero_count: 12, // int - count of initial orders with non-zero total in this month + quantity: 20, // int - total quantity of items in initial orders in this month + non_zero_quantity: 18, // int - total quantity of items in non-zero initial orders in this month + }, + { + month: "2025-02", + count: 18, + gross: 900.00, + non_zero_count: 15, + quantity: 24, + non_zero_quantity: 22, + }, + // ... more months + ], + + renewal: [ // array - renewal orders (recurring subscription payments) + { + month: "2025-01", + count: 10, + gross: 500.00, + non_zero_count: 8, + }, + { + month: "2025-02", + count: 12, + gross: 600.00, + non_zero_count: 10, + }, + // ... more months + ], + + switch: [ // array - switch orders (subscription product changes) + { + month: "2025-01", + count: 5, + gross: 250.00, + non_zero_count: 4, + }, + // ... more months + ], + + resubscribe: [ // array - resubscribe orders (reactivated cancelled subscriptions) + { + month: "2025-01", + count: 2, + gross: 100.00, + non_zero_count: 2, + }, + // ... more months + ], + }, + + by_payment_gateway: { // object - monthly order data grouped by payment gateway + stripe: [ // string key - payment gateway identifier (empty string for none) + { + month: "2024-01", // string - YYYY-MM format + count: 145, // int - count of orders for this gateway in this month + gross: 12345.67, // float - total value of orders for this gateway in this month + }, + { + month: "2024-02", + count: 150, + gross: 13500.00, + }, + // ... more months for this gateway + ], + paypal: [ + { + month: "2024-01", + count: 30, + gross: 2500.00, + }, + // ... more months for this gateway + ], + "": [ // empty string key represents orders with no payment method + { + month: "2024-01", + count: 5, + gross: 0.00, + }, + ], + }, + }, + + // --- Subscription products data + products: { + + frequencies: [ // array of objects - billing frequencies for published subscription products + { + period: "month", // string - 'day'|'week'|'month'|'year' + interval: 1, // int - billing interval (1, 2, 3, etc.) + count: 45 // int - count of products with this frequency + }, + { + period: "month", + interval: 3, + count: 12 + }, + // ... more period/interval combinations + ], + + giftable: 23, // int - count of active products eligible for gifting + }, + + // --- Subscriptions data + subscriptions: { + + gifted: 15, // int - count of gifted subscriptions + renewing_automatically: 185, // int - count of active subscriptions renewing automatically + renewing_manually: 15, // int - count of active subscriptions requiring manual renewal + subscriber_count: 142, // int - count of unique customers with at least one active subscription + + payment_methods: [ // array of objects - active subscriptions grouped by payment gateway + { + payment_method: "stripe", // string - payment gateway identifier (empty string for none) + active_subscription_count: 127, // int - count of active subscriptions + inactive_subscription_count: 36, // int - count of inactive subscriptions + method_renews_off_site: "yes", // string - 'yes'|'no'|'unknown'. Whether the payment gateway supports "gateway_scheduled_payments" + manual_renewal_only: "no", // string - 'yes'|'no'|'unknown'. Whether the payment gateway supports "subscriptions" + }, + { + payment_method: "", // empty string represents subscriptions with no payment method + active_subscription_count: 58, + inactive_subscription_count: 14, + method_renews_off_site: "unknown", // "unknown" used when the paymeny gateway associated with the subscription isn't found in WC_Payment_Gateways + manual_renewal_only: "unknown", + } + // ... more payment gateways + ], + + renewal_frequencies: [ // array of objects - billing frequencies for active subscriptions + { + period: "month", // string - 'day'|'week'|'month'|'year' + interval: 1, // int - billing interval (1, 2, 3, etc.) + count: 150 // int - count of subscriptions with this frequency + }, + { + period: "month", + interval: 3, + count: 35 + }, + // ... more period/interval combinations + ], + + // --- Legacy subscriptions data + // Subscription dates + first: "2023-01-15 10:23:45", // string - date of first subscription in 'Y-m-d H:i:s' format, or '-' if none + last: "2024-12-28 16:42:12", // string - date of last subscription in 'Y-m-d H:i:s' format, or '-' if none + + // Subscription counts by status + "wc-active": "387", // string - count of active subscriptions + "wc-on-hold": "23", // string - count of on-hold subscriptions + "wc-pending": "12", // string - count of pending subscriptions + "wc-cancelled": "145", // string - count of cancelled subscriptions + "wc-expired": "67", // string - count of expired subscriptions + "wc-pending-cancel": "5", // string - count of pending cancellation subscriptions + "wc-switched": "0", // string - count of switched subscriptions + }, + + // --- Legacy subscription orders data + subscription_orders: { + initial_count: "523", // string - count of initial orders + initial_gross: "45234.50", // string - total gross for initial orders + + switch_count: "78", // string - count of switch orders + switch_gross: "3421.25", // string - total gross for switch orders + + renewal_count: "1247", // string - count of renewal orders + renewal_gross: "89234.75", // string - total gross for renewal orders + + resubscribe_count: "34", // string - count of resubscribe orders + resubscribe_gross: "2156.00", // string - total gross for resubscribe orders + }, + + // --- Settings data + settings: { + // Staging and live site + wc_subscriptions_staging: "live", // string - 'staging'|'live' + wc_subscriptions_live_url: "https://example.com", // string - URL of live site + + // Button text + add_to_cart_button_text: "Sign up now", // string - Add to Cart Button Text + order_button_text: "Sign up now", // string - Place Order Button Text + + // Roles + subscriber_role: "subscriber", // string - Subscriber Default Role + cancelled_role: "customer", // string - Inactive Subscriber Role + + // Renewals + accept_manual_renewals: "no", // string - Accept Manual Renewals + turn_off_automatic_payments: "none", // string - Turn off Automatic Payments + enable_auto_renewal_toggle: "no", // string - Auto Renewal Toggle + + // Early renewal + enable_early_renewal: "yes", // string - Accept Early Renewal Payments + enable_early_renewal_via_modal: "yes", // string - Accept Early Renewal Payments via a Modal + + // Switching + allow_switching: "no", // string - Between Subscription Variations and Between Grouped Subscriptions + apportion_recurring_price: "none", // string - Prorate Recurring Payment + apportion_sign_up_fee: "none", // string - Prorate Sign up Fee + apportion_length: "none", // string - Prorate Subscription Length + switch_button_text: "Upgrade or Downgrade", // string - Switch Button Text + + // Gifting + gifting_enable_gifting: "no", // string - Enable gifting + gifting_default_option: "none", // string - Default gifting option + gifting_gifting_checkbox_text: "This is a gift", // string - Gifting Checkbox Text + gifting_downloadable_products: "no", // string - Downloadable Products + + // Synchronization + sync_payments: "no", // string - Synchronise renewals + prorate_synced_payments: "none", // string - Prorate First Renewal + days_no_fee: "none", // string - Sign-up grace period + + // Miscellaneous + max_customer_suspensions: "0", // string - Customer Suspensions + multiple_purchase: "no", // string - Mixed Checkout + allow_zero_initial_order_without_payment_method: "no", // string - $0 Initial Checkout + drip_downloadable_content_on_renewal: "no", // string - Drip Downloadable Content + enable_retry: "yes", // string - Retry Failed Payments + + // Notifications + enable_notification_reminders: "no", // string - Enable Reminders + customer_notifications_offset_number: "none", // string - Reminder Timing (number) + customer_notifications_offset_unit: "none", // string - Reminder Timing (unit) + }, +} \ No newline at end of file diff --git a/templates/gifting/related-orders.php b/templates/gifting/related-orders.php index 194fb50..2c1ebac 100644 --- a/templates/gifting/related-orders.php +++ b/templates/gifting/related-orders.php @@ -63,7 +63,7 @@ if ( ! defined( 'ABSPATH' ) ) { echo esc_html( wc_get_order_status_name( $order->get_status() ) ); if ( ! in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_payment', array( 'pending', 'failed' ), $order ), true ) ) { if ( get_current_user_id() != $order->get_user_id() ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison - echo '
' . esc_html( 'Purchased by ' . $order->get_user()->display_name ) . ''; + echo '
' . esc_html( 'Purchased by ' . $order->get_user()->display_name ) . ''; } } ?> diff --git a/templates/html-early-renewal-modal-content.php b/templates/html-early-renewal-modal-content.php index 467f402..69c29da 100644 --- a/templates/html-early-renewal-modal-content.php +++ b/templates/html-early-renewal-modal-content.php @@ -29,7 +29,7 @@ $include_item_removal_links = $include_switch_links = false; '' . esc_html( date_i18n( wc_date_format(), $subscription->get_time( 'next_payment', 'site' ) ) ) . '' ) ); }?> -
+
', diff --git a/vendor/autoload.php b/vendor/autoload.php index 44ff1dc..59c9a7b 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -14,10 +14,7 @@ if (PHP_VERSION_ID < 50600) { echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index 51e734a..2052022 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -26,12 +26,23 @@ use Composer\Semver\VersionParser; */ class InstalledVersions { + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +320,24 @@ class InstalledVersions { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** @@ -322,19 +351,27 @@ class InstalledVersions } $installed = array(); + $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } @@ -350,7 +387,7 @@ class InstalledVersions } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index d4aaf79..d1add03 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -137,4 +137,10 @@ return array( 'WCSG_Recipient_Management' => $baseDir . '/includes/gifting/class-wcsg-recipient-management.php', 'WCSG_Template_Loader' => $baseDir . '/includes/gifting/class-wcsg-template-loader.php', 'WCS_Gifting' => $baseDir . '/includes/gifting/class-wcs-gifting.php', + 'WC_Subscription_Downloads' => $baseDir . '/includes/downloads/class-wc-subscription-downloads.php', + 'WC_Subscription_Downloads_Ajax' => $baseDir . '/includes/downloads/class-wc-subscription-downloads-ajax.php', + 'WC_Subscription_Downloads_Install' => $baseDir . '/includes/downloads/class-wc-subscription-downloads-install.php', + 'WC_Subscription_Downloads_Order' => $baseDir . '/includes/downloads/class-wc-subscription-downloads-order.php', + 'WC_Subscription_Downloads_Products' => $baseDir . '/includes/downloads/class-wc-subscription-downloads-products.php', + 'WC_Subscription_Downloads_Settings' => $baseDir . '/includes/downloads/class-wc-subscription-downloads-settings.php', ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index bee98d4..0b9ff43 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,22 +7,22 @@ namespace Composer\Autoload; class ComposerStaticInitcb45de1ca955f89ec737c442c7cf101c { public static $prefixLengthsPsr4 = array ( - 'C' => + 'C' => array ( 'Composer\\Installers\\' => 20, ), - 'A' => + 'A' => array ( 'Automattic\\WooCommerce_Subscriptions\\' => 37, ), ); public static $prefixDirsPsr4 = array ( - 'Composer\\Installers\\' => + 'Composer\\Installers\\' => array ( 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', ), - 'Automattic\\WooCommerce_Subscriptions\\' => + 'Automattic\\WooCommerce_Subscriptions\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), @@ -160,6 +160,12 @@ class ComposerStaticInitcb45de1ca955f89ec737c442c7cf101c 'WCSG_Recipient_Management' => __DIR__ . '/../..' . '/includes/gifting/class-wcsg-recipient-management.php', 'WCSG_Template_Loader' => __DIR__ . '/../..' . '/includes/gifting/class-wcsg-template-loader.php', 'WCS_Gifting' => __DIR__ . '/../..' . '/includes/gifting/class-wcs-gifting.php', + 'WC_Subscription_Downloads' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads.php', + 'WC_Subscription_Downloads_Ajax' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads-ajax.php', + 'WC_Subscription_Downloads_Install' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads-install.php', + 'WC_Subscription_Downloads_Order' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads-order.php', + 'WC_Subscription_Downloads_Products' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads-products.php', + 'WC_Subscription_Downloads_Settings' => __DIR__ . '/../..' . '/includes/downloads/class-wc-subscription-downloads-settings.php', ); public static function getInitializer(ClassLoader $loader) diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index a2b55b8..6749fbe 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,9 +1,9 @@ array( 'name' => 'woocommerce/woocommerce-subscriptions', - 'pretty_version' => 'dev-release/8.0.0', - 'version' => 'dev-release/8.0.0', - 'reference' => 'fae6f1f47d4716196c53f3d73845d84afd815c63', + 'pretty_version' => 'dev-release/8.1.0', + 'version' => 'dev-release/8.1.0', + 'reference' => '073151600fa05dc26b7244faf4808c0f49e63436', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -29,9 +29,9 @@ 'dev_requirement' => false, ), 'woocommerce/woocommerce-subscriptions' => array( - 'pretty_version' => 'dev-release/8.0.0', - 'version' => 'dev-release/8.0.0', - 'reference' => 'fae6f1f47d4716196c53f3d73845d84afd815c63', + 'pretty_version' => 'dev-release/8.1.0', + 'version' => 'dev-release/8.1.0', + 'reference' => '073151600fa05dc26b7244faf4808c0f49e63436', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php index 589e9e7..6cd6b53 100644 --- a/vendor/composer/platform_check.php +++ b/vendor/composer/platform_check.php @@ -19,8 +19,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/woocommerce-subscriptions.php b/woocommerce-subscriptions.php index d826a05..43e6e94 100644 --- a/woocommerce-subscriptions.php +++ b/woocommerce-subscriptions.php @@ -5,10 +5,10 @@ * Description: Sell products and services with recurring payments in your WooCommerce Store. * Author: WooCommerce * Author URI: https://woocommerce.com/ - * Version: 8.0.0 + * Version: 8.1.0 * Requires Plugins: woocommerce * - * WC requires at least: 10.1.0 + * WC requires at least: 10.2.0 * WC tested up to: 10.3.0 * Requires PHP: 7.4 * @@ -47,6 +47,15 @@ add_action( } ); +add_action( + 'woocommerce_init', + function () { + // Overrides the WooCommerce version to the WC()->version. + // This prevents the wrong version being stored in the transient during a WooCommerce core downgrade. + set_transient( 'wcs_woocommerce_active_version', WC()->version, HOUR_IN_SECONDS ); + } +); + // Subscribe to automated translations. add_filter( 'woocommerce_translations_updates_for_woocommerce-subscriptions', '__return_true' ); @@ -75,7 +84,7 @@ class WC_Subscriptions { public static $plugin_file = __FILE__; /** @var string */ - public static $version = '8.0.0'; // WRCS: DEFINED_VERSION. + public static $version = '8.1.0'; // WRCS: DEFINED_VERSION. /** @var string */ public static $wc_minimum_supported_version = '7.7';