PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.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 3 years ago ErrorsServiceProvider.php 3 years ago ErrorsTranslationService.php 2 years ago
ErrorsTranslationService.php
180 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 return sprintf( __( 'You must enter an amount between %1$s and %2$s', 'surecart' ), $options['min'] / 100, $options['max'] / 100 );
71 }
72
73 if ( 'line_items.quantity' === $attribute && 'greater_than_or_equal_to' === $type ) {
74 if ( $options['value'] < 1 ) {
75 return __( 'The product is out of stock. Please remove it from your cart.', 'surecart' );
76 }
77
78 return sprintf( __( 'You must enter a quantity greater than or equal to %s', 'surecart' ), $options['value'] );
79 }
80
81 if ( 'coupon' === $attribute && 'less_than_min_subtotal_amount' === $type ) {
82 return sprintf( __( 'You must spend at least %1$s to use this coupon.', 'surecart' ), Currency::format( $options['coupon_min_subtotal_amount'], $options['currency'] ?? 'usd' ) );
83 }
84
85 return false;
86 }
87
88 /**
89 * Translate just the type field
90 *
91 * @param string $type Type sting.
92 * @return string|false
93 */
94 public function typeTranslation( $type = '' ) {
95 if ( ! $type ) {
96 return false;
97 }
98
99 // we have no attribute.
100 $type_translations = include 'Translations/types.php';
101
102 if ( ! empty( $type_translations[ $type ] ) ) {
103 return $type_translations[ $type ];
104 }
105
106 return false;
107 }
108
109 /**
110 * Translate a specific error response
111 *
112 * @param array $response Error response.
113 * @return \WP_Error
114 */
115 public function translateErrorMessage( $response, $fallback = null ) {
116 // translate specific error code.
117 $translated = $this->codeTranslation( $response['code'] ?? '' );
118 if ( $translated ) {
119 return apply_filters( 'surecart/translated_error', $translated, $response );
120 }
121
122 // translate attribute.
123 $translated = $this->attributeTranslation( $response['attribute'] ?? '', $response['type'] ?? '', $response['options'] ?? [] );
124 if ( $translated ) {
125 return apply_filters( 'surecart/translated_error', $translated, $response );
126 }
127
128 // translate type.
129 $translated = $this->typeTranslation( $response['type'] ?? '' );
130 if ( $translated ) {
131 return apply_filters( 'surecart/translated_error', $translated, $response );
132 }
133
134 // fallback.
135 return $fallback ?? __( 'Error.', 'surecart' );
136 }
137
138 /**
139 * Translate Errors
140 *
141 * @param array $response Response from platform.
142 * @param integer $code Status code.
143 *
144 * @return \WP_Error
145 */
146 public function translate( $response = null, $code = null ) {
147 // fallback.
148 if ( empty( $response['message'] ) ) {
149 error_log( print_r( $response, 1 ) );
150 return new \WP_Error( 'error', __( 'Error.', 'surecart' ) );
151 }
152
153 $formatted = new \WP_Error(
154 $response['code'] ?? '',
155 $this->translateErrorMessage( $response, $response['message'] ?? '' ),
156 [
157 'status' => $code,
158 'type' => $response['type'] ?? '',
159 'http_status' => $response['http_status'] ?? '',
160 ]
161 );
162
163 if ( ! empty( $response['validation_errors'] ) ) {
164 foreach ( $response['validation_errors'] as $error ) {
165 $formatted->add(
166 $error['code'] ?? 'invalid',
167 $this->translateErrorMessage( $error, $error['message'] ),
168 [
169 'attribute' => $error['attribute'] ?? '',
170 'type' => $error['type'] ?? '',
171 'options' => $error['options'] ?? [],
172 ]
173 );
174 }
175 }
176
177 return apply_filters( 'surecart/translated_errors', $formatted );
178 }
179 }
180