false, 'mapping' => $mapping ] );
} else {
return array_merge( $language, [
'can_be_translated_automatically' => true,
'mapping' => new LanguageMapping(
Obj::prop( 'code', $language ),
Obj::prop( 'english_name', $language ),
Obj::path( [ 'target_language', 'id' ], $newlyCreatedMapping ),
Obj::path( [ 'target_language', 'code' ], $newlyCreatedMapping )
)
] );
}
}, $active_languages );
} else {
$active_languages = LanguageMappings::withCanBeTranslatedAutomatically( LanguageMappings::withMapping( $active_languages ) );
}
}
foreach ( $active_languages as $lang ) {
$code = Obj::prop( 'code', $lang );
// Most of predefined languages can be mapped out of the box, even without defining mapping explicitly.
// For instance, we know that French should be mapped to French in ATE and so on.
// Here I perform this check for languages which do not have explicitly defined mapping
if ( ! Obj::prop( 'mapping', $lang ) ) {
foreach ( self::getLanguagesAvailableInATE() as $ateLanguage ) {
if ( $code === Obj::prop( 'iso', $ateLanguage ) ) {
$lang['mapping'] = new LanguageMapping(
$code,
Obj::prop( 'display_name', $lang ),
Obj::prop( 'id', $ateLanguage ),
Obj::prop( 'iso', $ateLanguage )
);
break;
}
}
}
$result[ $code ] = $lang;
$result[ $code ]['flag'] = Obj::prop( 'flag_url', $lang );
$result[ $code ]['from_template'] = Obj::prop( 'flag_from_template', $lang );
foreach ( $active_languages as $lang_translation ) {
$result[ $code ]['translation'][ Obj::prop( 'id', $lang_translation ) ] = $sitepress->get_display_language_name( $code, Obj::prop( 'code', $lang_translation ) );
}
}
self::$active_languages = $result;
return $result;
}
function update_main_table( $id, $code, $default_locale, $encode_url, $tag ) {
global $wpdb;
$wpdb->update(
$wpdb->prefix . 'icl_languages',
[
'code' => $code,
'default_locale' => $default_locale,
'encode_url' => $encode_url,
'tag' => $tag,
],
[ 'ID' => $id ]
);
}
function insert_translation( $name, $language_code, $display_language_code ) {
return Languages::setLanguageTranslation( $language_code, $display_language_code, $name );
}
function update_translation( $name, $language_code, $display_language_code ) {
global $wpdb;
$update_sql = "UPDATE {$wpdb->prefix}icl_languages_translations SET name=%s WHERE language_code = %s AND display_language_code = %s";
$update_prepared = $wpdb->prepare( $update_sql, [ $name, $language_code, $display_language_code ] );
$wpdb->query( $update_prepared );
}
function insert_flag( $lang_code, $flag, $from_template ) {
global $wpdb;
$insert_sql = "INSERT INTO {$wpdb->prefix}icl_flags (lang_code, flag, from_template) VALUES(%s, %s, %s)";
$insert_prepared = $wpdb->prepare( $insert_sql, [ $lang_code, $flag, $from_template ] );
return $wpdb->query( $insert_prepared );
}
function update_flag( $lang_code, $flag, $from_template ) {
global $wpdb;
$insert_and_update_sql = "INSERT INTO {$wpdb->prefix}icl_flags (lang_code, flag, from_template) VALUES(%s, %s, %s) ON DUPLICATE KEY UPDATE flag= %s,from_template=%s";
$update_prepared = $wpdb->prepare( $insert_and_update_sql, [ $lang_code, $flag, $from_template, $flag, $from_template ] );
$wpdb->query( $update_prepared );
}
function update() {
$this->mode = 'save';
// Basic check.
if ( ! isset( $_POST['icl_edit_languages'] ) || ! is_array( $_POST['icl_edit_languages'] ) ) {
$this->set_errors( __( 'Please, enter valid data.', 'sitepress' ) );
return;
}
global $sitepress, $wpdb;
// First check if add and validate it.
if ( isset( $_POST['icl_edit_languages']['add'] ) && $_POST['icl_edit_languages_ignore_add'] == 'false' ) {
if ( $this->validate_one( 'add', $_POST['icl_edit_languages']['add'] ) ) {
$this->insert_one( $this->sanitize( $_POST['icl_edit_languages']['add'] ) );
}
// Reset flag upload field.
$_POST['icl_edit_languages']['add']['flag_upload'] = 'false';
}
foreach ( $_POST['icl_edit_languages'] as $id => $data ) {
// Ignore insert.
if ( $id == 'add' ) {
continue;
}
// Validate and sanitize data.
if ( ! $this->validate_one( $id, $data ) ) {
continue;
}
$data = stripslashes_deep( $data );
// Update main table.
$this->update_main_table( $id, $data['code'], $data['default_locale'], $data['encode_url'], $data['tag'] );
if (
$wpdb->get_var(
$wpdb->prepare( "SELECT code FROM {$wpdb->prefix}icl_locale_map WHERE code = %s", $data['code'] )
)
) {
$wpdb->update( $wpdb->prefix . 'icl_locale_map', [ 'locale' => $data['default_locale'] ], [ 'code' => $data['code'] ] );
} else {
$wpdb->insert(
$wpdb->prefix . 'icl_locale_map',
[
'code' => $data['code'],
'locale' => $data['default_locale'],
]
);
}
// Update translations table.
foreach ( $data['translations'] as $translation_code => $translation_value ) {
// If new (add language) translations are submitted.
if ( $translation_code == 'add' ) {
if ( ( $this->is_new_data_and_invalid() ) || $_POST['icl_edit_languages_ignore_add'] == 'true' ) {
continue;
}
if ( empty( $translation_value ) ) {
$translation_value = $data['english_name'];
}
$translation_code = isset( $_POST['icl_edit_languages']['add']['code'] )
? Sanitize::string( $_POST['icl_edit_languages']['add']['code'] ) : false;
}
// Check if update.
if ( $wpdb->get_var(
$wpdb->prepare(
"SELECT id FROM {$wpdb->prefix}icl_languages_translations WHERE language_code = %s AND display_language_code=%s",
$data['code'],
$translation_code
)
)
) {
$this->update_translation( $translation_value, $data['code'], $translation_code );
} else {
if ( ! $this->insert_translation( $translation_value, $data['code'], $translation_code ) ) {
$this->set_errors( sprintf( __( 'Error adding translation %1$s for %2$s.', 'sitepress' ), $data['code'], $translation_code ) );
}
}
}
// Handle flag.
$from_template = $this->handle_flag_post_data( $data, $id );
// Update flag table.
$this->update_flag( $data['code'], $data['flag'], $from_template );
// Reset flag upload field.
$_POST['icl_edit_languages'][ $id ]['flag_upload'] = 'false';
}
$this->saveLanguageMapping( $_POST['icl_edit_languages'] );
// Capture PostHog event for language form submission.
$this->capture_language_form_posthog_event( $_POST['icl_edit_languages'], $_POST['icl_edit_languages_initial'] ?? [] );
// Refresh cache.
$sitepress->get_language_name_cache()->clear();
$sitepress->clear_flags_cache();
delete_option( '_icl_cache' );
do_action( 'wpml_update_active_languages' );
// Unset ADD fields.
if ( $this->is_new_data_and_valid() ) {
unset( $_POST['icl_edit_languages']['add'] );
}
$this->update_language_packs( $sitepress );
}
/**
* @param array> $data
* @param int|string $id
*
* @return int
*/
private function handle_flag_post_data( array &$data, $id ) {
$from_template = 0;
if ( $this->is_flag_uploading_process( $data, $id ) ) {
if ( $filename = $this->upload_flag( $id ) ) {
$data['flag'] = $filename;
$from_template = 1;
} else {
$data['flag'] = $data['code'] . '.svg';
$this->set_errors( __( 'Error uploading flag file.', 'sitepress' ) );
}
$this->wpml_flags->clear();
} elseif ( empty( $data['flag'] ) || \WPML\FP\Relation::propEq( 'flag_upload', 'false', $data ) ) {
if( $this->isBuildInLang($data['code']) ) {
$data['flag'] = $data['code'] . '.svg';
} elseif (!empty($data['flag'])) {
$data['flag'] = basename($data['flag']);
} else {
$data['flag'] = '';
}
} else {
// This is needed for the case that some other language is updated. In that case this will
// part will for any custom flag and flag becomes the complete url.
if (!empty($data['flag'])) {
$data['flag'] = basename( $data['flag'] );
}
$from_template = 1;
}
return $from_template;
}
private function isBuildInLang( $langCode ) {
$builtInLanguageCodes = Obj::values( \icl_get_languages_codes() );
return Lst::includes( $langCode, $builtInLanguageCodes );
}
/**
* @param array> $data
* @param int|string $id
*
* @return bool
*/
private function is_flag_uploading_process( array &$data, $id ) {
return array_key_exists( 'flag_upload', $data ) && 'true' == $data['flag_upload'] && ! empty( $_FILES['icl_edit_languages']['name'][ $id ]['flag_file'] );
}
function insert_one( $data ) {
global $sitepress, $wpdb;
$data = stripslashes_deep( stripslashes_deep( $data ) );
// Insert main table.
$new_language_id = Languages::add( $data['code'], $data['english_name'], $data['default_locale'], 0, 1, $data['encode_url'], $data['tag'] );
if ( !$new_language_id ) {
$this->set_errors( __( 'Adding language failed.', 'sitepress' ) );
return false;
}
// Store the inserted language ID for PostHog event tracking.
$this->last_inserted_language_id = $new_language_id;
// add locale map
$locale_exists = $wpdb->get_var(
$wpdb->prepare(
"SELECT code
FROM {$wpdb->prefix}icl_locale_map
WHERE code=%s",
$data['code']
)
);
if ( $locale_exists ) {
$wpdb->update( $wpdb->prefix . 'icl_locale_map', [ 'locale' => $data['default_locale'] ], [ 'code' => $data['code'] ] );
} else {
$wpdb->insert(
$wpdb->prefix . 'icl_locale_map',
[
'code' => $data['code'],
'locale' => $data['default_locale'],
]
);
}
// Insert translations.
$all_languages = $sitepress->get_languages();
foreach ( $all_languages as $key => $lang ) {
// If submitted.
if ( array_key_exists( $lang['code'], $data['translations'] ) ) {
if ( empty( $data['translations'][ $lang['code'] ] ) ) {
$data['translations'][ $lang['code'] ] = $data['english_name'];
}
if ( ! $this->insert_translation(
$data['translations'][ $lang['code'] ],
$data['code'],
$lang['code']
)
) {
$this->set_errors(
sprintf(
__( 'Error adding translation %1$s for %2$s.', 'sitepress' ),
$data['code'],
$lang['code']
)
);
}
} else {
if ( ! $this->insert_translation( $data['english_name'], $data['code'], $lang['code'] ) ) {
$this->set_errors(
sprintf(
__( 'Error adding translation %1$s for %2$s.', 'sitepress' ),
$data['code'],
$lang['code']
)
);
}
}
}
// Insert native name.
if ( ! isset( $data['translations']['add'] ) || empty( $data['translations']['add'] ) ) {
$data['translations']['add'] = $data['english_name'];
}
if ( ! $this->insert_translation( $data['translations']['add'], $data['code'], $data['code'] ) ) {
$this->set_errors( __( 'Error adding native name.', 'sitepress' ) );
}
// Handle flag.
$from_template = $this->handle_flag_post_data( $data, 'add' );
// Insert flag table.
if ( ! $this->insert_flag( $data['code'], $data['flag'], $from_template ) ) {
$this->set_errors( __( 'Error adding flag.', 'sitepress' ) );
}
SitePress_Setup::insert_default_category( $data['code'] );
}
function validate_one( $id, $data ) {
global $wpdb;
$new_record = 'add' === $id;
$unique_columns = [
'code' => esc_html__( 'The Language code already exists.', 'sitepress' ),
'english_name' => esc_html__( 'The Language name already exists.', 'sitepress' ),
'default_locale' => esc_html__( 'The default locale already exists.', 'sitepress' ),
'tag' => esc_html__( 'The hreflang already exists.', 'sitepress' ),
];
foreach ( $unique_columns as $column => $message ) {
$exists_args = [ $data[ $column ] ];
$exists_query = 'SELECT ' . esc_sql( $column ) . ' FROM ' . $wpdb->prefix . 'icl_languages WHERE ' . esc_sql( $column ) . '=%s ';
if ( ! $new_record ) {
$exists_query .= 'AND id!=%d ';
$exists_args[] = $id;
}
$exists_query .= 'LIMIT 1';
$exists = $wpdb->get_var( $wpdb->prepare( $exists_query, $exists_args ) );
if ( $exists ) {
$this->error = $message;
$this->set_validation_failed( $id );
return false;
}
}
foreach ( $this->required_fields as $name => $type ) {
if ( 'flag' === $name ) {
if ( isset( $data['flag_upload'] ) && 'true' === $data['flag_upload'] ) {
$check = $_FILES['icl_edit_languages']['name'][ $id ]['flag_file'];
if ( empty( $check ) ) {
continue;
}
if ( ! $this->check_extension( $check ) ) {
if ( 'add' === $id ) {
$this->set_validation_failed( $id );
}
return false;
}
}
continue;
}
if ( 'code' === $name ) {
if ( ! $this->is_language_code_valid( $data[ $name ] ) ) {
$this->set_errors( __( 'Invalid character in language code.', 'sitepress' ) );
$this->set_validation_failed( $id );
return false;
}
continue;
}
if ( ! isset( $_POST['icl_edit_languages'][ $id ][ $name ] ) || empty( $_POST['icl_edit_languages'][ $id ][ $name ] ) ) {
if ( 'true' === $_POST['icl_edit_languages_ignore_add'] ) {
return false;
}
$this->set_errors( __( 'Please, enter required data.', 'sitepress' ) );
if ( 'add' === $id ) {
$this->set_validation_failed( $id );
}
return false;
}
if ( 'array' === $type && ! is_array( $_POST['icl_edit_languages'][ $id ][ $name ] ) ) {
if ( 'add' === $id ) {
$this->set_validation_failed( $id );
}
$this->set_errors( __( 'Please, enter valid data.', 'sitepress' ) );
return false;
}
}
return true;
}
/**
* Checks that language code is valid.
*
* @param string $language_code Unvalidated language code from input.
*
* @return bool
*/
private function is_language_code_valid( $language_code ) {
$pattern = '/^[a-zA-Z0-9\-\_]+$/';
return (bool) preg_match( $pattern, $language_code );
}
/**
* @return bool
*/
private function is_delete_language_action() {
return isset( $_GET['action'] ) && 'delete-language' === $_GET['action'] && wp_create_nonce( 'delete-language' . (int) $_GET['id'] ) == $_GET['icl_nonce'];
}
/**
* @return bool
*/
private function must_display_new_language_translation_column() {
return $this->is_edit_mode() || $this->is_new_data_and_valid();
}
/**
* @return bool
*/
private function is_new_data_and_invalid() {
return $this->validation_action && $this->validation_failed && 'add' === $this->validation_action;
}
/**
* @return bool
*/
private function is_new_data_and_valid() {
return $this->validation_action && ! $this->validation_failed && 'add' === $this->validation_action;
}
/**
* @return bool
*/
private function is_edit_mode() {
return 'edit' === $this->mode;
}
private function set_validation_failed( $id ) {
$this->validation_action = ( 'add' === $id ) ? 'add' : 'update';
$this->validation_failed = true;
}
function delete_language( $lang_id ) {
global $wpdb, $sitepress;
$lang = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}icl_languages WHERE id=%d", $lang_id ) );
if ( $lang ) {
if ( in_array( $lang->code, array_values( icl_get_languages_codes() ), true ) ) {
$error = __( "Error: This is a built in language. You can't delete it.", 'sitepress' );
} else {
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_languages WHERE id=%d", $lang_id ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_languages_translations WHERE language_code=%s", $lang->code ) );
$translation_ids = $wpdb->get_col( $wpdb->prepare( "SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE language_code=%s", $lang->code ) );
if ( $translation_ids ) {
$rids = $wpdb->get_col( "SELECT rid FROM {$wpdb->prefix}icl_translation_status WHERE translation_id IN (" . wpml_prepare_in( $translation_ids, '%d' ) . ')' );
if ( $rids ) {
$job_ids = $wpdb->get_col( "SELECT job_id FROM {$wpdb->prefix}icl_translate_job WHERE rid IN (" . wpml_prepare_in( $rids, '%d' ) . ')' );
if ( $job_ids ) {
$wpdb->query( "DELETE FROM {$wpdb->prefix}icl_translate WHERE job_id IN (" . wpml_prepare_in( $job_ids, '%d' ) . ')' );
}
}
}
// delete posts
$post_ids = $wpdb->get_col(
$wpdb->prepare(
"SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type LIKE %s AND language_code=%s",
[ wpml_like_escape( 'post_' ) . '%', $lang->code ]
)
);
remove_action( 'delete_post', [ $sitepress, 'delete_post_actions' ] );
foreach ( $post_ids as $post_id ) {
wp_delete_post( $post_id, true );
}
add_action( 'delete_post', [ $sitepress, 'delete_post_actions' ] );
// delete terms
remove_action( 'delete_term', [ $sitepress, 'delete_term' ], 1 );
$tax_ids = $wpdb->get_col(
$wpdb->prepare(
"SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type LIKE %s AND language_code=%s",
[ wpml_like_escape( 'tax_' ) . '%', $lang->code ]
)
);
foreach ( $tax_ids as $tax_id ) {
$row = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, taxonomy FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $tax_id ) );
if ( $row ) {
wp_delete_term( $row->term_id, $row->taxonomy );
}
}
add_action( 'delete_term', [ $sitepress, 'delete_term' ], 1, 3 );
// delete comments
global $IclCommentsTranslation;
remove_action( 'delete_comment', [ $IclCommentsTranslation, 'delete_comment_actions' ] );
foreach ( $post_ids as $post_id ) {
wp_delete_post( $post_id, true );
}
add_action( 'delete_comment', [ $IclCommentsTranslation, 'delete_comment_actions' ] );
do_action(
'wpml_translation_update',
[
'type' => 'before_language_delete',
'language' => $lang->code,
]
);
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_translations WHERE language_code=%s", $lang->code ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_strings WHERE language=%s", $lang->code ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_string_translations WHERE language=%s", $lang->code ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_locale_map WHERE code=%s", $lang->code ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}icl_flags WHERE lang_code=%s", $lang->code ) );
icl_cache_clear( false );
$sitepress->get_translations_cache()->clear();
$sitepress->clear_flags_cache();
$sitepress->get_language_name_cache()->clear();
$this->set_messages( sprintf( esc_html__( 'The language %s was deleted.', 'sitepress' ), '' . $lang->code . '' ) );
$this->update_language_packs( $sitepress );
}
} else {
$error = __( 'Error: Language not found.', 'sitepress' );
}
if ( ! empty( $error ) ) {
$this->set_errors( $error );
}
}
function sanitize( $data ) {
global $wpdb;
foreach ( $data as $key => $value ) {
if ( is_array( $value ) ) {
foreach ( $value as $k => $v ) {
$data[ $key ][ $k ] = esc_sql( $v );
}
}
$data[ $key ] = esc_sql( $value );
}
return $data;
}
function check_extension( $file ) {
$extension = substr( $file, strrpos( $file, '.' ) + 1 );
if ( ! in_array( strtolower( $extension ), [ 'png', 'gif', 'jpg', 'svg' ], true ) ) {
$this->set_errors( __( 'File extension not allowed.', 'sitepress' ) );
return false;
}
return true;
}
function get_errors() {
return $this->error;
}
function set_errors( $str = false ) {
$this->error .= $str . ' ';
}
function get_messages() {
return $this->message;
}
function set_messages( $str = false ) {
$this->message .= $str . ' ';
}
function upload_flag( $id ) {
$result = false;
$uploaded_file = false;
if ( isset( $_FILES['icl_edit_languages']['tmp_name'][ $id ]['flag_file'] ) ) {
$uploaded_file = filter_var(
$_FILES['icl_edit_languages']['tmp_name'][ $id ]['flag_file'],
FILTER_SANITIZE_FULL_SPECIAL_CHARS
);
}
if ( $uploaded_file ) {
$original_file = filter_var(
$_FILES['icl_edit_languages']['name'][ $id ]['flag_file'],
FILTER_SANITIZE_FULL_SPECIAL_CHARS
);
$target_path = $this->upload_dir . '/' . $original_file;
$wpml_wp_api = new WPML_WP_API();
add_filter( 'upload_mimes', \WPML\FP\Fns::always( self::ACCEPTED_MIME_TYPES ) );
$mime = $wpml_wp_api->get_file_mime_type( $uploaded_file, $original_file );
$allowed_mime_types = array_values( self::ACCEPTED_MIME_TYPES );
$validated = in_array( $mime, $allowed_mime_types, true );
if ( $validated && move_uploaded_file( $uploaded_file, $target_path ) ) {
if ((!defined('WPML_DO_NOT_RESIZE_UPLOADED_FLAGS') || !WPML_DO_NOT_RESIZE_UPLOADED_FLAGS) && function_exists( 'wp_get_image_editor' ) && 'image/svg+xml' !== $mime ) {
$image = wp_get_image_editor( $target_path );
if ( ! is_wp_error( $image ) ) {
$image->resize( 18, 12, true );
$image->save( $target_path );
}
}
$result = $original_file;
}
} else {
$error_message = __( 'There was an error uploading the file, please try again!', 'sitepress' );
if ( ! empty( $_FILES['icl_edit_languages']['error'][ $id ]['flag_file'] ) ) {
switch ( filter_var( $_FILES['icl_edit_languages']['error'][ $id ]['flag_file'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ) {
case UPLOAD_ERR_INI_SIZE;
$error_message = __( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'sitepress' );
break;
case UPLOAD_ERR_FORM_SIZE;
$error_message = sprintf( __( 'The uploaded file exceeds %s bytes.', 'sitepress' ), $this->max_file_size );
break;
case UPLOAD_ERR_PARTIAL;
$error_message = __( 'The uploaded file was only partially uploaded.', 'sitepress' );
break;
case UPLOAD_ERR_NO_FILE;
$error_message = __( 'No file was uploaded.', 'sitepress' );
break;
case UPLOAD_ERR_NO_TMP_DIR;
$error_message = __( 'Missing a temporary folder.', 'sitepress' );
break;
case UPLOAD_ERR_CANT_WRITE;
$error_message = __( 'Failed to write file to disk.', 'sitepress' );
break;
case UPLOAD_ERR_EXTENSION;
$error_message = __( 'A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help.', 'sitepress' );
break;
}
}
$this->set_errors( $error_message );
}
return $result;
}
function migrate() {
global $sitepress, $sitepress_settings;
if ( ! isset( $sitepress_settings['edit_languages_flag_migration'] ) ) {
foreach ( glob( get_stylesheet_directory() . '/flags/*' ) as $filename ) {
rename( $filename, $this->upload_dir . '/' . basename( $filename ) );
}
$sitepress->save_settings( [ 'edit_languages_flag_migration' => 1 ] );
}
}
/**
* @param \SitePress $sitepress
*/
private function update_language_packs( SitePress $sitepress ) {
if ( $this->update_language_packs_if_needed ) {
$wpml_localization = new WPML_Download_Localization( $sitepress->get_active_languages(), $sitepress->get_default_language() );
$wpml_localization->download_language_packs();
$wpml_languages_notices = new WPML_Languages_Notices( wpml_get_admin_notices() );
$wpml_languages_notices->missing_languages( $wpml_localization->get_not_founds() );
}
}
/**
* @param int $id
*
* @return string
*/
private function get_add_language_from_post_data( $id ) {
$value = isset( $_POST['icl_edit_languages'][ $id ]['translations']['add'] ) ? stripslashes_deep( $_POST['icl_edit_languages'][ $id ]['translations']['add'] ) : '';
$value = filter_var( $value, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
return $value;
}
/**
* @param array> $lang
* @param array $translation
*
* @return string
*/
private function get_translations_data( $lang, $translation ) {
if ( $lang['id'] == 'add' ) {
$value = isset( $_POST['icl_edit_languages']['add']['translations'][ $translation['code'] ] ) ? $_POST['icl_edit_languages']['add']['translations'][ $translation['code'] ] : '';
$value = filter_var( $value, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
} else {
$value = isset( $lang['translation'][ $translation['id'] ] ) ? $lang['translation'][ $translation['id'] ] : '';
}
$value = stripslashes_deep( $value );
return $value;
}
private function saveLanguageMapping( $languagesData ) {
if ( ! \WPML_TM_ATE_Status::is_enabled_and_activated() ) {
return;
}
// for a new language if nothing was chosen, select "Don't map"
$languagesData = Fns::map( function ( $data, $id ) {
if ( $id === 'add' && ! Obj::prop( 'mapping', $data ) ) {
$data['mapping'] = LanguageMappings::IGNORE_MAPPING_ID;
}
return $data;
}, $languagesData );
$mapping = Fns::map( function ( $data ) {
if ( $data['mapping'] == LanguageMappings::IGNORE_MAPPING_ID ) {
return new LanguageMapping( $data['code'], $data['english_name'], $data['mapping'], null );
} else {
list( $targetId, $targetCode ) = Str::split( '###', $data['mapping'] );
return new LanguageMapping( $data['code'], $data['english_name'], $targetId, $targetCode );
}
}, Fns::filter( Obj::prop( 'mapping' ), $languagesData ) );
$storeDataInTemporaryVariable = function ( $data ) {
self::$newlySavedMapping = $data;
};
$findErrors = Fns::filter( Logic::complement( Obj::pathOr( false, [ 'result', 'created' ] ) ) );
$getSourceNames = Fns::map( Obj::path( [ 'source_language', 'name' ] ) );
$displayErrorMsg = function ( $languageNames ) {
$this->set_errors( sprintf(
__( 'The language mapping could not be saved for languages: %s', 'sitepress-multilingual-cms' ),
/** @phpstan-ignore-next-line */
Lst::join( ', ', (array) $languageNames )
) );
};
$logError = pipe( $findErrors, $getSourceNames, $displayErrorMsg );
LanguageMappings::saveMapping( $mapping )->bimap( $logError, $storeDataInTemporaryVariable );
}
private function displayMappingField( $lang, $add ) {
?>
map your default language to a supported language.', 'sitepress-multilingual-cms' ),
'https://wpml.org/documentation/automatic-translation/using-automatic-translation-with-custom-languages/?utm_source=plugin&utm_medium=gui&utm_campaign=wpmlcore'
) ?>