/**
  * Sends an email to all potential translators for the given job_id
  *
  * @param WPML_Translation_Job|int $job
  *
  * @return array
  */
 public function new_job_notification_mail($job)
 {
     $mails = array();
     list($manager_id, $job) = $this->get_mail_elements($job);
     if (!$job) {
         return $mails;
     }
     $job_id = $job->get_id();
     $translators = $this->blog_translators->get_blog_translators(array('to' => $job->get_language_code()));
     /** @var WPML_Element_Translation_Job $job */
     $edit_url = strtolower($job->get_type()) !== 'string' ? 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 ($manager_id == $t->ID || !$job->user_can_translate($t)) {
             continue;
         }
         $user_language = $this->sitepress->get_user_admin_language($t->ID);
         $this->sitepress->switch_locale($user_language);
         list($lang_from, $lang_to) = $this->get_lang_to_from($job, $user_language);
         if (strtolower($job->get_type()) !== 'string') {
             /** @var WPML_Element_Translation_Job $job */
             $post_link = $job->get_url(true);
             $post_link = $post_link != "" ? sprintf(__("\nView the original document in %s here: %s\n", 'sitepress'), $lang_from, $post_link) : "";
         } else {
             $post_link = "";
         }
         $mail['to'] = $t->display_name . ' <' . $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);
         $this->sitepress->switch_locale();
         $mails[] = $mail;
     }
     return $mails;
 }
 /**
  * Checks whether the input user is allowed to edit this job
  *
  * @param stdClass|WP_User $user
  *
  * @return bool
  */
 public function user_can_translate($user)
 {
     $translator_id = $this->get_translator_id();
     $user_can_take_this_job = $translator_id === 0 || $translator_id === (int) $user->ID;
     $translator_has_job_language_pairs = $this->blog_translators->is_translator($user->ID, array('lang_from' => $this->get_source_language_code(), 'lang_to' => $this->get_language_code()));
     return $user_can_take_this_job && $translator_has_job_language_pairs || method_exists($user, 'has_cap') && $user->has_cap('manage_options') || !method_exists($user, 'has_cap') && user_can($user->ID, 'manage_options');
 }
 public static function get_job_id_from_request()
 {
     /**
      * @var TranslationManagement $iclTranslationManagement
      * @var WPML_Post_Translation $wpml_post_translations
      */
     global $iclTranslationManagement, $wpml_post_translations, $wpml_translation_job_factory, $sitepress, $wpdb;
     $job_id = filter_input(INPUT_GET, 'job_id', FILTER_SANITIZE_NUMBER_INT);
     $trid = filter_input(INPUT_GET, 'trid', FILTER_SANITIZE_NUMBER_INT);
     $language_code = filter_input(INPUT_GET, 'language_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
     $source_language_code = filter_input(INPUT_GET, 'source_language_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
     if (!$job_id && $trid && $language_code) {
         $job_id = $iclTranslationManagement->get_translation_job_id($trid, $language_code);
         if (!$job_id) {
             if (!$source_language_code) {
                 $post_id = SitePress::get_original_element_id_by_trid($trid);
             } else {
                 $posts_in_trid = $wpml_post_translations->get_element_translations(false, $trid);
                 $post_id = isset($posts_in_trid[$source_language_code]) ? $posts_in_trid[$source_language_code] : false;
             }
             $blog_translators = new WPML_TM_Blog_Translators($wpdb);
             $args = array('lang_from' => $source_language_code, 'lang_to' => $language_code, 'job_id' => $job_id);
             if ($post_id && $blog_translators->is_translator($sitepress->get_current_user()->ID, $args)) {
                 $job_id = $wpml_translation_job_factory->create_local_post_job($post_id, $language_code);
             }
         }
     }
     return $job_id;
 }
 public function translator_languages_pairs_filter($default, $user)
 {
     $result = $default;
     $user_id = $this->get_user_id($user);
     if (is_numeric($user_id)) {
         if ($this->blog_translators->is_translator($user_id)) {
             $result = $this->blog_translators->get_language_pairs($user_id);
         }
     }
     return $result;
 }
 public function translator_languages_pairs_filter($default, $user)
 {
     $result = $default;
     $user_id = $this->get_user_id($user);
     if (is_numeric($user_id)) {
         $blog_translators = new WPML_TM_Blog_Translators($this->wpdb);
         if ($blog_translators->is_translator($user_id)) {
             $result = get_user_meta($user_id, $this->wpdb->prefix . 'language_pairs', true);
         }
     }
     return $result;
 }
 /**
  * Adds the given language pair to the user.
  *
  * @param int    $user_id
  * @param string $target_lang
  * @param string $source_lang
  *
  * @used-by \WPML_TM_Post_Actions::save_post_actions to add language pairs to admin users automatically when saving
  *                                                   a translation in a given language pair.
  */
 private function maybe_add_as_translator($user_id, $target_lang, $source_lang)
 {
     if ($target_lang && !$this->blog_translators->is_translator($user_id, array('lang_from' => $source_lang, 'lang_to' => $target_lang, 'admin_override' => false))) {
         $this->action_helper->get_tm_instance()->add_translator($user_id, array($source_lang => array($target_lang => 1)));
     }
 }