PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.0
4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / Support / Errors / ErrorsTranslationService.php
surecart / app / src / Support / Errors Last commit date
Translations 1 month ago ErrorsService.php 3 years ago ErrorsServiceProvider.php 3 years ago ErrorsTranslationService.php 7 months ago
ErrorsTranslationService.php
242 lines
1 <?php
2
3 namespace SureCart\Support\Errors;
4
5 use SureCart\Support\Currency;
6
7 /**
8 * Handles error translations from the API.
9 */
10 class ErrorsTranslationService {
11 /**
12 * Translate based on specific error code.
13 *
14 * @param string $code The error code.
15 * @return string|false The translated error message or false if not found.
16 */
17 public function codeTranslation( $code = '' ) {
18 if ( ! $code ) {
19 return false;
20 }
21
22 // very specific.
23 $code_translations = include 'Translations/codes.php';
24 if ( ! empty( $code_translations[ $code ] ) ) {
25 return $code_translations[ $code ];
26 }
27
28 return false;
29 }
30
31 /**
32 * Replaceable attribute translation
33 *
34 * @param string $attribute Attribute name.
35 * @param string $type Type of validation.
36 *
37 * @return string|false
38 */
39 public function attributeTranslation( $attribute, $type, $options = [] ) {
40 // if both are empty, return.
41 if ( empty( $attribute ) && empty( $type ) ) {
42 return false;
43 }
44
45 if ( ! empty( $options ) ) {
46 $special = $this->attributeOptionsTranslation( $attribute, $type, $options );
47 if ( $special ) {
48 return $special;
49 }
50 }
51
52 $attribute_translations = include 'Translations/attributes.php';
53 $type_translations_replaceable = include 'Translations/types-replaceable.php';
54
55 // we have an attribute.
56 if ( ! empty( $attribute_translations[ $attribute ] ) ) {
57 // we have a type.
58 if ( ! empty( $type_translations_replaceable[ $type ] ) ) {
59 return sprintf( $type_translations_replaceable[ $type ], $attribute_translations[ $attribute ] );
60 }
61 // translators: field name.
62 return sprintf( __( '%s is invalid.', 'surecart' ), $attribute_translations[ $attribute ] );
63 }
64
65 return false;
66 }
67
68 public function attributeOptionsTranslation( $attribute, $type, $options ) {
69 if ( 'line_items.ad_hoc_amount' === $attribute && 'outside_range' === $type ) {
70 $min = Currency::format( $options['min'] );
71 $max = $options['max'] ?? null;
72
73 // If max is empty, show a message without the upper limit.
74 if ( empty( $max ) ) {
75 // translators: %s is the minimum amount.
76 return sprintf( __( 'You must enter an amount of at least %s', 'surecart' ), $min );
77 }
78
79 // translators: 1. minimum amount, 2. maximum amount.
80 return sprintf( __( 'You must enter an amount between %1$s and %2$s', 'surecart' ), $min, Currency::format( $max ) );
81 }
82
83 if ( 'line_items.quantity' === $attribute && 'greater_than_or_equal_to' === $type ) {
84 if ( $options['value'] < 1 ) {
85 return __( 'The product is out of stock. Please remove it from your cart.', 'surecart' );
86 }
87
88 // translators: minimum quantity.
89 return sprintf( __( 'You must enter a quantity greater than or equal to %s', 'surecart' ), $options['value'] );
90 }
91
92 // refund quantity greater than or equal to.
93 if ( 'refund_items.quantity' === $attribute && 'greater_than_or_equal_to' === $type && ! empty( $options['value'] ) ) {
94 // translators: minimum quantity.
95 return sprintf( __( 'You must enter a quantity greater than or equal to %s', 'surecart' ), $options['value'] );
96 }
97
98 if ( 'coupon' === $attribute && 'less_than_min_subtotal_amount' === $type && ! empty( $options['coupon_min_subtotal_amount'] ) && ! empty( $options['currency'] ) ) {
99 // translators: minimum amount for coupon.
100 return sprintf( __( 'You must spend at least %s to use this coupon.', 'surecart' ), Currency::format( $options['coupon_min_subtotal_amount'], $options['currency'] ) );
101 }
102
103 // Minimum order amount by processor.
104 if ( 'amount_due' === $attribute && 'less_than_currency_minimum' === $type && ! empty( $options['minimum_amount'] ) && ! empty( $options['currency'] ) ) {
105 // translators: minimum amount for processor.
106 return sprintf( __( 'The minimum order amount for the processor is %s.', 'surecart' ), Currency::format( $options['minimum_amount'], $options['currency'] ) );
107 }
108
109 // Remind at period percent remaining translation.
110 if ( 'remind_at_period_percent_remaining' === $attribute && isset( $options['count'] ) ) {
111 if ( 'greater_than_or_equal_to' === $type ) {
112 // translators: minimum percentage.
113 return sprintf( __( 'You must enter a percentage greater than or equal to %s', 'surecart' ), $options['count'] );
114 } elseif ( 'less_than_or_equal_to' === $type ) {
115 // translators: maximum percentage.
116 return sprintf( __( 'You must enter a percentage less than or equal to %s', 'surecart' ), $options['count'] );
117 }
118 }
119
120 if ( 'line_items' === $attribute && 'not_purchasable' === $type && ! empty( $options['purchasable_statuses'] ) ) {
121 $line_item_translations = array(
122 'price_gone' => __( 'One or more items in your cart is no longer available. Please update your cart and try again.', 'surecart' ),
123 'price_old_version' => __( 'The price of one of the items on cart has changed. Please review and try again.', 'surecart' ),
124 'variant_missing' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
125 'variant_gone' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
126 'variant_old_version' => __( 'One of the items on cart has changed. Please review and try again.', 'surecart' ),
127 'out_of_stock' => __( 'One of the items on cart is out of stock. Please review and try again.', 'surecart' ),
128 'exceeds_purchase_limit' => __( 'One or more items in your cart exceed the purchase limit. Please adjust the quantity or remove the item to proceed with the checkout.', 'surecart' ),
129 );
130
131 $line_item_translated_error = $line_item_translations[ $options['purchasable_statuses'][0] ?? '' ] ?? false;
132
133 if ( $line_item_translated_error ) {
134 return $line_item_translated_error;
135 }
136 }
137
138 // Unique name translation.
139 if ( 'name' === $attribute && 'taken' === $type ) {
140 return sprintf(
141 // translators: %s is the name.
142 __( 'The name "%s" is already taken. Please choose a different name.', 'surecart' ),
143 $options['value'],
144 );
145 }
146
147 return false;
148 }
149
150 /**
151 * Translate just the type field
152 *
153 * @param string $type Type sting.
154 * @return string|false
155 */
156 public function typeTranslation( $type = '' ) {
157 if ( ! $type ) {
158 return false;
159 }
160
161 // we have no attribute.
162 $type_translations = include 'Translations/types.php';
163
164 if ( ! empty( $type_translations[ $type ] ) ) {
165 return $type_translations[ $type ];
166 }
167
168 return false;
169 }
170
171 /**
172 * Translate a specific error response
173 *
174 * @param array $response Error response.
175 * @return \WP_Error
176 */
177 public function translateErrorMessage( $response, $fallback = null ) {
178 // translate attribute.
179 $translated = $this->attributeTranslation( $response['attribute'] ?? '', $response['type'] ?? '', $response['options'] ?? [] );
180 if ( $translated ) {
181 return apply_filters( 'surecart/translated_error', $translated, $response );
182 }
183
184 // translate specific error code.
185 $translated = $this->codeTranslation( $response['code'] ?? '' );
186 if ( $translated ) {
187 return apply_filters( 'surecart/translated_error', $translated, $response );
188 }
189
190 // translate type.
191 $translated = $this->typeTranslation( $response['type'] ?? '' );
192 if ( $translated ) {
193 return apply_filters( 'surecart/translated_error', $translated, $response );
194 }
195
196 // fallback.
197 return $fallback ?? __( 'Error.', 'surecart' );
198 }
199
200 /**
201 * Translate Errors
202 *
203 * @param array $response Response from platform.
204 * @param integer $code Status code.
205 *
206 * @return \WP_Error
207 */
208 public function translate( $response = null, $code = null ) {
209 // fallback.
210 if ( empty( $response['message'] ) ) {
211 error_log( print_r( $response, 1 ) );
212 return new \WP_Error( 'error', __( 'Error.', 'surecart' ) );
213 }
214
215 $formatted = new \WP_Error(
216 $response['code'] ?? '',
217 $this->translateErrorMessage( $response, $response['message'] ?? '' ),
218 [
219 'status' => $code,
220 'type' => $response['type'] ?? '',
221 'http_status' => $response['http_status'] ?? '',
222 ]
223 );
224
225 if ( ! empty( $response['validation_errors'] ) ) {
226 foreach ( $response['validation_errors'] as $error ) {
227 $formatted->add(
228 $error['code'] ?? 'invalid',
229 $this->translateErrorMessage( $error, $error['message'] ),
230 [
231 'attribute' => $error['attribute'] ?? '',
232 'type' => $error['type'] ?? '',
233 'options' => $error['options'] ?? [],
234 ]
235 );
236 }
237 }
238
239 return apply_filters( 'surecart/translated_errors', $formatted );
240 }
241 }
242