PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 1.0.4
Translate and Go multilingual – Automatic AI translation – wpLingua v1.0.4
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 / translation.php

translation.php in Translate and Go multilingual – Automatic AI translation – wpLingua 1.0.4, at inc/translation.php

470 lines 10.6 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 * Get translation data from original text
11 *
12 * @param string $original
13 * @return array Translation data
14 */
15 function wplng_get_translation_saved_from_original( $original ) {
16
17 $translation = false;
18
19 $args = array(
20 'post_type' => 'wplng_translation',
21 'meta_query' => array(
22 array(
23 'key' => 'wplng_translation_md5',
24 'value' => md5( $original ),
25 'compare' => '=',
26 ),
27 ),
28 );
29 $the_query = new WP_Query( $args );
30
31 // The Loop
32 while ( $the_query->have_posts() ) {
33
34 $the_query->the_post();
35
36 $meta = get_post_meta( get_the_ID() );
37
38 if ( ! isset( $meta['wplng_translation_original'][0] )
39 || ! is_string( $meta['wplng_translation_original'][0] )
40 ) {
41 continue;
42 }
43
44 if ( $meta['wplng_translation_original'][0] === $original ) {
45 $translation = get_post();
46 break;
47 }
48 }
49
50 wp_reset_postdata();
51
52 return $translation;
53 }
54
55
56 /**
57 * Get all saved translations from a wp_query for all languages
58 *
59 * @return array
60 */
61 function wplng_get_translations_from_query() {
62
63 $translations = array();
64 $args = array(
65 'post_type' => 'wplng_translation',
66 'posts_per_page' => -1,
67 'order' => 'ASC',
68 );
69
70 $the_query = new WP_Query( $args );
71
72 while ( $the_query->have_posts() ) {
73
74 $the_query->the_post();
75
76 $meta = get_post_meta( get_the_ID() );
77
78 if ( ! isset( $meta['wplng_translation_original'][0] )
79 || ! is_string( $meta['wplng_translation_original'][0] )
80 ) {
81 continue;
82 }
83
84 $translation = array(
85 'source' => $meta['wplng_translation_original'][0],
86 'post_id' => get_the_ID(),
87 'translations' => array(),
88 );
89
90 // Get translation for current language target
91 if ( empty( $meta['wplng_translation_translations'][0] ) ) {
92 continue;
93 }
94
95 $translations_meta = json_decode(
96 $meta['wplng_translation_translations'][0],
97 true
98 );
99
100 foreach ( $translations_meta as $translation_meta ) {
101 if ( ! empty( $translation_meta['language_id'] )
102 && wplng_is_valid_language_id( $translation_meta['language_id'] )
103 && isset( $translation_meta['translation'] )
104 && is_string( $translation_meta['translation'] )
105 && $translation_meta['translation'] !== '[WPLNG_EMPTY]'
106 ) {
107 $language_id = sanitize_key( $translation_meta['language_id'] );
108 $translated_text = sanitize_text_field( $translation_meta['translation'] );
109
110 $translation['translations'][ $language_id ] = $translated_text;
111 }
112 }
113
114 if ( empty( $translation['translations'] ) ) {
115 continue;
116 }
117
118 $translations[] = $translation;
119 }
120
121 wp_reset_postdata();
122
123 set_transient(
124 'wplng_cached_translations',
125 $translations
126 );
127
128 return $translations;
129 }
130
131
132 /**
133 * Get all saved translations for a target language
134 *
135 * @param string $target_language_id
136 * @return array
137 */
138 function wplng_get_translations_target( $target_language_id ) {
139
140 $translations_all_languages = get_transient( 'wplng_cached_translations' );
141
142 if ( empty( $translations_all_languages )
143 || ! is_array( $translations_all_languages )
144 ) {
145 $translations_all_languages = wplng_get_translations_from_query();
146 }
147
148 $translations_target = array();
149
150 foreach ( $translations_all_languages as $translation ) {
151 if ( empty( $translation['source'] )
152 || ! is_string( $translation['source'] )
153 || empty( $translation['post_id'] )
154 || empty( $translation['translations'][ $target_language_id ] )
155 || ! is_string( $translation['translations'][ $target_language_id ] )
156 ) {
157 continue;
158 }
159
160 $translation_text = sanitize_text_field(
161 $translation['translations'][ $target_language_id ]
162 );
163
164 $translations_target[] = array(
165 'source' => sanitize_text_field( $translation['source'] ),
166 'post_id' => $translation['post_id'],
167 'translation' => $translation_text,
168 );
169 }
170
171 return $translations_target;
172 }
173
174
175 /**
176 * Save a translation
177 *
178 * @param string $language_id
179 * @param string $original
180 * @param array $translation
181 * @return mixed Post ID or false
182 */
183 function wplng_save_translation_new( $language_id, $original, $translation ) {
184
185 $translation = str_replace( '\\', '', $translation );
186
187 /**
188 * Make the title
189 */
190 $tite_max_length = 100;
191 $title = substr( $original, 0, $tite_max_length );
192 if ( strlen( $original ) > $tite_max_length ) {
193 $title .= __( '...', 'wplingua' );
194 }
195
196 /**
197 * Create the post and get this ID
198 */
199 $new_post_id = wp_insert_post(
200 array(
201 'post_title' => esc_html( $title ),
202 'post_type' => 'wplng_translation',
203 'post_status' => 'publish',
204 'post_name' => sanitize_title(
205 'wplingua-translation-' . md5( $title ) . '-' . $title
206 ),
207 )
208 );
209
210 if ( is_wp_error( $new_post_id ) ) {
211 return false;
212 }
213
214 /**
215 * Make $translation_meta
216 */
217 $languages_target = wplng_get_languages_target_ids();
218 $translation_meta = array();
219
220 foreach ( $languages_target as $target_language ) {
221
222 if ( $target_language === $language_id ) {
223
224 $translation_meta[] = array(
225 'language_id' => $target_language,
226 'translation' => esc_html( $translation ),
227 'status' => 'generated',
228 );
229 } else {
230 $translation_meta[] = array(
231 'language_id' => $target_language,
232 'translation' => '[WPLNG_EMPTY]',
233 'status' => 'ungenerated',
234 );
235 }
236 }
237
238 add_post_meta(
239 $new_post_id,
240 'wplng_translation_original',
241 $original
242 );
243
244 add_post_meta(
245 $new_post_id,
246 'wplng_translation_md5',
247 md5( $original )
248 );
249
250 add_post_meta(
251 $new_post_id,
252 'wplng_translation_original_language_id',
253 wplng_get_language_website_id()
254 );
255
256 add_post_meta(
257 $new_post_id,
258 'wplng_translation_translations',
259 wp_json_encode(
260 $translation_meta,
261 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
262 )
263 );
264
265 return $new_post_id;
266 }
267
268
269 /**
270 * Update a translation
271 *
272 * @param object $post
273 * @param string $language_id
274 * @param array $translation
275 * @return int Post ID
276 */
277 function wplng_update_translation( $post, $language_id, $translation ) {
278
279 $translation = str_replace( '\\', '', $translation );
280 $meta = get_post_meta( $post->ID );
281 $languages_target = wplng_get_languages_target_ids();
282 $website_language = wplng_get_language_website_id();
283
284 $translation_meta = ( empty( $meta['wplng_translation_translations'][0] ) )
285 ? array() :
286 json_decode( $meta['wplng_translation_translations'][0], true );
287
288 $original_language_id_meta = ( empty( $meta['wplng_translation_original_language_id'][0] ) )
289 ? wplng_get_language_website_id()
290 : $meta['wplng_translation_original_language_id'][0];
291
292 // If translation found is not valid
293 if ( empty( $translation_meta )
294 || $website_language !== $original_language_id_meta
295 ) {
296
297 /**
298 * $original_language_id_meta must be the same as in option page
299 */
300 update_post_meta(
301 $post->ID,
302 'wplng_translation_original_language_id',
303 $website_language
304 );
305
306 /**
307 * Make $translation_meta
308 */
309 $translation_meta = array();
310 foreach ( $languages_target as $key => $target_language ) {
311
312 if ( $target_language === $language_id && $translation !== '[WPLNG_EMPTY]' ) {
313 $translation_meta[] = array(
314 'language_id' => $target_language,
315 'translation' => '[WPLNG_EMPTY]',
316 'status' => 'ungenerated',
317 );
318 } else {
319 $translation_meta[] = array(
320 'language_id' => $target_language,
321 'translation' => esc_html( $translation ),
322 'status' => 'generated',
323 );
324 }
325 }
326
327 update_post_meta(
328 $post->ID,
329 'wplng_translation_translations',
330 wp_json_encode(
331 $translation_meta,
332 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
333 )
334 );
335
336 } else { // Translation is valid
337
338 // Set or update new translation
339 $translation_already_in = false;
340
341 foreach ( $translation_meta as $key => $translation_e ) {
342 if ( $translation_e['language_id'] == $language_id ) {
343 $translation_already_in = true;
344 $translation_meta[ $key ] = array(
345 'language_id' => $language_id,
346 'translation' => esc_html( $translation ),
347 'status' => 'generated',
348 );
349 break;
350 }
351 }
352
353 if ( ! $translation_already_in ) {
354 $translation_meta[] = array(
355 'language_id' => $language_id,
356 'translation' => esc_html( $translation ),
357 'status' => 'generated',
358 );
359 }
360
361 update_post_meta(
362 $post->ID,
363 'wplng_translation_translations',
364 wp_json_encode(
365 $translation_meta,
366 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
367 )
368 );
369
370 }
371
372 return $post->ID;
373 }
374
375
376 /**
377 * Save a list of translations
378 *
379 * @param array $translations
380 * @param string $language_target_id
381 * @return array $translations with post IDs
382 */
383 function wplng_save_translations( $translations, $language_target_id ) {
384
385 if ( empty( $translations ) || ! is_array( $translations ) ) {
386 return array();
387 }
388
389 foreach ( $translations as $key => $translation ) {
390
391 if (
392 ! isset( $translation['source'] ) // Original text
393 || ! isset( $translation['translation'] ) // Translater text
394 ) {
395 continue;
396 }
397
398 $translations[ $key ]['post_id'] = wplng_save_translation(
399 $language_target_id,
400 $translation['source'],
401 $translation['translation'],
402 false
403 );
404 }
405
406 wplng_clear_translations_cache();
407
408 return $translations;
409 }
410
411
412 /**
413 * Save translation
414 *
415 * @param string $target_language_id
416 * @param string $original
417 * @param array $translation
418 * @return array $translation with post ID
419 */
420 function wplng_save_translation( $target_language_id, $original, $translation, $clear_cache = true ) {
421
422 $saved_translation = wplng_get_translation_saved_from_original( $original );
423
424 if ( empty( $saved_translation ) ) {
425 // Create new translation post
426 return wplng_save_translation_new(
427 $target_language_id,
428 $original,
429 $translation
430 );
431 } else {
432 // Update the translation post
433 return wplng_update_translation(
434 $saved_translation,
435 $target_language_id,
436 $translation
437 );
438 }
439
440 if ( $clear_cache ) {
441 wplng_clear_translations_cache();
442 }
443
444 }
445
446
447 /**
448 * Clear cached translations
449 *
450 * @return void
451 */
452 function wplng_clear_translations_cache() {
453 delete_transient( 'wplng_cached_translations' );
454 }
455
456
457 /**
458 * Clear cached translations if $post_id parametter is a translation
459 *
460 * @return void
461 */
462 function wplng_clear_translations_cache_trash_untrash( $post_id ) {
463
464 if ( 'wplng_translation' !== get_post_type( $post_id ) ) {
465 return;
466 }
467
468 wplng_clear_translations_cache();
469 }
470