';
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 .= '
$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] );
}