PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.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 5 days ago ErrorsService.php 4 years ago ErrorsServiceProvider.php 4 years ago ErrorsTranslationService.php 5 days ago
ErrorsTranslationService.php
251 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 if (
110 in_array( $attribute, [ 'weight', 'g_weight', 'shipments.weight', 'shipments.g_weight' ], true )
111 && 'greater_than' === $type
112 && isset( $options['count'] )
113 ) {
114 // translators: %s is the minimum weight.
115 return sprintf( __( 'The weight must be greater than %s.', 'surecart' ), $options['count'] );
116 }
117
118 // Remind at period percent remaining translation.
119 if ( 'remind_at_period_percent_remaining' === $attribute && isset( $options['count'] ) ) {
120 if ( 'greater_than_or_equal_to' === $type ) {
121 // translators: minimum percentage.
122 return sprintf( __( 'You must enter a percentage greater than or equal to %s', 'surecart' ), $options['count'] );
123 } elseif ( 'less_than_or_equal_to' === $type ) {
124 // translators: maximum percentage.
125 return sprintf( __( 'You must enter a percentage less than or equal to %s', 'surecart' ), $options['count'] );
126 }
127 }
128
129 if ( 'line_items' === $attribute && 'not_purchasable' === $type && ! empty( $options['purchasable_statuses'] ) ) {
130 $line_item_translations = array(
131 'price_gone' => __( 'One or more items in your cart is no longer available. Please update your cart and try again.', 'surecart' ),
132 'price_old_version' => __( 'The price of one of the items on cart has changed. Please review and try again.', 'surecart' ),
133 'variant_missing' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
134 'variant_gone' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
135 'variant_old_version' => __( 'One of the items on cart has changed. Please review and try again.', 'surecart' ),
136 'out_of_stock' => __( 'One of the items on cart is out of stock. Please review and try again.', 'surecart' ),
137 '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' ),
138 );
139
140 $line_item_translated_error = $line_item_translations[ $options['purchasable_statuses'][0] ?? '' ] ?? false;
141
142 if ( $line_item_translated_error ) {
143 return $line_item_translated_error;
144 }
145 }
146
147 // Unique name translation.
148 if ( 'name' === $attribute && 'taken' === $type ) {
149 return sprintf(
150 // translators: %s is the name.
151 __( 'The name "%s" is already taken. Please choose a different name.', 'surecart' ),
152 $options['value'],
153 );
154 }
155
156 return false;
157 }
158
159 /**
160 * Translate just the type field
161 *
162 * @param string $type Type sting.
163 * @return string|false
164 */
165 public function typeTranslation( $type = '' ) {
166 if ( ! $type ) {
167 return false;
168 }
169
170 // we have no attribute.
171 $type_translations = include 'Translations/types.php';
172
173 if ( ! empty( $type_translations[ $type ] ) ) {
174 return $type_translations[ $type ];
175 }
176
177 return false;
178 }
179
180 /**
181 * Translate a specific error response
182 *
183 * @param array $response Error response.
184 * @return \WP_Error
185 */
186 public function translateErrorMessage( $response, $fallback = null ) {
187 // translate attribute.
188 $translated = $this->attributeTranslation( $response['attribute'] ?? '', $response['type'] ?? '', $response['options'] ?? [] );
189 if ( $translated ) {
190 return apply_filters( 'surecart/translated_error', $translated, $response );
191 }
192
193 // translate specific error code.
194 $translated = $this->codeTranslation( $response['code'] ?? '' );
195 if ( $translated ) {
196 return apply_filters( 'surecart/translated_error', $translated, $response );
197 }
198
199 // translate type.
200 $translated = $this->typeTranslation( $response['type'] ?? '' );
201 if ( $translated ) {
202 return apply_filters( 'surecart/translated_error', $translated, $response );
203 }
204
205 // fallback.
206 return $fallback ?? __( 'Error.', 'surecart' );
207 }
208
209 /**
210 * Translate Errors
211 *
212 * @param array $response Response from platform.
213 * @param integer $code Status code.
214 *
215 * @return \WP_Error
216 */
217 public function translate( $response = null, $code = null ) {
218 // fallback.
219 if ( empty( $response['message'] ) ) {
220 error_log( print_r( $response, 1 ) );
221 return new \WP_Error( 'error', __( 'Error.', 'surecart' ) );
222 }
223
224 $formatted = new \WP_Error(
225 $response['code'] ?? '',
226 $this->translateErrorMessage( $response, $response['message'] ?? '' ),
227 [
228 'status' => $code,
229 'type' => $response['type'] ?? '',
230 'http_status' => $response['http_status'] ?? '',
231 ]
232 );
233
234 if ( ! empty( $response['validation_errors'] ) ) {
235 foreach ( $response['validation_errors'] as $error ) {
236 $formatted->add(
237 $error['code'] ?? 'invalid',
238 $this->translateErrorMessage( $error, $error['message'] ),
239 [
240 'attribute' => $error['attribute'] ?? '',
241 'type' => $error['type'] ?? '',
242 'options' => $error['options'] ?? [],
243 ]
244 );
245 }
246 }
247
248 return apply_filters( 'surecart/translated_errors', $formatted );
249 }
250 }
251