function send_strings_to_translation_service($string_ids, $target_language, $translator_id) { /** @var WPML_String_Translation $WPML_String_Translation */ global $WPML_String_Translation; if (sizeof($string_ids) > 0) { $project = $this->basket->get_project(); $strings = array(); $word_count = 0; $source_language = $this->basket->get_source_language(); foreach ($string_ids as $string_id) { $string_data_query = "SELECT id, context, name, value FROM {$this->wpdb->prefix}icl_strings WHERE id=%d"; $string_data_prepare = $this->wpdb->prepare($string_data_query, $string_id); $string_data = $this->wpdb->get_row($string_data_prepare); $word_count += $WPML_String_Translation->estimate_word_count($string_data->value, $source_language); $strings[] = $string_data; } $xliff = new WPML_TM_Xliff_Writer($this->job_factory); $res = $project->send_to_translation_batch_mode($xliff->get_strings_xliff_file($strings, $source_language, $target_language), 'String Translations', '', '', $source_language, $target_language, $word_count); if ($res) { foreach ($strings as $string_data) { $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'], TranslationProxy_Batch::update_translation_batch($this->basket->get_name())); if ($added) { $data = array('rid' => $res, 'string_translation_id' => $added, 'timestamp' => date('Y-m-d H:i:s'), 'md5' => md5($string_data->value)); $this->wpdb->insert($this->wpdb->prefix . 'icl_string_status', $data); //insert rid } } $this->wpdb->insert($this->wpdb->prefix . 'icl_core_status', array('rid' => $res, 'module' => '', 'origin' => $source_language, 'target' => $target_language, 'status' => ICL_TM_WAITING_FOR_TRANSLATOR)); if ($project->errors && count($project->errors)) { $res['errors'] = $project->errors; } return $res; } } return 0; }
function send_jobs($data) { global $wpdb, $sitepress; if (!isset($data['tr_action']) && isset($data['translate_to'])) { //adapt new format $data['tr_action'] = $data['translate_to']; unset($data['translate_to']); } if (isset($data['iclpost'])) { //adapt new format $data['posts_to_translate'] = $data['iclpost']; unset($data['iclpost']); } if (isset($data['post'])) { //adapt new format $data['posts_to_translate'] = $data['post']; unset($data['post']); } $batch_name = isset($data['batch_name']) ? $data['batch_name'] : false; $translate_from = TranslationProxy_Basket::get_source_language(); $data_default = array('translate_from' => $translate_from); extract($data_default); extract($data, EXTR_OVERWRITE); // no language selected ? if (!isset($tr_action) || empty($tr_action)) { $this->dashboard_select = $data; // prepopulate dashboard return false; } // no post selected ? if (!isset($posts_to_translate) || empty($posts_to_translate)) { $this->dashboard_select = $data; // pre-populate dashboard return false; } $selected_posts = $posts_to_translate; $selected_translators = isset($translators) ? $translators : array(); $selected_languages = $tr_action; $job_ids = array(); $element_type_prefix = 'post'; if (isset($data['element_type_prefix'])) { $element_type_prefix = $data['element_type_prefix']; } foreach ($selected_posts as $post_id) { $post = $this->get_post($post_id, $element_type_prefix); if (!$post) { continue; } $element_type = $element_type_prefix . '_' . $post->post_type; $post_trid = $sitepress->get_element_trid($post_id, $element_type); $post_translations = $sitepress->get_element_translations($post_trid, $element_type); $md5 = $this->post_md5($post); $translation_package = $this->create_translation_package($post); foreach ($selected_languages as $lang => $action) { // making this a duplicate? if ($action == 2) { // don't send documents that are in progress $current_translation_status = $this->get_element_translation($post_id, $lang, $element_type); if ($current_translation_status && $current_translation_status->status == ICL_TM_IN_PROGRESS) { continue; } $job_ids[] = $this->make_duplicate($post_id, $lang); } elseif ($action == 1) { if (empty($post_translations[$lang])) { $translation_id = $sitepress->set_element_language_details(null, $element_type, $post_trid, $lang, $translate_from); } else { $translation_id = $post_translations[$lang]->translation_id; } // don't send documents that are in progress // don't send documents that are already translated and don't need update $current_translation_status = $this->get_element_translation($post_id, $lang, $element_type); if ($current_translation_status && $current_translation_status->status == ICL_TM_IN_PROGRESS) { continue; } $_status = ICL_TM_WAITING_FOR_TRANSLATOR; if (isset($selected_translators[$lang])) { $translator = $selected_translators[$lang]; } else { $translator = get_current_user_id(); // returns current user id or 0 if user not logged in } $translation_data = TranslationProxy_Service::get_translator_data_from_wpml($translator); $translation_service = $translation_data['translation_service']; $translator_id = $translation_data['translator_id']; // set as default translator if ($translator_id > 0) { $this->set_default_translator($translator_id, $translate_from, $lang, $translation_service); } // add translation_status record $data = array('translation_id' => $translation_id, 'status' => $_status, 'translator_id' => $translator_id, 'needs_update' => 0, 'md5' => $md5, 'translation_service' => $translation_service, 'translation_package' => serialize($translation_package), 'batch_id' => TranslationProxy_Batch::update_translation_batch($batch_name)); $_prevstate = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\t\tSELECT status, translator_id, needs_update, md5, translation_service, translation_package, timestamp, links_fixed\n\t\t\t\t\t\tFROM {$wpdb->prefix}icl_translation_status\n\t\t\t\t\t\tWHERE translation_id = %d\n\t\t\t\t\t", $translation_id), ARRAY_A); if ($_prevstate) { $data['_prevstate'] = serialize($_prevstate); } $update_translation_status = $this->update_translation_status($data); $rid = $update_translation_status[0]; //__ adds or updates row in icl_translation_status, $job_id = $this->add_translation_job($rid, $translator_id, $translation_package); $job_ids[] = $job_id; if ($translation_service !== 'local') { /** @global WPML_Pro_Translation $ICL_Pro_Translation */ global $ICL_Pro_Translation; $sent = $ICL_Pro_Translation->send_post($post, array($lang), $translator_id, $job_id); if (!$sent) { $job_id = array_pop($job_ids); $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_translate_job WHERE job_id=%d", $job_id)); $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}icl_translate_job SET revision = NULL WHERE rid=%d ORDER BY job_id DESC LIMIT 1", $rid)); $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_translate WHERE job_id=%d", $job_id)); } } } // if / else is making a duplicate } } icl_cache_clear(); do_action('wpml_tm_empty_mail_queue'); return $job_ids; }
/** * * @return bool */ public static function is_current_service_active_and_authenticated() { $active_service = self::get_current_service(); return $active_service && (!TranslationProxy::service_requires_authentication() || TranslationProxy_Service::is_authenticated($active_service)); }
public function build_content_translators() { global $sitepress, $iclTranslationManagement, $wpdb, $current_user; $selected_translator = $iclTranslationManagement->get_selected_translator(); $active_service = $this->active_service; $service_name = $this->service_name; if (current_user_can('list_users')) { add_filter('icl_translation_services_button', array($this, 'icl_local_add_translator_button')); add_filter('icl_translation_services_button', array('TranslationProxy', 'get_current_service_info')); $only_local_translators = $active_service && (!TranslationProxy_Service::is_authenticated($active_service) || $active_service && !$active_service->has_translator_selection); ?> <div id="icl-your-translators"> <?php if ($active_service && TranslationProxy::translator_selection_available()) { if ($only_local_translators) { $translation_dashboard_url = "admin.php?page=" . WPML_TM_FOLDER . "/menu/main.php&sm=dashboard"; $translation_dashboard_link = sprintf('<a href="%s">' . __('Translation Dashboard', 'wpml-translation-management') . '</a>', $translation_dashboard_url); $service_html = '<p>'; $service_html .= sprintf(__('This section is for selecting WPML (local) translators only. If you wish to use %s, please go to %s.'), '<strong>' . $service_name . '</strong>', $translation_dashboard_link); $service_html .= '</p>'; } else { $service_html = TranslationProxy::get_service_translators_info(); } ICL_AdminNotifier::display_instant_message($service_html); } if ($selected_translator && $selected_translator->ID) { // Edit form echo '<h3>' . __('Edit translator', 'wpml-translation-management') . '</h3>'; echo '<form id="icl_tm_adduser" method="post" action="">' . "\r\n"; echo $this->icl_local_edit_translator_form('edit', $selected_translator) . "\r\n"; echo '</form>' . "\r\n"; } else { // Services add translator form // Services hook $services_buttons = apply_filters('icl_translation_services_button', array()); if (!empty($services_buttons)) { if (!$only_local_translators) { // Toggle button echo '<input type="submit" class="button secondary" id="icl_add_translator_form_toggle" value="' . __('Add Translator', 'wpml-translation-management') . ' »" />' . "\r\n"; } // Toggle div start $form_classes = array('translator-form-wrapper'); if (!isset($_GET['service']) && !$only_local_translators) { $form_classes[] = 'hidden'; } echo '<div id="icl_add_translator_form_wrapper" class="' . implode(' ', $form_classes) . '">'; // Open form echo '<form id="icl_tm_adduser" method="post" action="">'; // 'From' and 'To' languages dropdowns $languages = $sitepress->get_active_languages(); $from = '<label>' . __('From language:', 'wpml-translation-management') . ' <select name="from_lang" id="edit-from">' . "\r\n" . '<option value="0">' . __('Choose', 'wpml-translation-management') . '</option>' . "\r\n"; $to = '<label>' . __('To language:', 'wpml-translation-management') . ' <select name="to_lang" id="edit-to">' . "\r\n" . '<option value="0">' . __('Choose', 'wpml-translation-management') . '</option>' . "\r\n"; foreach ($languages as $language) { // select language from request $selected_from = isset($_GET['icl_lng']) && $_GET['icl_lng'] == $language['code'] ? ' selected="selected"' : ''; $from .= '<option ' . $selected_from . ' value="' . $language['code'] . '"' . @strval($selected_from) . '>' . $language['display_name'] . '</option>' . "\r\n"; $to .= '<option value="' . $language['code'] . '"' . '>' . $language['display_name'] . '</option>' . "\r\n"; } echo $from . '</select></label>' . "\r\n"; echo $to . '</select></label>' . "\r\n"; if (!$only_local_translators) { // Services radio boxes echo '<h4 style="margin-bottom:5px;">' . __('Select translation service', 'wpml-translation-management') . '</h4>' . "\r\n"; } else { echo '<h4 style="margin-bottom:5px;">' . __('Select translators', 'wpml-translation-management') . '</h4>' . "\r\n"; } foreach ($services_buttons as $service => $button) { if ($only_local_translators && $service != 'local') { continue; } if (!isset($button['has_translator_selection']) || $button['has_translator_selection']) { $selected = $only_local_translators && $service == 'local' || isset($_GET['service']) && $_GET['service'] == $service ? ' checked="checked"' : ''; $title = array(); $has_translator_selection = isset($service['has_translator_selection']) ? $service['has_translator_selection'] : false; echo '<div style="margin-bottom:5px;">'; $display = $only_local_translators && $service == 'local' ? ' style="display:none;"' : ''; echo '<input type="radio" id="radio-' . $service . '" name="services" data-has_translator_selection="' . $has_translator_selection . '" value="' . $service . '"' . $selected . $display . ' />'; if (isset($button['name']) && $button['name']) { $title[] = '<label for="radio-' . $service . '"' . $display . '> ' . $button['name']; } if (isset($button['description']) && $button['description']) { $title[] = $button['description']; } if (isset($button['more_link']) && $button['more_link']) { $title[] = $button['more_link']; } echo implode(' - ', $title) . "\r\n"; echo '</label>'; echo isset($button['content']) && $button['content'] ? $button['content'] . "\r\n" : ''; echo isset($button['messages']) && $button['messages'] ? $button['messages'] . "\r\n" : ''; if (isset($button['setup_url']) && $button['setup_url']) { echo '<input type="hidden" id="' . $service . '_setup_url" name="' . $service . '_setup_url" value="' . $button['setup_url'] . '" />' . "\r\n"; } echo '</div>'; } } echo '<br style="clear:both;" />'; echo '<input id="icl_add_translator_submit" class="button-primary" type="submit" value="' . esc_attr(__('Add translator', 'wpml-translation-management')) . '" />' . "\r\n"; echo '</form>' . "\r\n"; echo '</div>' . "\r\n"; } else { _e('No add translator interface available', 'wpml-translation-management'); } } // Translators lists // Local translators $blog_users_t = $iclTranslationManagement->get_blog_translators(); if (TranslationProxy::translator_selection_available()) { $other_service_translators = TranslationProxy_Translator::translation_service_translators_list(); } ?> <?php if (!empty($blog_users_t) || !empty($other_service_translators)) { ?> <h3><?php _e('Current translators', 'wpml-translation-management'); ?> </h3> <table class="widefat fixed" cellspacing="0"> <thead> <?php $this->translators_head_foot_row(); ?> </thead> <tfoot> <?php $this->translators_head_foot_row(); ?> </tfoot> <tbody class="list:user user-list"> <?php if (!empty($blog_users_t)) { foreach ($blog_users_t as $bu) { ?> <?php if (!isset($trstyle) || $trstyle) { $trstyle = ''; } else { $trstyle = ' class="alternate"'; } if ($current_user->ID == $bu->ID) { $edit_link = 'profile.php'; } else { $edit_link = esc_url(add_query_arg('wp_http_referer', urlencode(esc_url(stripslashes($_SERVER['REQUEST_URI']))), "user-edit.php?user_id={$bu->ID}")); } $language_pairs = get_user_meta($bu->ID, $wpdb->prefix . 'language_pairs', true); ?> <tr<?php echo $trstyle; ?> > <td class="column-title"> <strong><a class="row-title" href="<?php echo $edit_link; ?> "><?php echo $bu->user_login; ?> </a></strong> <div class="row-actions"> <a class="edit" href="admin.php?page=<?php echo WPML_TM_FOLDER; ?> /menu/main.php&sm=translators&icl_tm_action=remove_translator&remove_translator_nonce=<?php echo wp_create_nonce('remove_translator'); ?> &user_id=<?php echo $bu->ID; ?> "><?php _e('Remove', 'wpml-translation-management'); ?> </a> | <a class="edit" href="admin.php?page=<?php echo WPML_TM_FOLDER; ?> /menu/main.php&sm=translators&icl_tm_action=edit&user_id=<?php echo $bu->ID; ?> "> <?php _e('Language pairs', 'wpml-translation-management'); ?> </a> </div> </td> <td> <?php $langs = $sitepress->get_active_languages(); ?> <ul> <?php foreach ($language_pairs as $from => $lp) { ?> <?php $tos = array(); foreach ($lp as $to => $null) { if (isset($langs[$to])) { $tos[] = $langs[$to]['display_name']; } elseif ($to) { $_lang = $sitepress->get_language_details($to); if ($_lang) { $tos[] = '<i>' . $_lang['display_name'] . __(' (inactive)', 'wpml-translation-management') . '</i>'; } } } ?> <li><?php @printf(__('%s to %s', 'wpml-translation-management'), $langs[$from]['display_name'], join(', ', $tos)); ?> </li> <?php } ?> </ul> </td> <td> Local </td> <td> <a href="admin.php?page=<?php echo WPML_TM_FOLDER; ?> /menu/main.php&sm=translators&icl_tm_action=edit&user_id=<?php echo $bu->ID; ?> "><?php _e('edit languages', 'wpml-translation-management'); ?> </a> </td> </tr> <?php } } ?> <?php if (!empty($other_service_translators)) { foreach ($other_service_translators as $rows) { ?> <?php if (!isset($trstyle) || $trstyle) { $trstyle = ''; } else { $trstyle = ' class="alternate"'; } $language_pairs = isset($rows['langs']) ? $rows['langs'] : ''; ?> <tr<?php echo $trstyle; ?> > <td class="column-title"> <strong><?php echo isset($rows['name']) ? $rows['name'] : ''; ?> </strong> <div class="row-actions"> <?php echo isset($rows['action']) ? $rows['action'] : ''; ?> </div> </td> <td> <?php $langs = $sitepress->get_active_languages(); if (is_array($language_pairs)) { ?> <ul> <?php foreach ($language_pairs as $from => $lp) { $from = isset($langs[$from]['display_name']) ? $langs[$from]['display_name'] : $from; $tos = array(); foreach ($lp as $to) { $tos[] = isset($langs[$to]['display_name']) ? $langs[$to]['display_name'] : $to; } ?> <li><?php printf(__('%s to %s', 'wpml-translation-management'), $from, join(', ', $tos)); ?> </li> <?php } ?> </ul> <?php } ?> </td> <td> <?php echo isset($rows['type']) ? icl_do_not_promote() ? __('Translation Service', 'sitepress') : $rows['type'] : ''; ?> </td> <td> <?php echo isset($rows['action']) ? $rows['action'] : ''; ?> </td> </tr> <?php } } ?> </tbody> </table> <?php } else { $message = __("You haven't added any translator accounts yet.", 'wpml-translation-management'); ICL_AdminNotifier::display_instant_message($message, 'warning'); } wp_nonce_field('get_users_not_trans_nonce', 'get_users_not_trans_nonce'); } //if ( current_user_can('list_users') ) ?> </div> <?php }
private function build_translation_options() { global $sitepress, $wpdb; $basket_items_number = TranslationProxy_Basket::get_basket_items_count(true); $basket_name_max_length = TranslationProxy::get_current_service_batch_name_max_length(); if ($basket_items_number > 0) { $source_language = TranslationProxy_Basket::get_source_language(); $basket_name_placeholder = sprintf(__("%s|WPML|%s", 'wpml-translation-management'), get_option('blogname'), $source_language); $basket = new WPML_Translation_Basket($wpdb); $basket_name_placeholder = esc_attr($basket->get_unique_basket_name($basket_name_placeholder, $basket_name_max_length)); ?> <h3>2. <?php _e('Choose translation options', 'wpml-translation-management'); ?> </h3> <form method="post" id="translation-jobs-translators-form" name="translation-jobs-translators" action=""> <input type="hidden" name="icl_tm_action" value="send_all_jobs"/> <label for="basket_name"><strong><?php _e('Batch name', 'wpml-translation-management'); ?> :</strong></label> <input id="basket_name" name="basket_name" type="text" style="width: 40%;" value="<?php echo $basket_name_placeholder; ?> " maxlength="<?php echo $basket_name_max_length; ?> " placeholder="<?php echo $basket_name_placeholder; ?> "> <br/><span class="description"><?php _e('Give a name to the batch. If omitted, the default name will be applied.', 'wpml-translation-management'); ?> </span> <table class="widefat fixed" id="icl-translation-translators" cellspacing="0"> <thead> <tr> <th scope="col" width="15%"><?php _e('Language', 'wpml-translation-management'); ?> </th> <th scope="col"><?php _e('Translator', 'wpml-translation-management'); ?> </th> </tr> </thead> <tfoot> <tr> <th scope="col"><?php _e('Language', 'wpml-translation-management'); ?> </th> <th scope="col"><?php _e('Translator', 'wpml-translation-management'); ?> </th> </tr> </tfoot> <?php $basket_languages = TranslationProxy_Basket::get_target_languages(); if ($basket_languages) { ?> <tbody> <?php $target_languages = $sitepress->get_active_languages(); foreach ($target_languages as $key => $lang) { if (!in_array($lang['code'], $basket_languages)) { unset($target_languages[$key]); } } foreach ($target_languages as $lang) { if ($lang['code'] === TranslationProxy_Basket::get_source_language()) { continue; } ?> <tr> <td><strong><?php echo $lang['display_name']; ?> </strong></td> <td> <label for="<?php echo esc_attr('translator[' . $lang['code'] . ']'); ?> "> <?php _e('Translate by', 'wpml-translation-management'); ?> </label> <?php $selected_translator = isset($icl_selected_translators[$lang['code']]) ? $icl_selected_translators[$lang['code']] : false; if ($selected_translator === false) { $selected_translator = TranslationProxy_Service::get_wpml_translator_id(); } $args = array('from' => TranslationProxy_Basket::get_source_language(), 'to' => $lang['code'], 'name' => 'translator[' . $lang['code'] . ']', 'selected' => $selected_translator, 'services' => array('local', TranslationProxy::get_current_service_id())); TranslationManagement::translators_dropdown($args); ?> <a href="admin.php?page=<?php echo WPML_TM_FOLDER; ?> /menu/main.php&sm=translators"><?php _e('Manage translators', 'wpml-translation-management'); ?> </a> </td> </tr> <?php } ?> </tbody> <?php } ?> </table> <br> <?php echo TranslationProxy_Basket::get_basket_extra_fields_section(); ?> <?php wp_nonce_field('send_basket_items_nonce', '_icl_nonce_send_basket_items'); ?> <?php wp_nonce_field('send_basket_item_nonce', '_icl_nonce_send_basket_item'); ?> <?php wp_nonce_field('send_basket_commit_nonce', '_icl_nonce_send_basket_commit'); ?> <?php wp_nonce_field('check_basket_name_nonce', '_icl_nonce_check_basket_name'); ?> <input type="submit" class="button-primary" name="send-all-jobs-for-translation" value="<?php _e('Send all items for translation', 'wpml-translation-management'); ?> "> </form> <?php } do_action('wpml_translation_basket_page_after'); }
protected function automatic_service_selection() { if (defined('DOING_AJAX') || !$this->automatic_service_selection_pages()) { return; } $done = wp_cache_get('done', 'automatic_service_selection'); ICL_AdminNotifier::remove_message('automatic_service_selection'); if (!$done && defined('WPML_TP_DEFAULT_SUID')) { $selected_service = TranslationProxy::get_current_service(); if (isset($selected_service->suid) && $selected_service->suid == WPML_TP_DEFAULT_SUID) { return; } try { $service_by_suid = TranslationProxy_Service::get_service_by_suid(WPML_TP_DEFAULT_SUID); } catch (Exception $ex) { $service_by_suid = false; } if (isset($service_by_suid->id)) { $selected_service_id = isset($selected_service->id) ? $selected_service->id : false; if (!$selected_service_id || $selected_service_id != $service_by_suid->id) { if ($selected_service_id) { TranslationProxy::deselect_active_service(); } $result = TranslationProxy::select_service($service_by_suid->id); if (is_wp_error($result)) { $error_data = $result->get_error_data(); $error_data_string = false; foreach ($error_data as $key => $error_data_message) { $error_data_string .= $result->get_error_message() . '<br/>'; $error_data_string .= $key . ': <pre>' . print_r($error_data_message, true) . '</pre>'; $error_data_string .= $result->get_error_message() . $error_data_string; } } if (defined('WPML_TP_SERVICE_CUSTOM_FIELDS')) { TranslationProxy::authenticate_service($service_by_suid->id, WPML_TP_SERVICE_CUSTOM_FIELDS); } } } else { $error_data_string = __("WPML can't find the translation service specified in WPML_TP_DEFAULT_SUID constant. Please remove the constant or set the correct value.", 'wpml-translation-management'); } } if (isset($error_data_string)) { $automatic_service_selection_args = array('id' => 'automatic_service_selection', 'group' => 'automatic_service_selection', 'msg' => $error_data_string, 'type' => 'error', 'admin_notice' => true, 'hide' => false); ICL_AdminNotifier::add_message($automatic_service_selection_args); } wp_cache_set('done', true, 'automatic_service_selection'); }
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; }
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); } }
private function automatic_service_selection() { if (defined('DOING_AJAX') || !$this->automatic_service_selection_pages()) { return; } $done = wp_cache_get('done', 'automatic_service_selection'); ICL_AdminNotifier::remove_message('automatic_service_selection'); $tp_default_suid = TranslationProxy::get_tp_default_suid(); if (!$done && $tp_default_suid) { $selected_service = TranslationProxy::get_current_service(); if (isset($selected_service->suid) && $selected_service->suid == $tp_default_suid) { return; } try { $service_by_suid = TranslationProxy_Service::get_service_by_suid($tp_default_suid); } catch (Exception $ex) { $service_by_suid = false; } if (isset($service_by_suid->id)) { $selected_service_id = isset($selected_service->id) ? $selected_service->id : false; if (!$selected_service_id || $selected_service_id != $service_by_suid->id) { if ($selected_service_id) { TranslationProxy::deselect_active_service(); } $result = TranslationProxy::select_service($service_by_suid->id); if (is_wp_error($result)) { $error_data = $result->get_error_data(); $error_data_string = false; foreach ($error_data as $key => $error_data_message) { $error_data_string .= $result->get_error_message() . '<br/>'; $error_data_string .= $key . ': <pre>' . print_r($error_data_message, true) . '</pre>'; $error_data_string .= $result->get_error_message() . $error_data_string; } } } } else { $error_data_string = __("WPML can't find the translation service. Please contact WPML Support or your translation service provider.", 'wpml-translation-management'); } } if (isset($error_data_string)) { $automatic_service_selection_args = array('id' => 'automatic_service_selection', 'group' => 'automatic_service_selection', 'msg' => $error_data_string, 'type' => 'error', 'admin_notice' => true, 'hide' => false); ICL_AdminNotifier::add_message($automatic_service_selection_args); } wp_cache_set('done', true, 'automatic_service_selection'); }
/** * Convert WPML language code to service language * * @param $language string * * @return bool|string */ private function service_language($language) { return TranslationProxy_Service::get_language($this->service, $language); }
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 array $args * * @return string */ public function render($args = array()) { $dropdown = ''; /** @var $from string|false */ /** @var $to string|false */ /** @var $classes string|false */ /** @var $id string|false */ /** @var $name string|false */ /** @var $selected bool */ /** @var $echo bool */ /** @var $add_label bool */ /** @var $services array */ /** @var $show_service bool */ /** @var $disabled bool */ /** @var $default_name bool|string */ /** @var $local_only bool */ //set default value for variables $from = false; $to = false; $id = 'translator_id'; $name = 'translator_id'; $selected = 0; $echo = true; $add_label = false; $services = array('local'); $show_service = true; $disabled = false; $default_name = false; $local_only = false; extract($args, EXTR_OVERWRITE); $translators = array(); $id .= $from ? '_' . $from . ($to ? '_' . $to : '') : ''; try { $translation_service = TranslationProxy::get_current_service(); $translation_service_id = TranslationProxy::get_current_service_id(); $translation_service_name = TranslationProxy::get_current_service_name(); $is_service_authenticated = TranslationProxy::is_service_authenticated(); //if translation service does not support translators choice, always shows first available if (isset($translation_service->id) && !TranslationProxy::translator_selection_available() && $is_service_authenticated) { $translators[] = (object) array('ID' => TranslationProxy_Service::get_wpml_translator_id($translation_service->id), 'display_name' => __('First available', 'wpml-translation-management'), 'service' => $translation_service_name); } elseif (in_array($translation_service_id, $services) && $is_service_authenticated) { $lang_status = TranslationProxy_Translator::get_language_pairs(); if (empty($lang_status)) { $lang_status = array(); } foreach ((array) $lang_status as $language_pair) { if ($from && $from != $language_pair['from']) { continue; } if ($to && $to != $language_pair['to']) { continue; } if (!empty($language_pair['translators'])) { if (1 < count($language_pair['translators'])) { $translators[] = (object) array('ID' => TranslationProxy_Service::get_wpml_translator_id($translation_service->id), 'display_name' => __('First available', 'wpml-translation-management'), 'service' => $translation_service_name); } foreach ($language_pair['translators'] as $tr) { if (!isset($_icl_translators[$tr['id']])) { $translators[] = $_icl_translators[$tr['id']] = (object) array('ID' => TranslationProxy_Service::get_wpml_translator_id($translation_service->id, $tr['id']), 'display_name' => $tr['nickname'], 'service' => $translation_service_name); } } } } } if (in_array('local', $services)) { $translators[] = (object) array('ID' => 0, 'display_name' => __('First available', 'wpml-translation-management')); $translators = array_merge($translators, TranslationManagement::get_blog_translators(array('from' => $from, 'to' => $to))); } $translators = apply_filters('wpml_tm_translators_list', $translators); $dropdown .= '<select id="' . esc_attr($id) . '" name="' . esc_attr($name) . '" ' . ($disabled ? 'disabled="disabled"' : '') . '>'; if ($default_name) { $dropdown_selected = selected($selected, false, false); $dropdown .= '<option value="" ' . $dropdown_selected . '>'; $dropdown .= esc_html($default_name); $dropdown .= '</option>'; } foreach ($translators as $t) { if ($local_only && isset($t->service)) { continue; } $current_translator = $t->ID; $dropdown_selected = selected($selected, $current_translator, false); $dropdown .= '<option value="' . $current_translator . '" ' . $dropdown_selected . '>'; $dropdown .= esc_html($t->display_name); if ($show_service) { $dropdown .= ' ('; $dropdown .= isset($t->service) ? $t->service : __('Local', 'wpml-translation-management'); $dropdown .= ')'; } $dropdown .= '</option>'; } $dropdown .= '</select>'; } catch (TranslationProxy_Api_Error $ex) { $dropdown .= __('Translation Proxy error', 'wpml-translation-management') . ': ' . $ex->getMessage(); } catch (Exception $ex) { $dropdown .= __('Error', 'wpml-translation-management') . ': ' . $ex->getMessage(); } if ($add_label) { $dropdown = '<label for="' . esc_attr($id) . '">' . __('Translation jobs for:', 'wpml-translation-management') . '</label> ' . $dropdown; } if ($echo) { echo $dropdown; } return $dropdown; }
private function get_icl_service_id() { $service = TranslationProxy_Service::get_service_by_suid(ICLM_ICL_SUID); return $service->id; }