PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.0-beta2
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.0-beta2
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 2 years ago ErrorsService.php 4 years ago ErrorsServiceProvider.php 4 years ago ErrorsTranslationService.php 2 years ago
ErrorsTranslationService.php
207 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 return false;
113 }
114
115 /**
116 * Translate just the type field
117 *
118 * @param string $type Type sting.
119 * @return string|false
120 */
121 public function typeTranslation( $type = '' ) {
122 if ( ! $type ) {
123 return false;
124 }
125
126 // we have no attribute.
127 $type_translations = include 'Translations/types.php';
128
129 if ( ! empty( $type_translations[ $type ] ) ) {
130 return $type_translations[ $type ];
131 }
132
133 return false;
134 }
135
136 /**
137 * Translate a specific error response
138 *
139 * @param array $response Error response.
140 * @return \WP_Error
141 */
142 public function translateErrorMessage( $response, $fallback = null ) {
143 // translate specific error code.
144 $translated = $this->codeTranslation( $response['code'] ?? '' );
145 if ( $translated ) {
146 return apply_filters( 'surecart/translated_error', $translated, $response );
147 }
148
149 // translate attribute.
150 $translated = $this->attributeTranslation( $response['attribute'] ?? '', $response['type'] ?? '', $response['options'] ?? [] );
151 if ( $translated ) {
152 return apply_filters( 'surecart/translated_error', $translated, $response );
153 }
154
155 // translate type.
156 $translated = $this->typeTranslation( $response['type'] ?? '' );
157 if ( $translated ) {
158 return apply_filters( 'surecart/translated_error', $translated, $response );
159 }
160
161 // fallback.
162 return $fallback ?? __( 'Error.', 'surecart' );
163 }
164
165 /**
166 * Translate Errors
167 *
168 * @param array $response Response from platform.
169 * @param integer $code Status code.
170 *
171 * @return \WP_Error
172 */
173 public function translate( $response = null, $code = null ) {
174 // fallback.
175 if ( empty( $response['message'] ) ) {
176 error_log( print_r( $response, 1 ) );
177 return new \WP_Error( 'error', __( 'Error.', 'surecart' ) );
178 }
179
180 $formatted = new \WP_Error(
181 $response['code'] ?? '',
182 $this->translateErrorMessage( $response, $response['message'] ?? '' ),
183 [
184 'status' => $code,
185 'type' => $response['type'] ?? '',
186 'http_status' => $response['http_status'] ?? '',
187 ]
188 );
189
190 if ( ! empty( $response['validation_errors'] ) ) {
191 foreach ( $response['validation_errors'] as $error ) {
192 $formatted->add(
193 $error['code'] ?? 'invalid',
194 $this->translateErrorMessage( $error, $error['message'] ),
195 [
196 'attribute' => $error['attribute'] ?? '',
197 'type' => $error['type'] ?? '',
198 'options' => $error['options'] ?? [],
199 ]
200 );
201 }
202 }
203
204 return apply_filters( 'surecart/translated_errors', $formatted );
205 }
206 }
207