function icl_populate_translations_pickup_box() { if (!wpml_is_action_authenticated('icl_populate_translations_pickup_box')) { die('Wrong Nonce'); } global $sitepress; $last_picked_up = $sitepress->get_setting('last_picked_up'); $translation_offset = strtotime(current_time('mysql')) - @intval($last_picked_up) - 5 * 60; if (WP_DEBUG == false && $translation_offset < 0) { $time_left = floor(abs($translation_offset) / 60); if ($time_left == 0) { $time_left = abs($translation_offset); $wait_text = '<p><i>' . sprintf(__('You can check again in %s seconds.', 'sitepress'), '<span id="icl_sec_tic">' . $time_left . '</span>') . '</i></p>'; } else { $wait_text = sprintf(__('You can check again in %s minutes.', 'sitepress'), '<span id="icl_sec_tic">' . $time_left . '</span>') . '</i></p>'; } $result = array('wait_text' => $wait_text); } else { $project = TranslationProxy::get_current_project(); $cms_id_helper = new WPML_TM_CMS_ID(); $polling_status = new WPML_TP_Polling_Status($project, $sitepress, $cms_id_helper); $result = $polling_status->get_status_array(); } wp_send_json_success($result); }
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 icl_pickup_translations() { if (!wpml_is_action_authenticated('icl_pickup_translations')) { die('Wrong Nonce'); } global $ICL_Pro_Translation, $wpdb; $job_factory = wpml_tm_load_job_factory(); $wpml_tm_records = new WPML_TM_Records($wpdb); $cms_id_helper = new WPML_TM_CMS_ID($wpml_tm_records, $job_factory); $project = TranslationProxy::get_current_project(); $remote_sync_factory = new WPML_TP_Remote_Sync_Factory($project, $ICL_Pro_Translation, $cms_id_helper); $pickup = new WPML_TP_Polling_Pickup($ICL_Pro_Translation, $remote_sync_factory); wp_send_json_success($pickup->poll_job($_POST)); }
function translation_service_details($service, $show_project = false) { $service_details = ''; if (defined('OTG_SANDBOX_DEBUG') && OTG_SANDBOX_DEBUG) { $service_details .= '<h3>Service details:</h3>' . PHP_EOL; $service_details .= '<pre>' . PHP_EOL; $service_details .= print_r($service, true); $service_details .= '</pre>' . PHP_EOL; if ($show_project) { $project = TranslationProxy::get_current_project(); echo '<pre>$project' . PHP_EOL; echo print_r($project, true); echo '</pre>'; } } return $service_details; }
function refresh_language_pairs() { $project = TranslationProxy::get_current_project(); $nonce_is_valid = false; if (array_key_exists('nonce', $_POST)) { $nonce = $_POST['nonce']; $nonce_is_valid = wp_verify_nonce($nonce, 'wpml-tp-refresh-language-pairs'); } if ($nonce_is_valid) { try { $this->wpml_tp_api->refresh_language_pairs($project); wp_send_json_success(esc_attr__('Language pairs refreshed.', 'wpml-translation-management')); } catch (Exception $e) { wp_send_json_error($e); } } }
<?php define('ICL_LANGUAGE_NOT_SUPPORTED', 3); global $wpdb, $sitepress; $target = filter_input(INPUT_GET, 'target', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $auto_resize = filter_input(INPUT_GET, 'auto_resize', FILTER_VALIDATE_BOOLEAN | FILTER_NULL_ON_FAILURE); $unload_cb = filter_input(INPUT_GET, 'unload_cb', FILTER_SANITIZE_FULL_SPECIAL_CHARS | FILTER_NULL_ON_FAILURE); // Adding a translator if (preg_match('|^@select-translators;([^;]+);([^;]+)@|', $target, $matches)) { $source_language = $matches[1]; $target_language = $matches[2]; $project = TranslationProxy::get_current_project(); try { $lp_setting_index = 'language_pairs'; $language_pairs = $sitepress->get_setting($lp_setting_index, array()); if (!isset($language_pairs[$source_language][$target_language]) || $language_pairs[$source_language][$target_language] == 0) { $language_pairs[$source_language][$target_language] = 1; TranslationProxy_Translator::update_language_pairs($project, $language_pairs); $sitepress->set_setting($lp_setting_index, $language_pairs, true); } $target = $project->select_translator_iframe_url($source_language, $target_language); } catch (Exception $e) { if ($e->getCode() == ICL_LANGUAGE_NOT_SUPPORTED) { printf(__('<p>Requested languages are not supported by the translation service (%s). Please <a%s>contact us</a> for support. </p>', 'sitepress'), $e->getMessage(), ' target="_blank" href="http://wpml.org/?page_id=5255"'); } else { printf(__('<p>Could not add the requested languages. Please <a%s>contact us</a> for support. </p><p>Show <a%s>debug information</a>.</p>', 'sitepress'), ' target="_blank" href="http://wpml.org/?page_id=5255"', ' a href="admin.php?page=' . ICL_PLUGIN_FOLDER . '/menu/troubleshooting.php&icl_action=icl-connection-test' . '#icl-connection-test"'); } exit; } } $target .= strpos($target, '?') === false ? '?' : '&';
protected function get_translator_html($job) { $job = (object) $job; $current_service_name = TranslationProxy::get_current_service_name(); $translation_services = array('local', TranslationProxy::get_current_service_id()); $translator = ''; if ($job->translation_service && $job->translation_service !== 'local') { try { $project = TranslationProxy::get_current_project(); if ($project) { if ($project->service->has_translator_selection) { $translator_contact_iframe_url = $project->translator_contact_iframe_url($job->translator_id); $iframe_args = array('title' => __('Contact the translator', 'wpml-translation-management'), 'unload_cb' => 'icl_thickbox_refresh'); $translator .= TranslationProxy_Popup::get_link($translator_contact_iframe_url, $iframe_args); $translator .= esc_html($job->translator_name); $translator .= "</a> (" . $current_service_name . ")"; } else { $translator .= $current_service_name; } } else { $translator .= esc_html($job->translator_name); } } catch (Exception $e) { // Just doesn't create the output } } elseif ($job->status == ICL_TM_COMPLETE) { $translator_data = get_userdata($job->translator_id); $translator_name = $translator_data ? $translator_data->display_name : ""; $translator = '<span class="icl-finished-local-name">' . $translator_name . '</span>'; } else { $translator .= '<span class="icl_tj_select_translator">'; $selected_translator = isset($job->translator_id) ? $job->translator_id : false; $disabled = false; if ($job->translation_service && $job->translation_service !== 'local' && is_numeric($job->translation_service)) { $selected_translator = TranslationProxy_Service::get_wpml_translator_id($job->translation_service, $job->translator_id); $disabled = true; } $job_id = isset($job->job_id) ? $job->job_id : $job->id; $local_only = isset($job->local_only) ? $job->local_only : true; $args = array('id' => 'icl_tj_translator_for_' . $job_id, 'name' => 'icl_tj_translator_for_' . $job_id, 'from' => $job->source_language_code, 'to' => $job->language_code, 'selected' => $selected_translator, 'services' => $translation_services, 'disabled' => $disabled, 'echo' => false, 'local_only' => $local_only); $translator .= TranslationManagement::translators_dropdown($args); $translator .= '<input type="hidden" id="icl_tj_ov_' . $job_id . '" value="' . (int) $job->translator_id . '" />'; $translator .= '<input type="hidden" id="icl_tj_ty_' . $job_id . '" value="' . strtolower($this->get_type()) . '" />'; $translator .= '<span class="icl_tj_select_translator_controls" id="icl_tj_tc_' . $job_id . '">'; $translator .= '<input type="button" class="button-secondary icl_tj_ok" value="' . __('Send', 'wpml-translation-management') . '" /> '; $translator .= '<input type="button" class="button-secondary icl_tj_cancel" value="' . __('Cancel', 'wpml-translation-management') . '" />'; $translator .= '</span>'; } return $translator; }
static function sync_cancelled() { global $wpdb, $sitepress; $project = TranslationProxy::get_current_project(); $requests = $project->cancelled_jobs(); if ($requests === false) { echo wp_json_encode(array('errors' => 1, 'message' => 'Failed fetching jobs list from the server.')); exit; } $cms_ids = array(); if (!empty($requests)) { foreach ($requests as $request) { $cms_ids[] = $request->cms_id; } } // get jobs that are in progress $translations_sql = "\n SELECT t.element_id, t.element_type, t.language_code, t.source_language_code, t.trid,\n s.rid, s._prevstate, s.translation_id\n FROM {$wpdb->prefix}icl_translation_status s\n JOIN {$wpdb->prefix}icl_translations t\n ON t.translation_id = s.translation_id\n WHERE s.translation_service=%s\n AND s.status = %d\n "; $translations_prepared = $wpdb->prepare($translations_sql, array(TranslationProxy::get_current_service_id(), ICL_TM_IN_PROGRESS)); $translations = $wpdb->get_results($translations_prepared); $jobs2delete = array(); $translations2cancel = array(); foreach ($translations as $t) { $original_id_sql = "SELECT element_id FROM {$wpdb->prefix}icl_translations\n WHERE trid=%d AND source_language_code IS NULL"; $original_id_prepared = $wpdb->prepare($original_id_sql, $t->trid); $original_id = $wpdb->get_var($original_id_prepared); $cms_id = sprintf('%s_%d_%s_%s', preg_replace('#^post_#', '', $t->element_type), $original_id, $t->source_language_code, $t->language_code); if (in_array($cms_id, $cms_ids)) { $_lang_details = $sitepress->get_language_details($t->source_language_code); $lang_from = $_lang_details['english_name']; $_lang_details = $sitepress->get_language_details($t->language_code); $lang_to = $_lang_details['english_name']; $jobs2delete[] = '<a href="' . get_permalink($original_id) . '">' . get_the_title($original_id) . '</a>' . sprintf(' - from %s to %s', $lang_from, $lang_to); $translations2cancel[] = $t; } } $response_message = ''; if ($jobs2delete && $translations2cancel) { $response_message .= '<div class="error clear" style="padding-top:5px;font-size:11px;">'; $response_message .= __('About to cancel these jobs:', 'sitepress'); $response_message .= '<br />'; $response_message .= '<ul style="margin-left:10px;">'; $response_message .= '<li>'; $response_message .= join('</li><li>', $jobs2delete); $response_message .= '</li>'; $response_message .= '</ul>'; $response_message .= '<br />'; $response_message .= '<a id="icl_ts_cancel_ok" href="#" class="button-secondary">'; $response_message .= __('OK', 'sitepress'); $response_message .= '</a> '; $response_message .= '<a id="icl_ts_cancel_cancel" href="#" class="button-secondary">'; $response_message .= __('Cancel', 'sitepress'); $response_message .= '</a>'; $response_message .= '</div>'; $response_errors = 0; $response_data = array('t2c' => serialize($translations2cancel)); } elseif ($project->errors) { $response_message = join('<br/>', $project->errors); $response_errors = count($project->errors); $response_data = false; } else { $response_message = __('Nothing to cancel.', 'sitepress'); $response_errors = 0; $response_data = false; } $response = array('errors' => $response_errors, 'message' => $response_message, 'data' => $response_data); echo wp_json_encode($response); die; }
function process_translated_string($translation_proxy_job_id, $language) { $project = TranslationProxy::get_current_project(); $translation = $project->fetch_translation($translation_proxy_job_id); $translation = apply_filters('icl_data_from_pro_translation', $translation); $ret = false; $xliff = new WPML_TM_xliff(); $translation = $xliff->get_strings_xliff_translation($translation); if ($translation) { $ret = icl_translation_add_string_translation($translation_proxy_job_id, $translation, $language); if ($ret) { $project->update_job($translation_proxy_job_id); } } return $ret; }
function check_batch_status_ajax() { $batch_id = filter_input(INPUT_POST, 'batch_id', FILTER_SANITIZE_NUMBER_INT); $valid_nonce = wp_verify_nonce($_POST['nonce'], $_POST['action']); if ($valid_nonce && $batch_id > 0) { $project = TranslationProxy::get_current_project(); $project->check_status($batch_id); wp_send_json_success(array('error' => 0)); } else { wp_send_json_error(__('Invalid request', 'wpml-translation-management')); } }
function get_current_project() { return TranslationProxy::get_current_project(); }
public static function get_basket_extra_fields_array($force_refresh = false) { if ($force_refresh) { $networking = wpml_tm_load_tp_networking(); $project = TranslationProxy::get_current_project(); $extra_fields = $networking->get_extra_fields_remote($project); } else { $extra_fields = TranslationProxy::get_extra_fields_local(); } return TranslationProxy::maybe_convert_extra_fields($extra_fields); }
private function process_translated_string($translation_proxy_job_id, $language) { $project = TranslationProxy::get_current_project(); $translation = $project->fetch_translation($translation_proxy_job_id); $translation = apply_filters('icl_data_from_pro_translation', $translation); $ret = false; $translation = $this->xliff_reader_factory->string_xliff_reader()->get_data($translation); if ($translation) { $ret = icl_translation_add_string_translation($translation_proxy_job_id, $translation, $language); if ($ret) { $project->update_job($translation_proxy_job_id); } } return $ret; }
<?php global $wpdb; require WPML_TM_PATH . '/menu/basket-tab/wpml-basket-tab-ajax.class.php'; $basket_ajax = new WPML_Basket_Tab_Ajax(TranslationProxy::get_current_project(), wpml_tm_load_basket_networking(), new WPML_Translation_Basket($wpdb)); add_action('init', array($basket_ajax, 'init')); function icl_get_jobs_table() { require_once WPML_TM_PATH . '/menu/wpml-translation-jobs-table.class.php'; global $iclTranslationManagement; $nonce = filter_input(INPUT_POST, 'icl_get_jobs_table_data_nonce', FILTER_SANITIZE_FULL_SPECIAL_CHARS); if (!wp_verify_nonce($nonce, 'icl_get_jobs_table_data_nonce')) { die('Wrong Nonce'); } $table = new WPML_Translation_Jobs_Table($iclTranslationManagement); $data = $table->get_paginated_jobs(); wp_send_json_success($data); } function icl_get_job_original_field_content() { global $iclTranslationManagement; if (!wpml_is_action_authenticated('icl_get_job_original_field_content')) { die('Wrong Nonce'); } $job_id = filter_input(INPUT_POST, 'tm_editor_job_id', FILTER_SANITIZE_NUMBER_INT); $field = filter_input(INPUT_POST, 'tm_editor_job_field'); $data = array(); $job = $job_id !== null && $field !== null ? $job = $iclTranslationManagement->get_translation_job($job_id) : null; $elements = $job && isset($job->elements) ? $job->elements : array(); foreach ($elements as $element) { $sanitized_type = sanitize_title($element->field_type);
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; }
/** * Returns array of remote translators. Works only with ICL as a Translation Service * * @return array */ public static function translation_service_translators_list() { $translators = array(); if (!TranslationProxy::translator_selection_available()) { return $translators; } $project = TranslationProxy::get_current_project(); if (!$project) { return $translators; } $lang_status = TranslationProxy_Translator::get_language_pairs(); if (empty($lang_status)) { return $translators; } $action_link_args = array('title' => __('Contact translator', 'sitepress'), 'unload_cb' => 'icl_thickbox_refresh', 'ar' => 1); foreach ($lang_status as $language_pair) { $language_from = $language_pair['from']; $language_pair_translators = $language_pair['translators']; if ($language_pair_translators) { foreach ($language_pair_translators as $translator) { $translator_item = array(); if (isset($translators[$translator['id']])) { $translator_item = $translators[$translator['id']]; $translator_item['langs'][$language_from][] = $language_pair['to']; } else { $translator_item['name'] = $translator['nickname']; $translator_item['langs'][$language_from][] = $language_pair['to']; $translator_item['type'] = $project->service->name; $url = $project->translator_contact_iframe_url($translator['id']); $action_link = ''; if ($url) { $action_link = TranslationProxy_Popup::get_link($url, $action_link_args) . __('Contact translator', 'sitepress') . '</a>'; } $translator_item['action'] = $action_link; } $translators[$translator['id']] = $translator_item; } } } return $translators; }
function ajax_calls($call, $data) { global $wpdb, $sitepress; switch ($call) { case 'assign_translator': $translator_data = TranslationProxy_Service::get_translator_data_from_wpml($data['translator_id']); $service_id = $translator_data['translation_service']; $translator_id = $translator_data['translator_id']; $assign_translation_job = $this->assign_translation_job($data['job_id'], $translator_id, $service_id, $data['job_type']); if ($assign_translation_job) { $translator_edit_link = ''; if ($translator_id) { if ($service_id == TranslationProxy::get_current_service_id()) { $job = $this->get_translation_job($data['job_id']); /** @var $ICL_Pro_Translation WPML_Pro_Translation */ global $ICL_Pro_Translation; $ICL_Pro_Translation->send_post($job->original_doc_id, array($job->language_code), $translator_id, $data['job_id']); $project = TranslationProxy::get_current_project(); $translator_edit_link = TranslationProxy_Popup::get_link($project->translator_contact_iframe_url($translator_id), array('title' => __('Contact the translator', 'sitepress'), 'unload_cb' => 'icl_thickbox_refresh')) . esc_html(TranslationProxy_Translator::get_translator_name($translator_id)) . "</a> ({$project->service}->name)"; } else { $translator_edit_link = '<a href="' . TranslationManagement::get_translator_edit_url($data['translator_id']) . '">' . esc_html($wpdb->get_var($wpdb->prepare("SELECT display_name FROM {$wpdb->users} WHERE ID=%d", $data['translator_id']))) . '</a>'; } } echo wp_json_encode(array('error' => 0, 'message' => $translator_edit_link, 'status' => TranslationManagement::status2text(ICL_TM_WAITING_FOR_TRANSLATOR), 'service' => $service_id)); } else { echo wp_json_encode(array('error' => 1)); } break; case 'icl_cf_translation': case 'icl_tcf_translation': if (!empty($data['cf'])) { foreach ($data['cf'] as $k => $v) { $cft[base64_decode($k)] = $v; } if (isset($cft)) { $this->settings[$call === 'icl_tcf_translation' ? WPML_TERM_META_SETTING_INDEX_PLURAL : WPML_POST_META_SETTING_INDEX_PLURAL] = $cft; $this->save_settings(); } } echo '1|'; break; case 'icl_doc_translation_method': $this->settings['doc_translation_method'] = intval($data['t_method']); $sitepress->set_setting('doc_translation_method', $this->settings['doc_translation_method']); $sitepress->save_settings(array('hide_how_to_translate' => empty($data['how_to_translate']))); if (isset($data['tm_block_retranslating_terms'])) { $sitepress->set_setting('tm_block_retranslating_terms', $data['tm_block_retranslating_terms']); } else { $sitepress->set_setting('tm_block_retranslating_terms', ''); } if (isset($data['tm_block_retranslating_terms'])) { $sitepress->set_setting('tm_block_retranslating_terms', $data['tm_block_retranslating_terms']); } else { $sitepress->set_setting('tm_block_retranslating_terms', ''); } $this->save_settings(); echo '1|'; break; case 'reset_duplication': $this->reset_duplicate_flag($_POST['post_id']); break; case 'set_duplication': $new_id = $this->set_duplicate($_POST['wpml_original_post_id'], $_POST['post_lang']); wp_send_json_success(array('id' => $new_id)); break; case 'make_duplicates': $mdata['iclpost'] = array($data['post_id']); $langs = explode(',', $data['langs']); foreach ($langs as $lang) { $mdata['duplicate_to'][$lang] = 1; } $this->make_duplicates($mdata); do_action('wpml_new_duplicated_terms', (array) $mdata['iclpost'], false); break; } }
private function commit_basket($translation_id) { $basket_networking = wpml_tm_load_basket_networking(); $translator_array = $this->build_translator_array($translation_id); if ($translator_array) { $basket_networking->commit_basket_chunk(array(), TranslationProxy_Basket::get_basket_name(), $translator_array); } $project = TranslationProxy::get_current_project(); $project->commit_batch_job(); TranslationProxy_Basket::delete_all_items_from_basket(); }