'; echo wplng_translation_editor_get_html( $post ); echo ''; } /** * Return HTML of translations editor in modal * * @param WP_Post $post The post object. * @return string The HTML of the translations editor in the modal. */ function wplng_translation_editor_get_html( $post ) { // used later for security $html = wp_nonce_field( basename( __FILE__ ), 'wplng_translation_meta_box_nonce', true, false ); $meta = get_post_meta( $post->ID ); // Display original text and notice if necesary if ( ! empty( $meta['wplng_translation_original'][0] ) && is_string( $meta['wplng_translation_original'][0] ) && ! empty( $meta['wplng_translation_original_language_id'][0] ) && wplng_is_valid_language_id( $meta['wplng_translation_original_language_id'][0] ) ) { $language_id = $meta['wplng_translation_original_language_id'][0]; $language = wplng_get_language_by_id( $language_id ); $alt = __( 'Flag for language: ', 'wplingua' ) . $language['name']; $text_source = wplng_text_esc_displayed( $meta['wplng_translation_original'][0] ); $html_notice = ''; // Make the notice if ( wplng_str_contains( $text_source, '%wplng-search-query%' ) ) { $html_notice .= '%wplng-search-query%' ); $html_notice .= ''; } $html .= ' $language_target, 'translation' => '[WPLNG_EMPTY]', 'status' => 'ungenerated', ); } } foreach ( $translations as $translation ) { $language_id = $translation['language_id']; $language = wplng_get_language_by_id( $language_id ); $textarea = $translation['translation']; $name = 'wplng_translation_' . $language_id; $container_id = 'wplng-translation-' . $language_id; $generate_link = __( 'Regenerate translation', 'wplingua' ); $alt = __( 'Flag for language: ', 'wplingua' ) . $language['name']; $class = 'wplng-edit-language'; $reviewed_title = __( 'Mark as review', 'wplingua' ); $is_reviewed = false; if ( '[WPLNG_EMPTY]' === $textarea ) { $textarea = ''; } switch ( $translation['status'] ) { case 'ungenerated': $generate_link = __( 'Generate translation', 'wplingua' ); $class .= ' wplng-status-ungenerated'; break; case 'generated': $class .= ' wplng-status-generated'; break; default: if ( is_int( $translation['status'] ) ) { $class .= ' wplng-status-reviewed'; $is_reviewed = true; // Get and check date format $date_format = get_option( 'date_format' ); if ( ! is_string( $date_format ) || empty( $date_format ) ) { $date_format = 'F j, Y'; } // Get and check time format $time_format = get_option( 'time_format' ); if ( ! is_string( $time_format ) || empty( $time_format ) ) { $time_format = 'g:i a'; } $reviewed_title = __( 'Reviewed on ', 'wplingua' ); $reviewed_title .= esc_html( gmdate( $date_format, $translation['status'] ) ); $reviewed_title .= ', ' . esc_html( gmdate( $time_format, $translation['status'] ) ); } break; } $html .= ''; $html .= ' $language_target, 'translation' => '[WPLNG_EMPTY]', 'status' => 'ungenerated', ); } } foreach ( $translations as $key => $translation ) { if ( empty( $translation['language_id'] ) || ! wplng_is_valid_language_id( $translation['language_id'] ) ) { continue; } $name = 'wplng_translation_' . $translation['language_id']; $reviewed = 'wplng_mark_as_reviewed_' . $translation['language_id']; if ( ! isset( $_POST[ $name ] ) ) { continue; } $temp = wplng_text_esc( wp_unslash( $_POST[ $name ] ) ); if ( empty( $temp ) ) { $temp = '[WPLNG_EMPTY]'; $translations[ $key ]['status'] = 'ungenerated'; } else { if ( $temp !== $translation['translation'] ) { $temp = str_replace( '\\', '', $temp ); } if ( ! empty( $_POST[ $reviewed ] ) ) { if ( 'false' !== $_POST[ $reviewed ] ) { $translations[ $key ]['status'] = time(); } else { $translations[ $key ]['status'] = 'generated'; } } else { $translations[ $key ]['status'] = 'generated'; } } $translations[ $key ]['translation'] = $temp; } /** * Save meta: Translation array as JSON */ $meta_return = update_post_meta( $post_id, 'wplng_translation_translations', wp_json_encode( $translations, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) ); if ( false === $meta_return ) { // Try to save it with encoded emoji foreach ( $translations as $key => $translation ) { if ( empty( $translation['translation'] ) || '[WPLNG_EMPTY]' === $translation['translation'] ) { continue; } $translations[ $key ]['translation'] = wp_encode_emoji( $translation['translation'] ); } $meta_return = update_post_meta( $post_id, 'wplng_translation_translations', wp_json_encode( $translations, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) ); } return $meta_return; } /** * wpLingua AJAX function to get translations on CPT edit page * * @return void */ function wplng_ajax_generate_translation() { /** * Check and sanitize data */ // Check data if ( empty( $_POST['language_source'] ) || ! is_string( $_POST['language_source'] ) || empty( $_POST['language_target'] ) || ! is_string( $_POST['language_target'] ) || ! isset( $_POST['text'] ) || ! is_string( $_POST['text'] ) ) { wp_send_json_error( __( 'Invalid parameters', 'wplingua' ) ); return; } // Check and sanitize sources and target languages $language_source = sanitize_key( $_POST['language_source'] ); $language_target = sanitize_key( $_POST['language_target'] ); if ( ! wplng_is_valid_language_id( $language_source ) || ! wplng_is_valid_language_id( $language_target ) || $language_source === $language_target ) { wp_send_json_error( __( 'Invalid languages parameters', 'wplingua' ) ); return; } // Check and sanitize text to translate // (And convert img emoji to emoji) $text = wp_kses( wp_unslash( $_POST['text'] ), array( 'img' => array( 'alt' => array(), ), ) ); $text = preg_replace( '/\\"(.*)\\"/U', '$1', $text ); $text = wplng_text_esc( $text ); if ( ! wplng_text_is_translatable( $text ) ) { wp_send_json_success( $text ); return; } /** * Call API and get translation */ $response = wplng_api_call_translate( array( $text ), $language_source, $language_target ); if ( ! isset( $response[0] ) ) { wp_send_json_error( __( 'Invalid API response', 'wplingua' ) ); return; } wp_send_json_success( $response[0] ); }