public function edit_translator_action($user, $language_pairs) { $user_id = $this->get_user_id($user); if (is_numeric($user_id)) { $this->TranslationManagement->edit_translator($user_id, $language_pairs); } }
public static function translation_send_strings_local($string_ids, $target, $translator = null, $basket_name = null) { global $wpdb; static $site_translators; if (!isset($site_translators)) { $site_translators = TranslationManagement::get_blog_translators(); } $mkey = $wpdb->prefix . 'strings_notification'; $lkey = $wpdb->prefix . 'language_pairs'; $slang = TranslationProxy_Basket::get_source_language(); foreach ($string_ids as $string_id) { $batch_id = TranslationProxy_Batch::update_translation_batch($basket_name); $added = icl_add_string_translation($string_id, $target, null, ICL_TM_WAITING_FOR_TRANSLATOR, $translator, 'local', $batch_id); if ($added) { foreach ($site_translators as $key => $st) { $ulangs = isset($st->{$lkey}) ? $st->{$lkey} : false; if (!empty($ulangs) && !empty($ulangs[$slang][$target])) { $enot = isset($st->{$mkey}) ? $st->{$mkey} : false; if (empty($enot[$slang][$target])) { self::translator_notification($st, $slang, $target); $enot[$slang][$target] = 1; $site_translators[$key]->{$mkey} = $enot; update_option($wpdb->prefix . 'icl_translators_cached', $site_translators); } } } } } return 1; }
private function render_current_element_diff() { if (!$this->current_element->field_finished && !empty($this->job->prev_version)) { $prev_value = ''; foreach ($this->job->prev_version->elements as $pel) { if ($this->current_element->field_type == $pel->field_type) { $prev_value = $this->tm_instance->decode_field_data($pel->field_data, $pel->field_format); } } if ($this->current_element->field_format != 'csv_base64') { $diff = wp_text_diff($prev_value, $this->tm_instance->decode_field_data($this->current_element->field_data, $this->current_element->field_format)); } if (!empty($diff)) { ?> <div class="wpml_diff_wrapper"> <p><a href="#" class="wpml_diff_toggle"><?php _e('Show Changes', 'sitepress'); ?> </a></p> <div class="wpml_diff"> <?php echo $diff; ?> </div> </div> <?php } } }
function new_job_any($job_id) { global $iclTranslationManagement, $sitepress, $wpdb; $job = $iclTranslationManagement->get_translation_job($job_id); $translators = TranslationManagement::get_blog_translators(array('to' => $job->language_code)); $edit_url = apply_filters('icl_job_edit_url', admin_url('admin.php?page=' . WPML_TM_FOLDER . '/menu/translations-queue.php&job_id=' . $job_id), $job_id); foreach ($translators as $t) { if ($job->manager_id == $t->ID) { continue; } // get current user admin language $user_language = $sitepress->get_user_admin_language($t->ID); // override locale $sitepress->switch_locale($user_language); $lang_from = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}icl_languages_translations WHERE language_code='%s' AND display_language_code='%s'", $job->source_language_code, $user_language)); $lang_to = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}icl_languages_translations WHERE language_code='%s' AND display_language_code='%s'", $job->language_code, $user_language)); $post_link = $iclTranslationManagement->tm_post_permalink($job->original_doc_id); if ($post_link != "") { $post_link = sprintf(__("\nView the original document in %s here: %s\n", 'sitepress'), $lang_from, $post_link); } $mail['to'] = $t->display_name . ' <' . $t->user_email . '>'; //$mail['to'] = $t->user_email; $mail['subject'] = sprintf(__('New translation job from %s', 'sitepress'), get_bloginfo('name')); $mail['body'] = sprintf(__("New job available from %s to %s.\n%s\nStart editing: %s", 'sitepress'), $lang_from, $lang_to, $post_link, $edit_url); $mail['type'] = 'translator'; $this->send_mail($mail, $user_language); //restore locale $sitepress->switch_locale(); } }
public function get_batch_name() { if ($this->name == false) { $this->name = TranslationManagement::get_batch_name($this->get_id()); } return $this->name; }
/** * @param array $args * * @return array */ function get_blog_translators($args = array()) { $translators = TranslationManagement::get_blog_translators($args); foreach ($translators as $key => $user) { $translators[$key] = isset($user->data) ? $user->data : $user; } return $translators; }
/** * Sets up the menu items for non-admin translators pointing at the TM * and ST translators interfaces */ function menu() { if ($this->sitepress->setup()) { $wp_api = $this->sitepress->get_wp_api(); if ($wp_api->current_user_can('wpml_manage_translation_management')) { $wp_api->add_submenu_page(apply_filters('icl_menu_main_page', ICL_PLUGIN_FOLDER . '/menu/languages.php'), __('Translations', 'wpml-translation-management'), __('Translations', 'wpml-translation-management'), 'wpml_manage_translation_management', WPML_TM_FOLDER . '/menu/translations-queue.php', array($this, 'translation_queue_page')); } elseif ((bool) $this->tm_instance->get_current_translator()->language_pairs === true) { $wp_api->add_menu_page(__('Translation interface', 'wpml-translation-management'), __('Translation interface', 'wpml-translation-management'), 'translate', WPML_TM_FOLDER . '/menu/translations-queue.php', array($this, 'translation_queue_page'), ICL_PLUGIN_URL . '/res/img/icon16.png'); } } }
private function update_tm_settings(array $config) { $section_singular = $this->index_singular; $config = array_filter($config); $config[$section_singular] = isset($config[$section_singular]) ? $config[$section_singular] : array(); $this->sync_settings($config); // taxonomies - check what's been removed if (!empty($this->tm_instance->settings[$this->index_ro])) { $config_values = array(); foreach ($config[$section_singular] as $config_value) { $config_values[$config_value['value']] = $config_value['attr']['translate']; } foreach ($this->tm_instance->settings[$this->index_ro] as $key => $translation_option) { if (!isset($config_values[$key])) { unset($this->tm_instance->settings[$this->index_ro][$key]); } } $this->tm_instance->save_settings(); } }
function icl_get_blog_users_not_translators() { $translator_drop_down_options = array(); $nonce = filter_input(INPUT_POST, 'get_users_not_trans_nonce'); if (!wp_verify_nonce($nonce, 'get_users_not_trans_nonce')) { die('Wrong Nonce'); } $blog_users_nt = TranslationManagement::get_blog_not_translators(); foreach ((array) $blog_users_nt as $u) { $label = $u->display_name . ' (' . $u->user_login . ')'; $value = esc_attr($u->display_name); $translator_drop_down_options[] = array('label' => $label, 'value' => $value, 'id' => $u->ID); } wp_send_json_success($translator_drop_down_options); }
/** * Sends all jobs from basket in batch mode to translation proxy * * @param string $basket_name * @param array $batch * @param array $translators * * @return bool false in case of errors (read from TranslationManagement::get_messages('error') to get errors details) */ private function send_all_jobs(array $batch, array $translators, $basket_name) { $basket_name_saved = $this->basket->get_name(); $basket_name = $basket_name_saved ? $basket_name_saved : $basket_name; if ($basket_name) { $this->basket->set_name($basket_name); } $valid_jobs = $this->get_valid_jobs_from_basket($batch); $this->basket->set_remote_target_languages($this->generate_remote_target_langs($translators, $valid_jobs)); $basket_items_types = $this->basket->get_item_types(); foreach ($basket_items_types as $item_type_name => $item_type) { $type_basket_items = isset($valid_jobs[$item_type_name]) ? $valid_jobs[$item_type_name] : array(); do_action('wpml_tm_send_' . $item_type_name . '_jobs', $item_type_name, $item_type, $type_basket_items, $translators, $basket_name); } // check if there were no errors return !$this->tm_instance->messages_by_type('error'); }
function icl_get_job_original_field_content() { global $iclTranslationManagement; $error_msg = false; $job_id = false; $nonce = filter_input(INPUT_POST, 'tm_editor_copy_nonce'); if (!wp_verify_nonce($nonce, 'icl_copy_from_original_nonce')) { die('Wrong Nonce'); } $request_post_tm_editor_job_id = filter_input(INPUT_POST, 'tm_editor_job_id', FILTER_SANITIZE_NUMBER_INT, FILTER_NULL_ON_FAILURE); $request_post_tm_editor_field_id = filter_input(INPUT_POST, 'tm_editor_job_field'); if ($request_post_tm_editor_job_id) { $job_id = $request_post_tm_editor_job_id; } else { $error_msg = "No job id provided."; } if (!$error_msg && $request_post_tm_editor_job_id) { $field = $request_post_tm_editor_field_id; } else { $error_msg = "No field provided."; } if (!$error_msg && $job_id && isset($field)) { $job = $iclTranslationManagement->get_translation_job($job_id); if (isset($job->elements)) { foreach ($job->elements as $element) { if (sanitize_title($element->field_type) === $field) { // if we find a field by that name we need to decode its contents according to its format $field_contents = TranslationManagement::decode_field_data($element->field_data, $element->field_format); wp_send_json_success($field_contents); } } } elseif (!$job) { $error_msg = __("No translation job found: it might have been just cancelled.", 'wpml-translation-management'); } else { $error_msg = __("No fields found in this translation job.", 'wpml-translation-management'); } } if (!$error_msg) { $error_msg = __("No such field found in the job.", 'wpml-translation-management'); } wp_send_json_error($error_msg); }
function icl_get_job_original_field_content() { global $iclTranslationManagement; $error_msg = false; $job_id = false; if (isset($_POST['tm_editor_job_id'])) { $job_id = $_POST['tm_editor_job_id']; } else { $error_msg = "No job id provided."; } if (!$error_msg && isset($_POST['tm_editor_job_id'])) { $field = $_POST['tm_editor_job_field']; } else { $error_msg = "No field provided."; } if (!$error_msg && $job_id && isset($field)) { $job = $iclTranslationManagement->get_translation_job($job_id); if (isset($job->elements)) { foreach ($job->elements as $element) { if (sanitize_title($element->field_type) == $field) { // if we find a field by that name we need to decode its contents according to its format $field_contents = TranslationManagement::decode_field_data($element->field_data, $element->field_format); wp_send_json_success($field_contents); } } } elseif (!$job) { $error_msg = _("No translation job found: it might have been just cancelled.", 'wpml-translation-management'); } else { $error_msg = _("No fields found in this translation job.", 'wpml-translation-management'); } } if (!$error_msg) { $error_msg = _("No such field found in the job.", 'wpml-translation-management'); } wp_send_json_error($error_msg); }
public function new_job_notification_mail($job_id) { global $iclTranslationManagement, $sitepress, $wpdb; $job = $iclTranslationManagement->get_translation_job(array($job_id)); if (isset($job->language_code)) { $translators = TranslationManagement::get_blog_translators(array('to' => $job->language_code)); } else { $translators = array(); } $edit_url = apply_filters('icl_job_edit_url', admin_url('admin.php?page=' . WPML_TM_FOLDER . '/menu/translations-queue.php&job_id=' . $job_id), $job_id); foreach ($translators as $t) { if (isset($job->manager_id) && isset($t->ID) && $job->manager_id == $t->ID) { continue; } if (!isset($job->source_language_code) || !isset($job->language_code) || !isset($t->language_pairs) || !isset($t->language_pairs[$job->source_language_code][$job->language_code])) { continue; } // get current user admin language $user_language = $sitepress->get_user_admin_language($t->ID); // override locale $sitepress->switch_locale($user_language); list($lang_from, $lang_to) = $this->get_lang_to_from($job, $user_language); $post_link = $iclTranslationManagement->tm_post_permalink($job->original_doc_id); if ($post_link != "") { $post_link = sprintf(__("\nView the original document in %s here: %s\n", 'sitepress'), $lang_from, $post_link); } $mail['to'] = $t->display_name . ' <' . $t->user_email . '>'; //$mail['to'] = $t->user_email; $mail['subject'] = sprintf(__('New translation job from %s', 'sitepress'), get_bloginfo('name')); $mail['body'] = sprintf(__("New job available from %s to %s.\n%s\nStart editing: %s", 'sitepress'), $lang_from, $lang_to, $post_link, $edit_url); $mail['type'] = 'translator'; $this->enqueue_mail($mail, $user_language); //restore locale $sitepress->switch_locale(); } }
function save_post_translation($translation_id, $translation) { global $wpdb, $sitepress_settings, $sitepress, $wp_taxonomies, $icl_adjust_id_url_filter_off; $icl_adjust_id_url_filter_off = true; $taxonomies = array_diff(array_keys((array) $wp_taxonomies), array('post_tag', 'category')); $tinfo = $wpdb->get_row($wpdb->prepare("\r\n SELECT * FROM {$wpdb->prefix}icl_translations tr\r\n JOIN {$wpdb->prefix}icl_translation_status ts ON ts.translation_id = tr.translation_id\r\n WHERE tr.translation_id=%d", $translation_id)); $lang_code = $tinfo->language_code; $trid = $tinfo->trid; $original_post_details = $wpdb->get_row("\r\n SELECT p.post_author, p.post_type, p.post_status, p.comment_status, p.ping_status, p.post_parent, p.menu_order, p.post_date, t.language_code\r\n FROM {$wpdb->prefix}icl_translations t \r\n JOIN {$wpdb->posts} p ON t.element_id = p.ID AND CONCAT('post_',p.post_type) = t.element_type\r\n WHERE trid='{$trid}' AND p.ID = '{$translation['original_id']}'\r\n "); //is the original post a sticky post? remove_filter('option_sticky_posts', array($sitepress, 'option_sticky_posts')); // remove filter used to get language relevant stickies. get them all $sticky_posts = get_option('sticky_posts'); $is_original_sticky = $original_post_details->post_type == 'post' && in_array($translation['original_id'], $sticky_posts); $this->_content_fix_image_paths_in_body($translation); $this->_content_fix_relative_link_paths_in_body($translation); $this->_content_decode_shortcodes($translation); // deal with tags if (isset($translation['tags'])) { $translated_tags = $translation['tags']; $translated_tag_ids = explode(',', $translation['tag_ids']); foreach ($translated_tags as $k => $v) { $tag_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$translated_tag_ids[$k]}' AND element_type='tax_post_tag'"); // before adding the new term make sure that another tag with the same name doesn't exist. If it does append @lang // same term name exists in a different language? $term_different_language = $wpdb->get_var("\r\n SELECT tm.term_id \r\n FROM {$wpdb->term_taxonomy} tx\r\n JOIN {$wpdb->terms} tm ON tx.term_id = tm.term_id \r\n JOIN {$wpdb->prefix}icl_translations tr ON tx.term_taxonomy_id = tr.element_id\r\n WHERE tm.name='" . $wpdb->escape($v) . "' AND tr.element_type LIKE 'tax\\_%' AND tr.language_code <> '{$lang_code}'\r\n "); if ($term_different_language) { $v .= ' @' . $lang_code; } //tag exists? (in the current language) $etag = get_term_by('name', htmlspecialchars($v), 'post_tag'); if (!$etag) { $etag = get_term_by('name', htmlspecialchars($v) . ' @' . $lang_code, 'post_tag'); } if (!$etag) { $tmp = wp_insert_term($v, 'post_tag'); if (!is_wp_error($tmp) && isset($tmp['term_taxonomy_id'])) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tag_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_post_tag', 'element_id' => $tmp['term_taxonomy_id'])); } } else { $term_taxonomy_id = $etag->term_taxonomy_id; // check whether we have an orphan translation - the same trid and language but a different element id $__translation_id = $wpdb->get_var("\r\n SELECT translation_id FROM {$wpdb->prefix}icl_translations \r\n WHERE trid = '{$tag_trid}' \r\n AND language_code = '{$lang_code}' \r\n AND element_id <> '{$term_taxonomy_id}'\r\n "); if ($__translation_id) { $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id={$__translation_id}"); } $tag_translation_id = $wpdb->get_var("SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE element_id={$term_taxonomy_id} AND element_type='tax_post_tag'"); if ($tag_translation_id) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tag_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_post_tag', 'translation_id' => $tag_translation_id)); } else { $wpdb->insert($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tag_trid, 'element_type' => 'tax_post_tag', 'element_id' => $term_taxonomy_id, 'source_language_code' => $original_post_details->language_code)); } } } } $original_post_tags = array(); foreach (wp_get_object_terms($translation['original_id'], 'post_tag') as $t) { $original_post_tags[] = $t->term_taxonomy_id; } if ($original_post_tags) { $tag_trids = $wpdb->get_col("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_post_tag' AND element_id IN (" . join(',', $original_post_tags) . ")"); if (!empty($tag_trids)) { $tag_tr_tts = $wpdb->get_col("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_post_tag' AND language_code='{$lang_code}' AND trid IN (" . join(',', $tag_trids) . ")"); } if (!empty($tag_tr_tts)) { $translated_tags = $wpdb->get_col("SELECT t.name FROM {$wpdb->terms} t JOIN {$wpdb->term_taxonomy} tx ON tx.term_id = t.term_id WHERE tx.taxonomy='post_tag' AND tx.term_taxonomy_id IN (" . join(',', $tag_tr_tts) . ")"); } } // deal with categories if (isset($translation['categories'])) { $translated_cats = $translation['categories']; $translated_cats_ids = explode(',', $translation['category_ids']); foreach ($translated_cats as $k => $v) { //$v = trim(str_replace('<p>', '', $v)); $cat_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$translated_cats_ids[$k]}' AND element_type='tax_category'"); // before adding the new term make sure that another tag with the same name doesn't exist. If it does append @lang // same term name exists in a different language? $term_different_language = $wpdb->get_var("\r\n SELECT tm.term_id \r\n FROM {$wpdb->term_taxonomy} tx\r\n JOIN {$wpdb->terms} tm ON tx.term_id = tm.term_id \r\n JOIN {$wpdb->prefix}icl_translations tr ON tx.term_taxonomy_id = tr.element_id\r\n WHERE tm.name='" . $wpdb->escape($v) . "' AND tr.element_type LIKE 'tax\\_%' AND tr.language_code <> '{$lang_code}'\r\n "); if ($term_different_language) { $v .= ' @' . $lang_code; } //cat exists? $ecat = get_term_by('name', htmlspecialchars($v), 'category'); if (!$ecat) { $ecat = get_term_by('name', htmlspecialchars($v) . ' @' . $lang_code, 'category'); } if (!$ecat) { // get original category parent id $original_category_parent_id = $wpdb->get_var($wpdb->prepare("SELECT parent FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $translated_cats_ids[$k])); if ($original_category_parent_id) { $_op_tax_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_id=%d", $original_category_parent_id)); $_op_trid = $wpdb->get_var($wpdb->prepare("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_category' AND element_id=%d", $_op_tax_id)); // get id of the translated category parent $_tp_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE language_code='{$lang_code}' AND trid=%d", $_op_trid)); if ($_tp_tax_id) { $category_parent_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_taxonomy_id=%d", $_tp_tax_id)); } else { $category_parent_id = 0; } } else { $category_parent_id = 0; } $tmp = wp_insert_term($v, 'category', array('parent' => $category_parent_id)); if (!is_wp_error($tmp) && isset($tmp['term_taxonomy_id'])) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $cat_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_category', 'element_id' => $tmp['term_taxonomy_id'])); // if this is a parent category, make sure that nesting is correct for all translations $orig_cat_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid=%d AND source_language_code IS NULL", $cat_trid)); $orig_cat_term_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d AND taxonomy='category'", $orig_cat_tax_id)); $orig_cat_children = $wpdb->get_col($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE parent=%d", $orig_cat_term_id)); if (!empty($orig_cat_children)) { foreach ($orig_cat_children as $ch) { $_tr_child = icl_object_id($ch, 'category', false, $lang_code); if ($_tr_child) { $wpdb->update($wpdb->term_taxonomy, array('parent' => $tmp['term_id']), array('taxonomy' => 'category', 'term_id' => $_tr_child)); } } } delete_option('category_children'); } } else { $term_taxonomy_id = $ecat->term_taxonomy_id; // check whether we have an orphan translation - the same trid and language but a different element id $__translation_id = $wpdb->get_var("\r\n SELECT translation_id FROM {$wpdb->prefix}icl_translations \r\n WHERE trid = '{$cat_trid}' \r\n AND language_code = '{$lang_code}' \r\n AND element_id <> '{$term_taxonomy_id}'\r\n "); if ($__translation_id) { $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id={$__translation_id}"); } $cat_translation_id = $wpdb->get_var("SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE element_id={$term_taxonomy_id} AND element_type='tax_category'"); if ($cat_translation_id) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $cat_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_category', 'translation_id' => $cat_translation_id)); } else { $wpdb->insert($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $cat_trid, 'element_type' => 'tax_category', 'element_id' => $term_taxonomy_id, 'source_language_code' => $original_post_details->language_code)); } } } } $original_post_cats = array(); foreach (wp_get_object_terms($translation['original_id'], 'category') as $t) { $original_post_cats[] = $t->term_taxonomy_id; } if ($original_post_cats) { $cat_trids = $wpdb->get_col("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_category' AND element_id IN (" . join(',', $original_post_cats) . ")"); if (!empty($cat_trids)) { $cat_tr_tts = $wpdb->get_col("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_category' AND language_code='{$lang_code}' AND trid IN (" . join(',', $cat_trids) . ")"); } if (!empty($cat_tr_tts)) { $translated_cats_ids = $wpdb->get_col("SELECT t.term_id FROM {$wpdb->terms} t JOIN {$wpdb->term_taxonomy} tx ON tx.term_id = t.term_id WHERE tx.taxonomy='category' AND tx.term_taxonomy_id IN (" . join(',', $cat_tr_tts) . ")"); } } // deal with custom taxonomies if (!empty($sitepress_settings['taxonomies_sync_option'])) { foreach ($sitepress_settings['taxonomies_sync_option'] as $taxonomy => $value) { if ($value == 1 && isset($translation[$taxonomy])) { $translated_taxs[$taxonomy] = $translation[$taxonomy]; $translated_tax_ids[$taxonomy] = explode(',', $translation[$taxonomy . '_ids']); foreach ($translated_taxs[$taxonomy] as $k => $v) { $tax_trid = $wpdb->get_var("\r\n SELECT trid FROM {$wpdb->prefix}icl_translations \r\n WHERE element_id='{$translated_tax_ids[$taxonomy][$k]}' AND element_type='tax_{$taxonomy}'"); // before adding the new term make sure that another tag with the same name doesn't exist. If it does append @lang // same term name exists in a different language? $term_different_language = $wpdb->get_var("\r\n SELECT tm.term_id \r\n FROM {$wpdb->term_taxonomy} tx\r\n JOIN {$wpdb->terms} tm ON tx.term_id = tm.term_id \r\n JOIN {$wpdb->prefix}icl_translations tr ON tx.term_taxonomy_id = tr.element_id\r\n WHERE tm.name='" . $wpdb->escape($v) . "' AND tr.element_type LIKE 'tax\\_%' AND tr.language_code <> '{$lang_code}'\r\n "); if ($term_different_language) { $v .= ' @' . $lang_code; } //tax exists? (in the current language) $etag = get_term_by('name', htmlspecialchars($v), $taxonomy); if (!$etag) { $etag = get_term_by('name', htmlspecialchars($v) . ' @' . $lang_code, $taxonomy); } if (!$etag) { // get original category parent id $original_t_parent_id = $wpdb->get_var($wpdb->prepare("SELECT parent FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $translated_tax_ids[$taxonomy][$k])); if ($original_t_parent_id) { $_op_tax_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_id=%d", $original_t_parent_id)); $_op_trid = $wpdb->get_var($wpdb->prepare("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_category' AND element_id=%d", $_op_tax_id)); // get id of the translated category parent $_tp_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE language_code='{$lang_code}' AND trid=%d", $_op_trid)); if ($_tp_tax_id) { $t_parent_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_taxonomy_id=%d", $_tp_tax_id)); } else { $t_parent_id = 0; } } else { $t_parent_id = 0; } $tmp = wp_insert_term($v, $taxonomy); if (!is_wp_error($tmp) && isset($tmp['term_taxonomy_id'])) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tax_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_' . $taxonomy, 'element_id' => $tmp['term_taxonomy_id'])); // if this is a parent category, make sure that nesting is correct for all translations $orig_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid=%d AND source_language_code IS NULL", $tax_trid)); $orig_term_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d AND taxonomy='{$taxonomy}'", $orig_tax_id)); $orig_tax_children = $wpdb->get_col($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE parent=%d", $orig_term_id)); if (!empty($orig_tax_children)) { foreach ($orig_tax_children as $ch) { $_tr_child = icl_object_id($ch, $taxonomy, false, $lang_code); if ($_tr_child) { $wpdb->update($wpdb->term_taxonomy, array('parent' => $tmp['term_id']), array('taxonomy' => $taxonomy, 'term_id' => $_tr_child)); } } } delete_option($taxonomy . '_children'); } } else { $term_taxonomy_id = $etag->term_taxonomy_id; // check whether we have an orphan translation - the same trid and language but a different element id $__translation_id = $wpdb->get_var("\r\n SELECT translation_id FROM {$wpdb->prefix}icl_translations \r\n WHERE trid = '{$tax_trid}' \r\n AND language_code = '{$lang_code}' \r\n AND element_id <> '{$term_taxonomy_id}'\r\n "); if ($__translation_id) { $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id={$__translation_id}"); } $tax_translation_id = $wpdb->get_var("\r\n SELECT translation_id FROM {$wpdb->prefix}icl_translations \r\n WHERE element_id={$term_taxonomy_id} AND element_type='tax_{$taxonomy}'"); if ($tax_translation_id) { $wpdb->update($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tax_trid, 'source_language_code' => $original_post_details->language_code), array('element_type' => 'tax_' . $taxonomy, 'translation_id' => $tax_translation_id)); } else { $wpdb->insert($wpdb->prefix . 'icl_translations', array('language_code' => $lang_code, 'trid' => $tax_trid, 'element_type' => 'tax_' . $taxonomy, 'element_id' => $term_taxonomy_id, 'source_language_code' => $original_post_details->language_code)); } } } } $oterms = wp_get_object_terms($translation['original_id'], $taxonomy); if (!is_wp_error($oterms)) { foreach ($oterms as $t) { $original_post_taxs[$taxonomy][] = $t->term_taxonomy_id; } } if (!empty($original_post_taxs[$taxonomy])) { $tax_trids = $wpdb->get_col("SELECT trid FROM {$wpdb->prefix}icl_translations \r\n WHERE element_type='tax_{$taxonomy}' AND element_id IN (" . join(',', $original_post_taxs[$taxonomy]) . ")"); if (!empty($tax_trids)) { $tax_tr_tts = $wpdb->get_col("SELECT element_id FROM {$wpdb->prefix}icl_translations \r\n WHERE element_type='tax_{$taxonomy}' AND language_code='{$lang_code}' AND trid IN (" . join(',', $tax_trids) . ")"); } if (!empty($tax_tr_tts)) { if ($wp_taxonomies[$taxonomy]->hierarchical) { $translated_tax_ids[$taxonomy] = $wpdb->get_col("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id IN (" . join(',', $tax_tr_tts) . ")"); } else { $translated_taxs[$taxonomy] = $wpdb->get_col("SELECT t.name FROM {$wpdb->terms} t \r\n JOIN {$wpdb->term_taxonomy} tx ON tx.term_id = t.term_id \r\n WHERE tx.taxonomy='{$taxonomy}' AND tx.term_taxonomy_id IN (" . join(',', $tax_tr_tts) . ")"); } } } } } // handle the page parent and set it to the translated parent if we have one. if ($original_post_details->post_parent) { $post_parent_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='post_{$original_post_details->post_type}' AND element_id='{$original_post_details->post_parent}'"); if ($post_parent_trid) { $parent_id = $wpdb->get_var("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='post_{$original_post_details->post_type}' AND trid='{$post_parent_trid}' AND language_code='{$lang_code}'"); } } // determine post id based on trid $post_id = $tinfo->element_id; if ($post_id) { // see if the post really exists - make sure it wasn't deleted while the plugin was if (!$wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE ID={$post_id}")) { $is_update = false; $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE element_type='post_{$original_post_details->post_type}' AND element_id={$post_id}"); } else { $is_update = true; $postarr['ID'] = $_POST['post_ID'] = $post_id; } } else { $is_update = false; } $postarr['post_title'] = $translation['title']; if ($sitepress_settings['translated_document_page_url'] == 'translate' && isset($translation['URL'])) { $postarr['post_name'] = $translation['URL']; } $postarr['post_content'] = $translation['body']; if (isset($translation['excerpt']) && $translation['excerpt'] != "") { $postarr['post_excerpt'] = $translation['excerpt']; } if (@is_array($translated_tags)) { $postarr['tags_input'] = join(',', (array) $translated_tags); } if (@is_array($translated_taxs)) { foreach ($translated_taxs as $taxonomy => $values) { $postarr['tax_input'][$taxonomy] = join(',', (array) $values); } } if (@is_array($translated_tax_ids)) { $postarr['tax_input'] = $translated_tax_ids; } if (isset($translated_cats_ids)) { $postarr['post_category'] = $translated_cats_ids; } $postarr['post_author'] = $original_post_details->post_author; $postarr['post_type'] = $original_post_details->post_type; if ($sitepress_settings['sync_comment_status']) { $postarr['comment_status'] = $original_post_details->comment_status; } if ($sitepress_settings['sync_ping_status']) { $postarr['ping_status'] = $original_post_details->ping_status; } if ($sitepress_settings['sync_page_ordering']) { $postarr['menu_order'] = $original_post_details->menu_order; } if ($sitepress_settings['sync_private_flag'] && $original_post_details->post_status == 'private') { $postarr['post_status'] = 'private'; } if (!$is_update) { $postarr['post_status'] = !$sitepress_settings['translated_document_status'] ? 'draft' : $original_post_details->post_status; } else { // set post_status to the current post status. $postarr['post_status'] = $wpdb->get_var("SELECT post_status FROM {$wpdb->prefix}posts WHERE ID = " . $post_id); } if ($sitepress_settings['sync_post_date']) { $postarr['post_date'] = $original_post_details->post_date; } if (isset($parent_id) && $sitepress_settings['sync_page_parent']) { $_POST['post_parent'] = $postarr['post_parent'] = $parent_id; $_POST['parent_id'] = $postarr['parent_id'] = $parent_id; } if ($is_update) { $postarr['post_name'] = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM {$wpdb->posts} WHERE ID=%d", $post_id)); } $_POST['trid'] = $trid; $_POST['lang'] = $lang_code; $_POST['skip_sitepress_actions'] = true; global $wp_rewrite; if (!isset($wp_rewrite)) { $wp_rewrite = new WP_Rewrite(); } kses_remove_filters(); $postarr = apply_filters('icl_pre_save_pro_translation', $postarr); $new_post_id = wp_insert_post($postarr); do_action('icl_pro_translation_saved', $new_post_id); // associate custom taxonomies by hand if (!empty($postarr['tax_input'])) { foreach ($postarr['tax_input'] as $taxonomy => $tags) { if ($wp_taxonomies[$taxonomy]->hierarchical) { wp_set_post_terms($new_post_id, $tags, $taxonomy); } else { wp_set_post_terms($new_post_id, $translated_taxs[$taxonomy], $taxonomy); } } } // set stickiness if ($is_original_sticky && $sitepress_settings['sync_sticky_flag']) { stick_post($new_post_id); } else { if ($original_post_details->post_type == 'post' && $is_update) { unstick_post($new_post_id); //just in case - if this is an update and the original post stckiness has changed since the post was sent to translation } } foreach ((array) $sitepress_settings['translation-management']['custom_fields_translation'] as $cf => $op) { if ($op == 1) { $sitepress->_sync_custom_field($translation['original_id'], $new_post_id, $cf); } elseif ($op == 2 && isset($translation['field-' . $cf])) { $field_translation = $translation['field-' . $cf]; $field_type = $translation['field-' . $cf . '-type']; if ($field_type == 'custom_field') { $field_translation = str_replace('�A;', "\n", $field_translation); // always decode html entities eg decode & to & $field_translation = html_entity_decode($field_translation); update_post_meta($new_post_id, $cf, $field_translation); } } } // set specific custom fields $copied_custom_fields = array('_top_nav_excluded', '_cms_nav_minihome'); foreach ($copied_custom_fields as $ccf) { $val = get_post_meta($translation['original_id'], $ccf, true); update_post_meta($new_post_id, $ccf, $val); } // sync _wp_page_template if ($sitepress_settings['sync_page_template']) { $_wp_page_template = get_post_meta($translation['original_id'], '_wp_page_template', true); update_post_meta($new_post_id, '_wp_page_template', $_wp_page_template); } if (!$new_post_id) { return false; } if (!$is_update) { $wpdb->update($wpdb->prefix . 'icl_translations', array('element_id' => $new_post_id), array('translation_id' => $translation_id)); } update_post_meta($new_post_id, '_icl_translation', 1); TranslationManagement::set_page_url($new_post_id); global $iclTranslationManagement; $ts = array('status' => ICL_TM_COMPLETE, 'needs_update' => 0, 'translation_id' => $translation_id); $translator_id = $wpdb->get_var($wpdb->prepare("SELECT translator_id FROM {$wpdb->prefix}icl_translation_status WHERE translation_id=%d", $translation_id)); if (!$translator_id) { foreach ($sitepress_settings['icl_lang_status'] as $lpair) { if ($lpair['from'] == $original_post_details->language_code && $lpair['to'] == $lang_code && isset($lpair['translators'][0]['id'])) { $ts['translator_id'] = $lpair['translators'][0]['id']; break; } } } // update translation status $iclTranslationManagement->update_translation_status($ts); // add new translation job //$translation_package = $iclTranslationManagement->create_translation_package(get_post($translation['original_id'])); //$job_id = $iclTranslationManagement->add_translation_job($tinfo->rid, $tinfo->translator_id, $translation_package); $job_id = $iclTranslationManagement->get_translation_job_id($trid, $lang_code); // save the translation $iclTranslationManagement->mark_job_done($job_id); $parts = explode('_', $translation['original_id']); if ($parts[0] != 'external') { $iclTranslationManagement->save_job_fields_from_post($job_id, get_post($new_post_id)); $this->_content_fix_links_to_translated_content($new_post_id, $lang_code, "post_{$original_post_details->post_type}"); if (function_exists('icl_st_fix_links_in_strings')) { icl_st_fix_links_in_strings($new_post_id); } // Now try to fix links in other translated content that may link to this post. $sql = "SELECT\r\n tr.element_id\r\n FROM\r\n {$wpdb->prefix}icl_translations tr\r\n JOIN\r\n {$wpdb->prefix}icl_translation_status ts\r\n ON\r\n tr.translation_id = ts.translation_id\r\n WHERE\r\n ts.links_fixed = 0 AND tr.element_type = 'post_{$original_post_details->post_type}' AND tr.language_code = '{$lang_code}' AND tr.element_id IS NOT NULL"; $needs_fixing = $wpdb->get_results($sql); foreach ($needs_fixing as $id) { if ($id->element_id != $new_post_id) { // fix all except the new_post_id. We have already done this. $this->_content_fix_links_to_translated_content($id->element_id, $lang_code, "post_{$original_post_details->post_type}"); } } // if this is a parent page then make sure it's children point to this. $this->fix_translated_children($translation['original_id'], $new_post_id, $lang_code); } return true; }
/** * Build or update duplicated posts from a master post. * * @param string $master_post_id The ID of the post to duplicate from. Master post doesn't need to be in the default language. * * @uses SitePress * @uses TranslationManagement */ function icl_makes_duplicates($master_post_id) { $post = get_post($master_post_id); $post_type = $post->post_type; if ($post->post_status == 'auto-draft' || $post->post_type == 'revision') { return; } global $sitepress, $iclTranslationManagement; if (!isset($iclTranslationManagement)) { $iclTranslationManagement = new TranslationManagement(); } if ($sitepress->is_translated_post_type($post_type)) { $iclTranslationManagement->make_duplicates_all($master_post_id); } }
/** * Add/edit local translator form * * @param string $action add|edit * @param int|object $selected_translator * * @global object $sitepress * @return mixed */ private function icl_local_edit_translator_form($action = 'add', $selected_translator = 0) { global $sitepress; $blog_users_nt = TranslationManagement::get_blog_not_translators(); $output = ''; $return['name'] = __('Local', 'wpml-translation-management'); $return['description'] = __('Your own translators', 'wpml-translation-management'); if ($action == 'add' && empty($blog_users_nt)) { $alert_message = '<p>'; $alert_message .= __('All WordPress users are already translators. To add more translators, first create accounts for them.', 'wpml-translation-management'); $alert_message .= '</p>'; $return['content'] = ''; $return['messages'] = ICL_AdminNotifier::display_instant_message($alert_message, 'information', false, true); return $return; } $output .= '<div id="icl_tm_add_user_errors"> <span class="icl_tm_no_to">' . __('Select user.', 'wpml-translation-management') . '</span> </div> <input type="hidden" name="icl_tm_action" value="' . $action . '_translator" />' . wp_nonce_field($action . '_translator', $action . '_translator_nonce', true, false); if (!$selected_translator) { $output .= '<input type="hidden" id="icl_tm_selected_user" name="user_id" />'; $output .= '<input type="text" id="icl_quick_src_users" placeholder="' . esc_attr__('search', 'wpml-translation-management') . '" />'; $output .= ' <span id="icl_user_src_nf"></span>'; $output .= '<img style="display:none;margin-left:3px;" src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" class="waiting" alt="" />'; $output .= '<p>' . __('To add translators, they must first have accounts in WordPress. Translators can have any editing privileges, including subscriber.') . '</p>'; } else { $output .= '<span class="updated fade" style="padding:4px">' . sprintf(__('Editing language pairs for <strong>%s</strong>', 'wpml-translation-management'), esc_html($selected_translator->display_name) . ' (' . $selected_translator->user_login . ')') . '</span>'; $output .= '<input type="hidden" name="user_id" value="' . $selected_translator->ID . '" />'; } if ($selected_translator) { $output .= '<br /> <div class="icl_tm_lang_pairs"'; if ($selected_translator) { $output .= ' style="display:block"'; } $output .= '> <ul>'; $languages = $sitepress->get_active_languages(); foreach ($languages as $from_lang) { $lang_from_selected = false; if ($selected_translator && 0 < @count($selected_translator->language_pairs[$from_lang['code']])) { $lang_from_selected = true; } $output .= '<li class="js-icl-tm-lang-from'; if ($lang_from_selected) { $output .= ' js-lang-from-selected'; } $output .= '">'; $output .= '<label><input class="icl_tm_from_lang" type="checkbox"'; if ($lang_from_selected) { $output .= ' checked="checked"'; } $output .= ' /> '; $output .= sprintf(__('From %s', 'wpml-translation-management'), $from_lang['display_name']) . '</label> <div class="icl_tm_lang_pairs_to"'; if ($selected_translator && 0 < @count($selected_translator->language_pairs[$from_lang['code']])) { $output .= ' style="display:block"'; } $output .= '> <small>' . __('to', 'wpml-translation-management') . '</small> <ul>'; foreach ($sitepress->get_active_languages() as $to_lang) { if ($from_lang['code'] == $to_lang['code']) { continue; } $lang_selected = false; if ($selected_translator->ID && isset($selected_translator->language_pairs[$from_lang['code']][$to_lang['code']])) { $lang_selected = true; } $output .= '<li class="js-icl-tm-lang-pair'; if ($lang_selected) { $output .= ' js-lang-pair-selected'; } $output .= '"> <label><input class="icl_tm_to_lang" type="checkbox" name="lang_pairs[' . $from_lang['code'] . '][' . $to_lang['code'] . ']" value="1"'; if ($lang_selected) { $output .= ' checked="checked"'; } $output .= ' /> '; $output .= $to_lang['display_name'] . '</label> </li>'; } $output .= '</ul> </div> </li>'; } $output .= '</ul>'; $output .= ' <input class="button-primary" type="submit" value="'; $output .= $selected_translator ? esc_attr(__('Update', 'wpml-translation-management')) : esc_attr(__('Add as translator', 'wpml-translation-management')); $output .= '" /> <input type="submit" value="' . __('Cancel', 'wpml-translation-management') . '" name="cancel" class="button-secondary" onclick="history.go(-1); return false;" />'; } $return['content'] = $output; return $action == 'edit' ? $output : $return; }
function _icl_translation_send_strings_local($string_ids, $target) { global $wpdb, $sitepress_settings; static $site_translators; $site_translators = TranslationManagement::get_blog_translators(); $mkey = $wpdb->prefix . 'strings_notification'; $lkey = $wpdb->prefix . 'language_pairs'; $slang =& $sitepress_settings['st']['strings_language']; foreach ($string_ids as $string_id) { $added = icl_add_string_translation($string_id, $target, NULL, ICL_STRING_TRANSLATION_WAITING_FOR_TRANSLATOR); if ($added) { foreach ($site_translators as $key => $st) { $ulangs = isset($st->{$lkey}) ? $st->{$lkey} : false; if (!empty($ulangs) && !empty($ulangs[$slang][$target])) { $enot = isset($st->{$mkey}) ? $st->{$mkey} : false; if (empty($enot[$sitepress_settings['st']['strings_language']][$target])) { _icl_st_translator_notification($st, $sitepress_settings['st']['strings_language'], $target); $enot[$sitepress_settings['st']['strings_language']][$target] = 1; $site_translators[$key]->{$mkey} = $enot; update_option($wpdb->prefix . 'icl_translators_cached', $site_translators); //printf("Notify %d for %s -> %s <br />", $st->ID, $sitepress_settings['st']['strings_language'], $target); } else { //printf("Already notified %d for %s -> %s <br />", $st->ID, $sitepress_settings['st']['strings_language'], $target); } } } } } return 1; }
?> " /> <?php if (!$element->field_finished && !empty($job->prev_version)) { ?> <?php $prev_value = ''; foreach ($job->prev_version->elements as $pel) { if ($element->field_type == $pel->field_type) { $prev_value = TranslationManagement::decode_field_data($pel->field_data, $pel->field_format); } } if ($element->field_format != 'csv_base64') { $diff = wp_text_diff($prev_value, TranslationManagement::decode_field_data($element->field_data, $element->field_format)); } if (!empty($diff)) { ?> <p><a href="#" onclick="jQuery(this).parent().next().slideToggle();return false;"><?php _e('Show Changes', 'sitepress'); ?> </a></p> <div class="icl_tm_diff"> <?php echo $diff; ?> </div> <?php } ?>
public static function get_job_status_string($status_id, $needs_update = false) { $job_status_text = TranslationManagement::status2text($status_id); if ($needs_update) { $job_status_text .= __(' - (needs update)', 'wpml-translation-management'); } return $job_status_text; }
?> " name="icl_translation_id[]" /> <?php } else { ?> <?php } ?> </td> <td width="60"><?php echo $job->job_id; ?> </td> <td><?php echo TranslationManagement::tm_post_link($job->original_doc_id, $job->post_title); ?> </td> <td><?php echo $job->lang_text; ?> </td> <td><span id="icl_tj_job_status_<?php echo $job->job_id; ?> "><?php echo $iclTranslationManagement->status2text($job->status); ?> </span> <?php if ($job->needs_update) {
?> > <td scope="row"> <input type="checkbox" value="<?php echo $doc->post_id; ?> " name="iclpost[]" <?php if (isset($_GET['post_id']) || is_array($icl_selected_posts) && in_array($doc->post_id, $icl_selected_posts)) { echo 'checked="checked"'; } ?> /> </td> <td scope="row" class="post-title column-title"> <?php echo TranslationManagement::tm_post_link($doc->post_id); ?> <?php $wc = $iclTranslationManagement->estimate_word_count($doc, $icl_translation_filter['from_lang']); $wc += $iclTranslationManagement->estimate_custom_field_word_count($doc->post_id, $icl_translation_filter['from_lang']); ?> <span id="icl-cw-<?php echo $doc->post_id; ?> " style="display:none"><?php echo $wc; $wctotal += $wc; ?> </span> <span class="icl-tr-details"> </span> <div class="icl_post_note" id="icl_post_note_<?php
public function display($odd_row) { global $iclTranslationManagement; $alternate = $odd_row ? 'class="alternate"' : ''; $current_document = $this->data; $count = $this->get_word_count(); $post_actions = array(); $post_actions_link = ""; $element_type = $this->get_type_prefix(); $check_field_name = $element_type; $post_title = $this->get_title(); $post_view_link = ''; $post_edit_link = ''; if (!$this->is_external_type()) { $post_view_link = TranslationManagement::tm_post_link($current_document->ID, __('View', 'wpml-translation-management'), true); $post_edit_link = TranslationManagement::tm_post_link($current_document->ID, __('Edit', 'wpml-translation-management'), true, true, true, true); } $post_view_link = apply_filters('wpml_document_view_item_link', $post_view_link, __('View', 'wpml-translation-management'), $current_document, $element_type, $this->get_type()); if ($post_view_link) { $post_actions[] = "<span class='view'>" . $post_view_link . "</span>"; } $post_edit_link = apply_filters('wpml_document_edit_item_link', $post_edit_link, __('Edit', 'wpml-translation-management'), $current_document, $element_type, $this->get_type()); if ($post_edit_link) { $post_actions[] = "<span class='edit'>" . $post_edit_link . "</span>"; } if ($post_actions) { $post_actions_link .= '<div class="row-actions">' . implode(' | ', $post_actions) . '</div>'; } ?> <tr id="row_<?php echo sanitize_html_class($current_document->ID); ?> " data-word_count="<?php echo $count; ?> " <?php echo $alternate; ?> > <td scope="row"> <?php $checked = checked(true, isset($_GET['post_id']) || $this->selected, false); ?> <input type="checkbox" value="<?php echo $current_document->ID; ?> " name="<?php echo $check_field_name; ?> [<?php echo $current_document->ID; ?> ][checked]" <?php echo $checked; ?> /> <input type="hidden" value="<?php echo $element_type; ?> " name="<?php echo $check_field_name; ?> [<?php echo $current_document->ID; ?> ][type]"/> </td> <td scope="row" class="post-title column-title"> <?php echo esc_html($post_title); echo $post_actions_link; ?> <div class="icl_post_note" id="icl_post_note_<?php echo $current_document->ID; ?> "> <?php $note = ''; if (!$current_document->is_translation) { $note = get_post_meta($current_document->ID, '_icl_translator_note', true); $this->note_text = ''; if ($note) { $this->note_text = __('Edit note for the translators', 'wpml-translation-management'); $this->note_icon = 'edit_translation.png'; } else { $this->note_text = __('Add note for the translators', 'wpml-translation-management'); $this->note_icon = 'add_translation.png'; } } ?> <label for="post_note_<?php echo $current_document->ID; ?> "> <?php _e('Note for the translators', 'wpml-translation-management'); ?> </label> <textarea id="post_note_<?php echo $current_document->ID; ?> " rows="5"><?php echo $note; ?> </textarea> <table width="100%"> <tr> <td style="border-bottom:none"> <input type="button" class="icl_tn_clear button" value="<?php _e('Clear', 'wpml-translation-management'); ?> " <?php if (!$note) { ?> disabled="disabled"<?php } ?> /> <input class="icl_tn_post_id" type="hidden" value="<?php echo $current_document->ID; ?> "/> </td> <td align="right" style="border-bottom:none"> <input type="button" class="icl_tn_save button-primary" value="<?php _e('Save', 'wpml-translation-management'); ?> "/> </td> </tr> </table> </div> </td> <td scope="row" class="post-date column-date"> <?php $element_date = $this->get_date(); if ($element_date) { echo date('Y-m-d', strtotime($element_date)); } ?> </td> <td scope="row" class="icl_tn_link" id="icl_tn_link_<?php echo $current_document->ID; ?> "> <?php if (!$current_document->is_translation) { ?> <a title="<?php echo $this->note_text; ?> " href="#"> <img src="<?php echo WPML_TM_URL; ?> /res/img/<?php echo $this->note_icon; ?> " width="16" height="16"/> </a> <?php } ?> </td> <td scope="row" class="manage-column column-date"> <?php if (isset($this->post_types[$this->get_type()])) { $custom_post_type_labels = $this->post_types[$this->get_type()]->labels; if ($custom_post_type_labels->singular_name != "") { echo $custom_post_type_labels->singular_name; } else { echo $custom_post_type_labels->name; } } else { echo $this->get_type(); } ?> </td> <td scope="row" class="manage-column column-date"> <?php echo $this->get_general_status(); ?> </td> <td scope="row" class="manage-column column-active-languages"> <?php foreach ($this->active_languages as $code => $lang) { if ($code == $this->data->language_code) { continue; } $status = $this->get_status_in_lang($code); switch ($status) { case ICL_TM_NOT_TRANSLATED: $translation_status_text = esc_attr(__('Not translated', 'wpml-translation-management')); break; case ICL_TM_WAITING_FOR_TRANSLATOR: $translation_status_text = esc_attr(__('Waiting for translator', 'wpml-translation-management')); break; case ICL_TM_IN_BASKET: $translation_status_text = esc_attr(__('In basket', 'wpml-translation-management')); break; case ICL_TM_IN_PROGRESS: $translation_status_text = esc_attr(__('In progress', 'wpml-translation-management')); break; case ICL_TM_DUPLICATE: $translation_status_text = esc_attr(__('Duplicate', 'wpml-translation-management')); break; case ICL_TM_COMPLETE: $translation_status_text = esc_attr(__('Complete', 'wpml-translation-management')); break; case ICL_TM_NEEDS_UPDATE: $translation_status_text = ' - ' . esc_attr(__('needs update', 'wpml-translation-management')); break; default: $translation_status_text = ''; } $status_image_file_name = $iclTranslationManagement->status2img_filename($status, ICL_TM_NEEDS_UPDATE === (int) $status); ?> <span data-document_status="<?php echo $status; ?> " style="padding-top:4px;"> <img title="<?php echo $lang['display_name']; ?> : <?php echo $translation_status_text; ?> " src="<?php echo WPML_TM_URL; ?> /res/img/<?php echo $status_image_file_name; ?> " width="16" height="16" alt="<?php echo $lang['display_name']; ?> : <?php echo $translation_status_text; ?> "/> </span> <?php } ?> </td> </tr> <?php }
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; }
echo $job->lang_text; ?> </td> <td nowrap="nowrap"> <?php if ($job->original_doc_id) { ?> <a class="button-secondary" href="<?php echo apply_filters('icl_job_edit_url', admin_url('admin.php?page=' . WPML_TM_FOLDER . '/menu/translations-queue.php&job_id=' . $job->job_id), $job->job_id); ?> "><?php _e('edit', 'wpml-translation-management'); ?> </a> <?php echo TranslationManagement::tm_post_link($job->original_doc_id, __('View original', 'wpml-translation-management'), true); } ?> </td> <td><?php if ($job->translator_id && $job->status == ICL_TM_WAITING_FOR_TRANSLATOR) { ?> <div class="icl_tj_your_job" title="<?php echo esc_html(__('This job is assigned specifically to you.', 'wpml-translation-management')); ?> ">!</div><?php } ?> </td> <td><?php echo $iclTranslationManagement->status2text($job->status);
echo $doc->post_id; ?> " name="iclpost[]" <?php if (isset($_GET['post_id']) || is_array($icl_selected_posts) && in_array($doc->post_id, $icl_selected_posts)) { echo 'checked="checked"'; } ?> /> </td> <td scope="row" class="post-title column-title"> <?php echo TranslationManagement::tm_post_link($doc->post_id); ?> <?php $wc = TranslationManagement::estimate_word_count($doc, $icl_translation_filter['from_lang']); $wc += TranslationManagement::estimate_custom_field_word_count($doc->post_id, $icl_translation_filter['from_lang']); ?> <span id="icl-cw-<?php echo $doc->post_id; ?> " style="display:none"><?php echo $wc; $wctotal += $wc; ?> </span> <span class="icl-tr-details"> </span> <div class="icl_post_note" id="icl_post_note_<?php echo $doc->post_id; ?> "> <?php
public function build_content_translation_jobs() { ?> <span class="spinner waiting-1" style="display: inline-block; float:none; visibility: visible"></span> <fieldset class="filter-row"></fieldset> <div class="listing-table wpml-translation-management-jobs" id="icl-tm-jobs-form" style="display: none;"> <h3><?php _e('Jobs', 'wpml-translation-management'); ?> </h3> <table id="icl-translation-jobs" class="wp-list-table widefat fixed"> <thead> <tr> <th scope="col" id="cb" class="manage-column check-column" style=""> <label class="screen-reader-text" for="bulk-select-top"><?php _e('Select All', 'wpml-translation-management'); ?> </label> <input id="bulk-select-top" class="bulk-select-checkbox" type="checkbox"> </th> <th scope="col" id="job_id" class="manage-column column-job_id" style=""> <?php _e('Job ID', 'wpml-translation-management'); ?> </th> <th scope="col" id="title" class="manage-column column-title" style=""> <?php _e('Title', 'wpml-translation-management'); ?> </th> <th scope="col" id="language" class="manage-column column-language" style=""> <?php _e('Language', 'wpml-translation-management'); ?> </th> <th scope="col" id="status" class="manage-column column-status" style=""> <?php _e('Status', 'wpml-translation-management'); ?> </th> <th scope="col" id="translator" class="manage-column column-translator" style=""> <?php _e('Translator', 'wpml-translation-management'); ?> </th> </tr> </thead> <tfoot> <tr> <th scope="col" id="cb" class="manage-column check-column" style=""> <label class="screen-reader-text" for="bulk-select-bottom"><?php _e('Select All', 'wpml-translation-management'); ?> </label> <input id="bulk-select-bottom" class="bulk-select-checkbox" type="checkbox"> </th> <th scope="col" id="job_id" class="manage-column column-job_id" style=""> <?php _e('Job ID', 'wpml-translation-management'); ?> </th> <th scope="col" id="title" class="manage-column column-title" style=""> <?php _e('Title', 'wpml-translation-management'); ?> </th> <th scope="col" id="language" class="manage-column column-language" style=""> <?php _e('Language', 'wpml-translation-management'); ?> </th> <th scope="col" id="status" class="manage-column column-status" style=""> <?php _e('Status', 'wpml-translation-management'); ?> </th> <th scope="col" id="translator" class="manage-column column-translator" style=""> <?php _e('Translator', 'wpml-translation-management'); ?> </th> </tr> </tfoot> <tbody class="groups"></tbody> </table> <br/> <?php wp_nonce_field('assign_translator_nonce', '_icl_nonce_at'); ?> <input type="hidden" name="icl_tm_action" value=""/> <input id="icl-tm-jobs-cancel-but" name="icl-tm-jobs-cancel-but" class="button-primary" type="submit" value="<?php _e('Cancel selected', 'wpml-translation-management'); ?> " disabled="disabled"/> <span id="icl-tm-jobs-cancel-msg" style="display: none"><?php _e('Are you sure you want to cancel these jobs?', 'wpml-translation-management'); ?> </span> <span id="icl-tm-jobs-cancel-msg-2" style="display: none"><?php _e('WARNING: %s job(s) are currently being translated.', 'wpml-translation-management'); ?> </span> <span id="icl-tm-jobs-cancel-msg-3" style="display: none"><?php _e('Are you sure you want to abort this translation?', 'wpml-translation-management'); ?> </span> <span class="navigator"></span> <span class="spinner waiting-2" style="display: none; float:none; visibility: visible"></span> <?php wp_nonce_field('icl_cancel_translation_jobs_nonce', 'icl_cancel_translation_jobs_nonce'); ?> <?php wp_nonce_field('icl_get_jobs_table_data_nonce', 'icl_get_jobs_table_data_nonce'); ?> </div> <?php TranslationManagement::include_underscore_templates('listing'); }
// shows only when translation polling is on and there are translations in progress $ICL_Pro_Translation->get_icl_manually_tranlations_box('icl_cyan_box'); ?> <?php if (count($active_languages = $sitepress->get_active_languages()) > 1) { ?> <div><a href="javascript:void(0)" onclick="jQuery(this).parent().next('.wrapper').slideToggle();" style="display:block; padding:5px; border: 1px solid #eee; margin-bottom:2px; background-color: #F7F7F7;"><?php _e('Content translation', 'wpml-translation-management'); ?> </a> </div> <div class="wrapper" style="display:none; padding: 5px 10px; border: 1px solid #eee; border-top: 0px; margin:-11px 0 2px 0;"> <?php $your_translators = TranslationManagement::get_blog_translators(); $other_service_translators = TranslationManagement::icanlocalize_translators_list(); if (!empty($your_translators) || !empty($other_service_translators)) { echo '<p><strong>' . __('Your translators', 'wpml-translation-management') . '</strong></p><ul>'; if (!empty($your_translators)) { foreach ($your_translators as $your_translator) { echo '<li>'; if ($current_user->ID == $your_translator->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={$your_translator->ID}")); } echo '<a href="' . $edit_link . '"><strong>' . $your_translator->display_name . '</strong></a> - '; foreach ($your_translator->language_pairs as $from => $lp) { $tos = array(); foreach ($lp as $to => $null) { $tos[] = $active_languages[$to]['display_name'];
function icl_upgrade_2_0_0_steps($step, $stepper) { global $wpdb, $sitepress, $wp_post_types, $sitepress_settings; if (!isset($sitepress)) { $sitepress = new SitePress(); } $TranslationManagement = new TranslationManagement(); $default_language = $sitepress->get_default_language(); define('ICL_TM_DISABLE_ALL_NOTIFICATIONS', true); // make sure no notifications are being sent //if(defined('icl_upgrade_2_0_0_runonce')){ // return; //} //define('icl_upgrade_2_0_0_runonce', true); // fix source_language_code // assume that the lowest element_id is the source language ini_set('max_execution_time', 300); $post_types = array_keys($wp_post_types); foreach ($post_types as $pt) { $types[] = 'post_' . $pt; } $temp_upgrade_data = get_option('icl_temp_upgrade_data', array('step' => 0, 'offset' => 0)); switch ($step) { case 1: // if the tables are missing, call the plugin activation routine $table_name = $wpdb->prefix . 'icl_translation_status'; if ($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") != $table_name) { icl_sitepress_activate(); } $wpdb->query("ALTER TABLE `{$wpdb->prefix}icl_translations` CHANGE `element_type` `element_type` VARCHAR( 32 ) NOT NULL DEFAULT 'post_post'"); $wpdb->query("ALTER TABLE `{$wpdb->prefix}icl_translations` CHANGE `element_id` `element_id` BIGINT( 20 ) NULL DEFAULT NULL "); // fix source_language_code // all source documents must have null if (isset($types)) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}icl_translations SET source_language_code = NULL\n\t\t\t\t\tWHERE element_type IN('" . join("','", $types) . "') AND source_language_code = '' AND language_code=%s", $default_language)); // get translated documents with missing source language $res = $wpdb->get_results($wpdb->prepare("\n\t\t\t\t\tSELECT translation_id, trid, language_code\n\t\t\t\t\tFROM {$wpdb->prefix}icl_translations\n\t\t\t\t\tWHERE (source_language_code = '' OR source_language_code IS NULL)\n\t\t\t\t\t\tAND element_type IN('" . join("','", $types) . "')\n\t\t\t\t\t\tAND language_code <> %s\n\t\t\t\t\t\t", $default_language)); foreach ($res as $row) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}icl_translations SET source_language_code = %s WHERE translation_id=%d", $default_language, $row->translation_id)); } } $temp_upgrade_data['step'] = 2; update_option('icl_temp_upgrade_data', $temp_upgrade_data); return array('message' => __('Processing translations...', 'sitepress')); break; case 2: $limit = 100; $offset = $temp_upgrade_data['offset']; $processing = FALSE; //loop existing translations if (isset($types)) { $res = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}icl_translations\n WHERE element_type IN(" . wpml_prepare_in($types) . " )\n AND source_language_code IS NULL LIMIT %d OFFSET %d", array($limit, $offset))); foreach ($res as $row) { $processing = TRUE; // grab translations $translations = $sitepress->get_element_translations($row->trid, $row->element_type); $md5 = 0; $table_name = $wpdb->prefix . 'icl_node'; if ($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") == $table_name) { list($md5, $links_fixed) = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\t\t\tSELECT md5, links_fixed FROM {$wpdb->prefix}icl_node\n\t\t\t\t\t\t\tWHERE nid = %d\n\t\t\t\t\t\t", $row->element_id), ARRAY_N); } if (!$md5) { $md5 = $TranslationManagement->post_md5($row->element_id); } $translation_package = $TranslationManagement->create_translation_package($row->element_id); foreach ($translations as $lang => $t) { if (!$t->original) { // determine service and status $service = 'local'; $needs_update = 0; list($rid, $status, $current_md5) = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\t\t\t\tSELECT c.rid, n.status , c.md5\n\t\t\t\t\t\t\t\tFROM {$wpdb->prefix}icl_content_status c\n\t\t\t\t\t\t\t\t\tJOIN {$wpdb->prefix}icl_core_status n ON c.rid = n.rid\n\t\t\t\t\t\t\t\tWHERE c.nid = %d AND target = %s\n\t\t\t\t\t\t\t\tORDER BY rid DESC\n\t\t\t\t\t\t\t\tLIMIT 1\n\t\t\t\t\t\t\t", $row->element_id, $lang), ARRAY_N); $translator_id = false; if ($rid) { if ($current_md5 != $md5) { $needs_update = 1; } if ($status == 3) { $status = 10; } else { $status = 2; } $service = 'icanlocalize'; foreach ($sitepress_settings['icl_lang_status'] as $lpair) { if ($lpair['from'] == $row->language_code && $lpair['to'] == $lang && isset($lpair['translators'][0]['id'])) { $translator_id = $lpair['translators'][0]['id']; break; } } } else { $status = 10; $translator_id = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM {$wpdb->posts} WHERE ID=%d", $t->element_id)); $tlp = get_user_meta($translator_id, $wpdb->prefix . 'language_pairs', true); $tlp[$row->language_code][$lang] = 1; $TranslationManagement->edit_translator($translator_id, $tlp); } // add translation_status record list($newrid) = $TranslationManagement->update_translation_status(array('translation_id' => $t->translation_id, 'status' => $status, 'translator_id' => $translator_id, 'needs_update' => $needs_update, 'md5' => $md5, 'translation_service' => $service, 'translation_package' => serialize($translation_package), 'links_fixed' => intval(isset($links_fixed) ? $links_fixed : 0))); $job_id = $TranslationManagement->add_translation_job($newrid, $translator_id, $translation_package); if ($job_id && $status == 10) { $post = get_post($t->element_id); $TranslationManagement->save_job_fields_from_post($job_id, $post); } } } } } if ($processing) { update_option('icl_temp_upgrade_data', array('step' => 2, 'offset' => intval($offset + 100))); $stepper->setNextStep(2); } else { update_option('icl_temp_upgrade_data', array('step' => 3, 'offset' => 1.0E+20)); } $message = $processing ? __('Processing translations...', 'sitepress') : __('Finalizing upgrade...', 'sitepress'); return array('message' => $message); break; case 3: // removing the plugins text table; importing data into a Sitepress setting $results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}icl_plugins_texts"); if (!empty($results)) { foreach ($results as $row) { $cft[$row->attribute_name] = $row->translate + 1; } if (isset($cft)) { $iclsettings['translation-management']['custom_fields_translation'] = $cft; $sitepress->save_settings($iclsettings); } $wpdb->query("DROP TABLE {$wpdb->prefix}icl_plugins_texts"); } $iclsettings['language_selector_initialized'] = 1; if (get_option('_force_mp_post_http')) { $iclsettings['troubleshooting_options']['http_communication'] = intval(get_option('_force_mp_post_http')); delete_option('_force_mp_post_http'); } // set default translators if (isset($sitepress_settings['icl_lang_status'])) { foreach ($sitepress_settings['icl_lang_status'] as $lpair) { if (!empty($lpair['translators'])) { $iclsettings['default_translators'][$lpair['from']][$lpair['to']] = array('id' => $lpair['translators'][0]['id'], 'type' => 'icanlocalize'); } } } $sitepress->save_settings($iclsettings); $iclsettings['migrated_2_0_0'] = 1; $sitepress->save_settings($iclsettings); delete_option('icl_temp_upgrade_data'); return array('message' => __('Done', 'sitepress'), 'completed' => 1); break; default: return array('error' => __('Missing step', 'sitepress'), 'stop' => 1); } }
private function is_external_element() { return $this->tm_instance->is_external_type($this->job->element_type_prefix); }
?> ><?php echo TranslationManagement::status2text(ICL_TM_COMPLETE); ?> </option> <option value="<?php echo ICL_TM_IN_PROGRESS; ?> " <?php if (@intval($icl_translation_filter['status']) == ICL_TM_IN_PROGRESS) { ?> selected="selected"<?php } ?> ><?php echo TranslationManagement::status2text(ICL_TM_IN_PROGRESS); ?> </option> <option value="<?php echo ICL_TM_WAITING_FOR_TRANSLATOR; ?> " <?php if (@intval($icl_translation_filter['status']) && $icl_translation_filter['status'] == ICL_TM_WAITING_FOR_TRANSLATOR) { ?> selected="selected"<?php } ?> ><?php _e('Available to translate', 'wpml-translation-management'); ?> </option>