public function send_basket_commit()
 {
     $has_remote_translators = false;
     try {
         $response = false;
         $errors = array();
         if (TranslationProxy::is_batch_mode()) {
             $project = TranslationProxy::get_current_project();
             $translators = $_POST['translators'];
             $has_remote_translators = false;
             if (is_array($translators)) {
                 foreach ($translators as $translator) {
                     if (!TranslationProxy_Service::is_local_translator($translator)) {
                         $has_remote_translators = true;
                         break;
                     }
                 }
             } else {
                 $has_remote_translators = true;
             }
             if ($project && $has_remote_translators) {
                 $response = $project->commit_batch_job();
                 if (!empty($project->errors)) {
                     $response = false;
                 }
             } else {
                 //Local translation only: return true
                 $response = true;
             }
         }
         if ($response) {
             $is_error = false;
             TranslationProxy_Basket::delete_all_items_from_basket();
             $service_name = TranslationProxy::get_current_service_name();
             if (isset($has_remote_translators) && $has_remote_translators) {
                 $response->call_to_action = '<strong>' . sprintf(__('You have sent items to %s. Please check if additional steps are required on their end', 'wpml-translation-management'), $service_name) . '</strong>';
             }
         } else {
             $response = false;
             $is_error = true;
             if (isset($project) && $project) {
                 $errors = $project->errors;
             }
         }
     } catch (Exception $e) {
         $response = false;
         $is_error = true;
         $errors[] = $e->getMessage();
     }
     $result = array('result' => $response, 'is_error' => $is_error, 'errors' => $errors);
     if (!empty($errors)) {
         $this->rollback_basket_commit();
         wp_send_json_error($result);
     } else {
         wp_send_json_success($result);
     }
 }
 function send_strings_to_translation_service($string_ids, $target_language, $basket_name, $translator_id)
 {
     global $wpdb;
     // get all the untranslated strings
     $untranslated = array();
     foreach ($string_ids as $st_id) {
         $untranslated[] = $st_id;
     }
     if (sizeof($untranslated) > 0) {
         $project = TranslationProxy::get_current_project();
         $strings = array();
         $word_count = 0;
         $source_language = $this->get_strings_language();
         foreach ($untranslated as $string_id) {
             $string_data_query = "SELECT id, context, name, value FROM {$wpdb->prefix}icl_strings WHERE id=%d";
             $string_data_prepare = $wpdb->prepare($string_data_query, $string_id);
             $string_data = $wpdb->get_row($string_data_prepare);
             $word_count += $this->estimate_word_count($string_data->value, $source_language);
             $strings[] = $string_data;
         }
         $xliff = new WPML_TM_xliff();
         $file = $xliff->get_strings_xliff_file($strings, $source_language, $target_language);
         $title = "String Translations";
         $cms_id = '';
         $url = '';
         $timestamp = date('Y-m-d H:i:s');
         if (TranslationProxy::is_batch_mode()) {
             $res = $project->send_to_translation_batch_mode($file, $title, $cms_id, $url, $source_language, $target_language, $word_count);
         } else {
             $res = $project->send_to_translation($file, $title, $cms_id, $url, $source_language, $target_language, $word_count);
         }
         if ($res) {
             foreach ($strings as $string_data) {
                 $batch_id = TranslationProxy_Batch::update_translation_batch($basket_name);
                 $translation_service = TranslationProxy_Service::get_translator_data_from_wpml($translator_id);
                 $added = icl_add_string_translation($string_data->id, $target_language, null, ICL_TM_WAITING_FOR_TRANSLATOR, $translation_service['translator_id'], $translation_service['translation_service'], $batch_id);
                 if ($added) {
                     $data = array('rid' => $res, 'string_translation_id' => $added, 'timestamp' => $timestamp, 'md5' => md5($string_data->value));
                     $wpdb->insert($wpdb->prefix . 'icl_string_status', $data);
                     //insert rid
                 } else {
                     $this->add_message(sprintf(__('Unable to add "%s" string in tables', 'sitepress'), $string_data->name), 'error');
                     return 0;
                 }
             }
             $wpdb->insert($wpdb->prefix . 'icl_core_status', array('rid' => $res, 'module' => '', 'origin' => $source_language, 'target' => $target_language, 'status' => CMS_REQUEST_WAITING_FOR_PROJECT_CREATION));
             if ($project->errors && count($project->errors)) {
                 $res['errors'] = $project->errors;
             }
             return $res;
         }
     }
     return 0;
 }
 /**
  * @param WP_Post|WPML_Package $post
  * @param                      $target_languages
  * @param int                  $translator_id
  * @param                      $job_id
  *
  * @return bool|int
  */
 function send_post($post, $target_languages, $translator_id, $job_id)
 {
     global $sitepress, $sitepress_settings, $wpdb, $iclTranslationManagement;
     $this->maybe_init_translation_management($iclTranslationManagement);
     if (is_numeric($post)) {
         $post = get_post($post);
     }
     if (!$post) {
         return false;
     }
     $post_id = $post->ID;
     $post_type = $post->post_type;
     $element_type_prefix = $iclTranslationManagement->get_element_type_prefix_from_job_id($job_id);
     $element_type = $element_type_prefix . '_' . $post_type;
     $err = false;
     $res = false;
     $source_language = $sitepress->get_language_for_element($post_id, $element_type);
     if (empty($target_languages)) {
         return false;
     }
     // Make sure the previous request is complete.
     // Only send if it needs update
     foreach ($target_languages as $target_language) {
         if ($target_language == $source_language) {
             continue;
         }
         $translation = $this->tmg->get_element_translation($post_id, $target_language, $element_type);
         if (!$translation) {
             // translated the first time
             $err = true;
         }
         if (!$err && ($translation->needs_update || $translation->status == ICL_TM_NOT_TRANSLATED || $translation->status == ICL_TM_WAITING_FOR_TRANSLATOR)) {
             $project = TranslationProxy::get_current_project();
             if ($post_type == 'page') {
                 $post_url = site_url() . '?page_id=' . $post_id;
             } else {
                 $post_url = site_url() . '?p=' . $post_id;
             }
             if ($iclTranslationManagement->is_external_type($element_type_prefix)) {
                 $post_url = apply_filters('wpml_external_item_url', $post_url, $post_id);
             }
             if ($sitepress->get_setting('tm_block_retranslating_terms')) {
                 WPML_Translation_Job_Terms::set_translated_term_values($job_id, true);
             }
             $xliff = new WPML_TM_xliff();
             $file = $xliff->get_job_xliff_file($job_id);
             $title = $post->post_title;
             $cms_id = $this->build_cms_id($post_id, $post_type, $source_language, $target_language, $job_id);
             $url = $post_url;
             $word_count = self::estimate_total_word_count($post, $source_language);
             $note = isset($note) ? $note : '';
             $is_update = intval(!empty($translation->element_id));
             try {
                 if (TranslationProxy::is_batch_mode()) {
                     $res = $project->send_to_translation_batch_mode($file, $title, $cms_id, $url, $source_language, $target_language, $word_count, $translator_id, $note, $is_update);
                 } else {
                     $res = $project->send_to_translation($file, $title, $cms_id, $url, $source_language, $target_language, $word_count, $translator_id, $note, $is_update);
                 }
             } catch (Exception $err) {
                 // The translation entry will be removed
                 $res = 0;
             }
             if ($res) {
                 $this->tmg->update_translation_status(array('translation_id' => $translation->translation_id, 'status' => ICL_TM_IN_PROGRESS, 'needs_update' => 0));
             } else {
                 $this->enqueue_project_errors($project);
                 $previous_state = $wpdb->get_var($wpdb->prepare("SELECT _prevstate FROM {$wpdb->prefix}icl_translation_status WHERE translation_id=%d", $translation->translation_id));
                 if (!empty($previous_state)) {
                     $previous_state = unserialize($previous_state);
                     $data = array('status' => $previous_state['status'], 'translator_id' => $previous_state['translator_id'], 'needs_update' => $previous_state['needs_update'], 'md5' => $previous_state['md5'], 'translation_service' => $previous_state['translation_service'], 'translation_package' => $previous_state['translation_package'], 'timestamp' => $previous_state['timestamp'], 'links_fixed' => $previous_state['links_fixed']);
                     $data_where = array('translation_id' => $translation->translation_id);
                     $wpdb->update($wpdb->prefix . 'icl_translation_status', $data, $data_where);
                 } else {
                     $data = array('status' => ICL_TM_NOT_TRANSLATED, 'needs_update' => 0);
                     $data_where = array('translation_id' => $translation->translation_id);
                     $wpdb->update($wpdb->prefix . 'icl_translation_status', $data, $data_where);
                 }
                 $err = true;
             }
         }
         // if needs translation
     }
     // foreach target lang
     return $err ? false : $res;
     //last $ret
 }
 /**
  * @param WP_Post|WPML_Package $post
  * @param                      $target_languages
  * @param int                  $translator_id
  * @param                      $job_id
  *
  * @return bool|int
  */
 function send_post($post, $target_languages, $translator_id, $job_id)
 {
     global $sitepress, $iclTranslationManagement;
     $this->maybe_init_translation_management($iclTranslationManagement);
     if (is_numeric($post)) {
         $post = get_post($post);
     }
     if (!$post) {
         return false;
     }
     $post_id = $post->ID;
     $post_type = $post->post_type;
     $element_type_prefix = $iclTranslationManagement->get_element_type_prefix_from_job_id($job_id);
     $element_type = $element_type_prefix . '_' . $post_type;
     $err = false;
     $res = false;
     $source_language = $sitepress->get_language_for_element($post_id, $element_type);
     $target_language = is_array($target_languages) ? end($target_languages) : $target_languages;
     if (empty($target_language) || $target_language === $source_language) {
         return false;
     }
     $translation = $this->tmg->get_element_translation($post_id, $target_language, $element_type);
     if (!$translation) {
         // translated the first time
         $err = true;
     }
     if (!$err && ($translation->needs_update || $translation->status == ICL_TM_NOT_TRANSLATED || $translation->status == ICL_TM_WAITING_FOR_TRANSLATOR)) {
         $tp_networking = wpml_tm_load_tp_networking();
         $project = $tp_networking->get_current_project();
         if ($iclTranslationManagement->is_external_type($element_type_prefix)) {
             $job_object = new WPML_External_Translation_Job($job_id);
         } else {
             $job_object = new WPML_Post_Translation_Job($job_id);
             $job_object->load_terms_from_post_into_job();
         }
         list($err, $project, $res) = $job_object->send_to_tp($project, TranslationProxy::is_batch_mode(), $translator_id, $this->cms_id_helper, $this->tmg);
         if ($err) {
             $this->enqueue_project_errors($project);
         }
     }
     return $err ? false : $res;
     //last $ret
 }