PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
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 year ago ErrorsService.php 3 years ago ErrorsServiceProvider.php 3 years ago ErrorsTranslationService.php 1 year ago
ErrorsTranslationService.php
216 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 // translators: 1. minimum amount, 2. maximum amount.
71 return sprintf( __( 'You must enter an amount between %1$s and %2$s', 'surecart' ), $options['min'] / 100, $options['max'] / 100 );
72 }
73
74 if ( 'line_items.quantity' === $attribute && 'greater_than_or_equal_to' === $type ) {
75 if ( $options['value'] < 1 ) {
76 return __( 'The product is out of stock. Please remove it from your cart.', 'surecart' );
77 }
78
79 // translators: minimum quantity.
80 return sprintf( __( 'You must enter a quantity greater than or equal to %s', 'surecart' ), $options['value'] );
81 }
82
83 if ( 'coupon' === $attribute && 'less_than_min_subtotal_amount' === $type && ! empty( $options['coupon_min_subtotal_amount'] ) && ! empty( $options['currency'] ) ) {
84 // translators: minimum amount for coupon.
85 return sprintf( __( 'You must spend at least %s to use this coupon.', 'surecart' ), Currency::format( $options['coupon_min_subtotal_amount'], $options['currency'] ) );
86 }
87
88 // Minimum order amount by processor.
89 if ( 'amount_due' === $attribute && 'less_than_currency_minimum' === $type && ! empty( $options['minimum_amount'] ) && ! empty( $options['currency'] ) ) {
90 // translators: minimum amount for processor.
91 return sprintf( __( 'The minimum order amount for the processor is %s.', 'surecart' ), Currency::format( $options['minimum_amount'], $options['currency'] ) );
92 }
93
94 if ( 'line_items' === $attribute && 'not_purchasable' === $type && ! empty( $options['purchasable_statuses'] ) ) {
95 $line_item_translations = array(
96 'price_gone' => __( 'One or more items in your cart is no longer available. Please update your cart and try again.', 'surecart' ),
97 'price_old_version' => __( 'The price of one of the items on cart has changed. Please review and try again.', 'surecart' ),
98 'variant_missing' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
99 'variant_gone' => __( 'One of the items on cart is no longer available. Please review and try again.', 'surecart' ),
100 'variant_old_version' => __( 'One of the items on cart has changed. Please review and try again.', 'surecart' ),
101 'out_of_stock' => __( 'One of the items on cart is out of stock. Please review and try again.', 'surecart' ),
102 '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' ),
103 );
104
105 $line_item_translated_error = $line_item_translations[ $options['purchasable_statuses'][0] ?? '' ] ?? false;
106
107 if ( $line_item_translated_error ) {
108 return $line_item_translated_error;
109 }
110 }
111
112 // Unique name translation.
113 if ( 'name' === $attribute && 'taken' === $type ) {
114 return sprintf(
115 // translators: %s is the name.
116 __( 'The name "%s" is already taken. Please choose a different name.', 'surecart' ),
117 $options['value'],
118 );
119 }
120
121 return false;
122 }
123
124 /**
125 * Translate just the type field
126 *
127 * @param string $type Type sting.
128 * @return string|false
129 */
130 public function typeTranslation( $type = '' ) {
131 if ( ! $type ) {
132 return false;
133 }
134
135 // we have no attribute.
136 $type_translations = include 'Translations/types.php';
137
138 if ( ! empty( $type_translations[ $type ] ) ) {
139 return $type_translations[ $type ];
140 }
141
142 return false;
143 }
144
145 /**
146 * Translate a specific error response
147 *
148 * @param array $response Error response.
149 * @return \WP_Error
150 */
151 public function translateErrorMessage( $response, $fallback = null ) {
152 // translate specific error code.
153 $translated = $this->codeTranslation( $response['code'] ?? '' );
154 if ( $translated ) {
155 return apply_filters( 'surecart/translated_error', $translated, $response );
156 }
157
158 // translate attribute.
159 $translated = $this->attributeTranslation( $response['attribute'] ?? '', $response['type'] ?? '', $response['options'] ?? [] );
160 if ( $translated ) {
161 return apply_filters( 'surecart/translated_error', $translated, $response );
162 }
163
164 // translate type.
165 $translated = $this->typeTranslation( $response['type'] ?? '' );
166 if ( $translated ) {
167 return apply_filters( 'surecart/translated_error', $translated, $response );
168 }
169
170 // fallback.
171 return $fallback ?? __( 'Error.', 'surecart' );
172 }
173
174 /**
175 * Translate Errors
176 *
177 * @param array $response Response from platform.
178 * @param integer $code Status code.
179 *
180 * @return \WP_Error
181 */
182 public function translate( $response = null, $code = null ) {
183 // fallback.
184 if ( empty( $response['message'] ) ) {
185 error_log( print_r( $response, 1 ) );
186 return new \WP_Error( 'error', __( 'Error.', 'surecart' ) );
187 }
188
189 $formatted = new \WP_Error(
190 $response['code'] ?? '',
191 $this->translateErrorMessage( $response, $response['message'] ?? '' ),
192 [
193 'status' => $code,
194 'type' => $response['type'] ?? '',
195 'http_status' => $response['http_status'] ?? '',
196 ]
197 );
198
199 if ( ! empty( $response['validation_errors'] ) ) {
200 foreach ( $response['validation_errors'] as $error ) {
201 $formatted->add(
202 $error['code'] ?? 'invalid',
203 $this->translateErrorMessage( $error, $error['message'] ),
204 [
205 'attribute' => $error['attribute'] ?? '',
206 'type' => $error['type'] ?? '',
207 'options' => $error['options'] ?? [],
208 ]
209 );
210 }
211 }
212
213 return apply_filters( 'surecart/translated_errors', $formatted );
214 }
215 }
216