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;
 }
Ejemplo n.º 3
0
 /**
  *
  * @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') . ' &raquo;" />' . "\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') . '&nbsp;<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') . '&nbsp;<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 . '>&nbsp;' . $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&amp;sm=translators&amp;icl_tm_action=remove_translator&amp;remove_translator_nonce=<?php 
                        echo wp_create_nonce('remove_translator');
                        ?>
&amp;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&amp;sm=translators&icl_tm_action=edit&amp;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&amp;sm=translators&icl_tm_action=edit&amp;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>
                &nbsp;<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') . '" />&nbsp;';
         $translator .= '<input type="button" class="button-secondary icl_tj_cancel" value="' . __('Cancel', 'wpml-translation-management') . '" />';
         $translator .= '</span>';
     }
     return $translator;
 }
Ejemplo n.º 8
0
 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>&nbsp;' . $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;
 }