PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 1.1.0
Translate and Go multilingual – Automatic AI translation – wpLingua v1.1.0
2.16.7 2.16.6 2.16.5 2.16.4 2.16.3 2.16.2 2.16.1 2.16.0 2.15.2 2.15.1 2.15.0 2.14.3 2.14.2 2.14.1 2.14.0 2.13.1 2.13.0 2.12.3 2.12.2 2.12.1 trunk 1.0.3 1.0.4 1.0.5 1.1.0 All 112 releases
wplingua / inc / admin / translation-meta.php

translation-meta.php in Translate and Go multilingual – Automatic AI translation – wpLingua 1.1.0, at inc/admin/translation-meta.php

401 lines 10.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // If this file is called directly, abort.
4 if ( ! defined( 'WPINC' ) ) {
5 die;
6 }
7
8
9 /**
10 * Add meta box on wpLingua translations
11 *
12 * @param object $post
13 * @return void
14 */
15 function wplng_translation_add_meta_box( $post ) {
16
17 add_meta_box(
18 'wplng_meta_box_translation',
19 __( 'Translation', 'wplingua' ),
20 'wplng_translation_meta_box_html_output',
21 'wplng_translation',
22 'normal',
23 'low'
24 );
25
26 }
27
28
29 /**
30 * Print HTML of wpLingua translations meta box
31 *
32 * @param object $post
33 * @return string HTML
34 */
35 function wplng_translation_meta_box_html_output( $post ) {
36
37 //used later for security
38 wp_nonce_field(
39 basename( __FILE__ ),
40 'wplng_translation_meta_box_nonce'
41 );
42
43 $meta = get_post_meta( $post->ID );
44
45 // Display original text
46 if ( ! empty( $meta['wplng_translation_original'][0] )
47 && is_string( $meta['wplng_translation_original'][0] )
48 && ! empty( $meta['wplng_translation_original_language_id'][0] )
49 && wplng_is_valid_language_id( $meta['wplng_translation_original_language_id'][0] )
50 ) {
51
52 $language_id = $meta['wplng_translation_original_language_id'][0];
53 $language = wplng_get_language_by_id( $language_id );
54 $alt = __( 'Flag for language: ', 'wplingua' ) . $language['name'];
55
56 $html = '<div id="wplng-original-language" wplng-lang="' . esc_attr( $language_id ) . '">';
57 $html .= '<label for="wplng_translation_source">';
58 $html .= '<img ';
59 $html .= 'src="' . esc_url( $language['flag'] ) . '" ';
60 $html .= 'alt="' . esc_attr( $alt ) . '" ';
61 $html .= 'class="wplng-flag">';
62 $html .= esc_html( $language['name'] );
63 $html .= esc_html__( ' - Original text:', 'wplingua' );
64 $html .= '</label>';
65 $html .= '<div class="wplng-source">';
66 $html .= esc_html( $meta['wplng_translation_original'][0] );
67 $html .= '</div>';
68 $html .= '</div>';
69
70 }
71
72 // Foreach translation, display form textarea to edit
73 if ( ! empty( $meta['wplng_translation_translations'][0] )
74 && is_string( $meta['wplng_translation_translations'][0] )
75 ) {
76
77 $translations_data = json_decode( $meta['wplng_translation_translations'][0], true );
78 $languages_target = wplng_get_languages_target_ids();
79 $translations = array();
80
81 if ( empty( $translations_data ) ) {
82 $translations_data = array();
83 }
84
85 foreach ( $languages_target as $language_target ) {
86
87 $is_in = false;
88
89 foreach ( $translations_data as $translation_data ) {
90
91 if ( empty( $translation_data['language_id'] )
92 || ! wplng_is_valid_language_id( $translation_data['language_id'] )
93 || empty( $translation_data['translation'] )
94 || ! is_string( $translation_data['translation'] )
95 || ( $translation_data['language_id'] !== $language_target )
96 ) {
97 continue;
98 }
99
100 $is_in = true;
101 $translations[] = $translation_data;
102
103 }
104
105 if ( ! $is_in ) {
106 $translations[] = array(
107 'language_id' => $language_target,
108 'translation' => '[WPLNG_EMPTY]',
109 'status' => 'ungenerated',
110 );
111 }
112 }
113
114 foreach ( $translations as $translation ) {
115
116 $language_id = $translation['language_id'];
117 $language = wplng_get_language_by_id( $language_id );
118 $textarea = $translation['translation'];
119 $name = 'wplng_translation_' . $language_id;
120 $container_id = 'wplng-translation-' . $language_id;
121 $generate_link = __( 'Regenerate translation', 'wplingua' );
122 $alt = __( 'Flag for language: ', 'wplingua' ) . $language['name'];
123
124 if ( '[WPLNG_EMPTY]' === $textarea ) {
125 $textarea = '';
126 }
127
128 $html .= '<div id="' . esc_attr( $container_id ) . '" class="wplng-edit-language">';
129 $html .= '<label for="' . esc_attr( $name ) . '">';
130 $html .= '<img ';
131 $html .= 'src="' . esc_url( $language['flag'] ) . '" ';
132 $html .= 'alt="' . esc_attr( $alt ) . '" ';
133 $html .= 'class="wplng-flag">';
134 $html .= esc_html( $language['name'] );
135 $html .= esc_html__( ' - Translation:', 'wplingua' );
136 $html .= '</label>';
137 $html .= '<textarea name="' . esc_attr( $name ) . '" ';
138 $html .= 'id="' . esc_attr( $name ) . '" ';
139 $html .= 'lang="' . esc_attr( $language_id ) . '" ';
140 $html .= 'spellcheck="false">';
141 $html .= esc_textarea( html_entity_decode( $textarea ) );
142 $html .= '</textarea>';
143
144 if ( empty( $translation['status'] ) ) {
145 $html .= '</div>';
146 continue;
147 }
148
149 $html .= '<div class="wplng-translation-footer">';
150 $html .= '<div class="wplng-translation-footer-left">';
151
152 switch ( $translation['status'] ) {
153 case 'ungenerated':
154 $generate_link = __( 'Generate translation', 'wplingua' );
155
156 $html .= '<span class="wplng-status">';
157 $html .= esc_html__( 'Status: Ungenerated', 'wplingua' );
158 $html .= '</span>';
159 break;
160
161 case 'generated':
162 $html .= '<span class="wplng-status">';
163 $html .= esc_html__( 'Status: Generated', 'wplingua' );
164 $html .= '</span>';
165 break;
166
167 default:
168 if ( is_int( $translation['status'] ) ) {
169
170 // Get and check date format
171 $date_format = get_option( 'date_format' );
172 if ( ! is_string( $date_format ) || empty( $date_format ) ) {
173 $date_format = 'F j, Y';
174 }
175
176 // Get and check time format
177 $time_format = get_option( 'time_format' );
178 if ( ! is_string( $time_format ) || empty( $time_format ) ) {
179 $time_format = 'g:i a';
180 }
181
182 $html .= '<span class="wplng-status">';
183 $html .= esc_html__( 'Status: Edited on ', 'wplingua' );
184 $html .= esc_html(
185 gmdate(
186 $date_format,
187 $translation['status']
188 )
189 );
190 $html .= ', ' . esc_html(
191 gmdate(
192 $time_format,
193 $translation['status']
194 )
195 );
196 $html .= '</span>';
197 }
198 break;
199 }
200 $html .= '</div>'; // End .wplng-translation-footer-right
201 $html .= '<div class="wplng-translation-footer-right">';
202
203 $html .= '<span ';
204 $html .= 'class="dashicons dashicons-update wplng-spin wplng-generate-spin" ';
205 $html .= 'style="display: none;"></span> ';
206
207 $html .= '<a ';
208 $html .= 'href="javascript:void(0);" ';
209 $html .= 'class="wplng-generate" ';
210 $html .= 'wplng-lang="' . esc_attr( $language_id ) . '">';
211 $html .= esc_html( $generate_link );
212 $html .= '</a>';
213
214 $html .= '</div>'; // End .wplng-translation-footer-right
215 $html .= '</div>'; // End .wplng-translation-footer
216 $html .= '</div>'; // End .wplng-edit-language
217
218 }
219 }
220
221 echo $html;
222 }
223
224
225 /**
226 * Save meta box data of wpLingua translations
227 *
228 * @param int $post_id
229 * @return void
230 */
231 function wplng_translation_save_meta_boxes_data( $post_id ) {
232
233 // Check if nonce is set
234 if ( ! isset( $_POST['wplng_translation_meta_box_nonce'] ) ) {
235 return;
236 }
237
238 // Sanitize the nonce
239 $nonce = $_POST['wplng_translation_meta_box_nonce'];
240 $nonce = sanitize_text_field( wp_unslash( $nonce ) );
241
242 // Check for nonce to top xss
243 if ( ! wp_verify_nonce( $nonce, basename( __FILE__ ) ) ) {
244 return;
245 }
246
247 // check for correct user capabilities - stop internal xss from customers
248 if ( ! current_user_can( 'edit_post', $post_id ) ) {
249 return;
250 }
251
252 wplng_clear_translations_cache();
253
254 $meta = get_post_meta( $post_id );
255
256 if ( empty( $meta['wplng_translation_translations'][0] ) ) {
257 return;
258 }
259
260 $languages_target = wplng_get_languages_target_ids();
261 $translations = json_decode(
262 $meta['wplng_translation_translations'][0],
263 true
264 );
265
266 if ( empty( $translations ) ) {
267 $translations = array();
268 }
269
270 foreach ( $languages_target as $language_target ) {
271
272 $is_in = false;
273
274 foreach ( $translations as $translation ) {
275
276 if ( empty( $translation['language_id'] )
277 || ! wplng_is_valid_language_id( $translation['language_id'] )
278 || ! isset( $translation['translation'] )
279 || ! is_string( $translation['translation'] )
280 || ( $translation['language_id'] !== $language_target )
281 ) {
282 continue;
283 }
284
285 $is_in = true;
286 break;
287 }
288
289 if ( ! $is_in ) {
290 $translations[] = array(
291 'language_id' => $language_target,
292 'translation' => '[WPLNG_EMPTY]',
293 'status' => 'ungenerated',
294 );
295 }
296 }
297
298 foreach ( $translations as $key => $translation ) {
299
300 if ( empty( $translation['language_id'] )
301 || ! wplng_is_valid_language_id( $translation['language_id'] )
302 ) {
303 continue;
304 }
305
306 $name = 'wplng_translation_' . $translation['language_id'];
307
308 if ( ! isset( $_REQUEST[ $name ] ) ) {
309 continue;
310 }
311
312 $temp = stripslashes( sanitize_textarea_field( $_REQUEST[ $name ] ) );
313
314 if ( empty( $temp ) ) {
315 $temp = '[WPLNG_EMPTY]';
316 } elseif ( $temp !== $translation['translation'] ) {
317 $temp = str_replace( '\\', '', $temp );
318
319 $translations[ $key ]['status'] = time();
320 }
321
322 $translations[ $key ]['translation'] = esc_html( $temp );
323 }
324
325 update_post_meta(
326 $post_id,
327 'wplng_translation_translations',
328 wp_json_encode(
329 $translations,
330 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
331 )
332 );
333
334 }
335
336
337 /**
338 * wpLingua AJAX function to get translations on CPT edit page
339 *
340 * @return void
341 */
342 function wplng_ajax_generate_translation() {
343
344 /**
345 * Check and sanitize data
346 */
347
348 // Check data
349
350 if ( empty( $_POST['language_source'] )
351 || ! is_string( $_POST['language_source'] )
352 || empty( $_POST['language_target'] )
353 || ! is_string( $_POST['language_target'] )
354 || ! isset( $_POST['text'] )
355 || ! is_string( $_POST['text'] )
356 ) {
357 wp_send_json_error( __( 'Invalid parameters', 'wplingua' ) );
358 return;
359 }
360
361 // Check and sanitize sources and target languages
362
363 $language_source = sanitize_key( $_POST['language_source'] );
364 $language_target = sanitize_key( $_POST['language_target'] );
365
366 if ( ! wplng_is_valid_language_id( $language_source )
367 || ! wplng_is_valid_language_id( $language_target )
368 || $language_source === $language_target
369 ) {
370 wp_send_json_error( __( 'Invalid languages parameters', 'wplingua' ) );
371 return;
372 }
373
374 // Check and sanitize text to translate
375
376 $text = sanitize_text_field( $_POST['text'] );
377 $text = esc_attr( $text );
378
379 if ( ! wplng_text_is_translatable( $text ) ) {
380 wp_send_json_success( $text );
381 return;
382 }
383
384 /**
385 * Call API and get translation
386 */
387
388 $response = wplng_api_call_translate(
389 array( $text ),
390 $language_source,
391 $language_target
392 );
393
394 if ( ! isset( $response[0] ) ) {
395 wp_send_json_error( __( 'Invalid API response', 'wplingua' ) );
396 return;
397 }
398
399 wp_send_json_success( $response[0] );
400 }
401