private function get_lang_selector()
    {
        $disable = $this->check_if_language_change_is_ok() ? '' : 'disabled="disabled" ';
        ob_start();
        $languages = $this->active_languages;
        if (!$this->is_package_language_active()) {
            $languages = array_merge(array($this->sitepress->get_language_details($this->package_language)), $languages);
        } else {
            $languages = $this->active_languages;
        }
        $selector = new WPML_Simple_Language_Selector($this->sitepress);
        $selector->render(array('id' => 'icl_package_language', 'name' => 'icl_package_language', 'show_please_select' => false, 'languages' => $languages, 'selected' => $this->package_language, 'disabled' => !$this->check_if_language_change_is_ok(), 'echo' => true));
        ?>
			<span class="spinner"></span>
		<?php 
        return ob_get_clean();
    }
 public function get_string_translations()
 {
     $string_translations = array();
     $current_user = $this->sitepress->get_current_user();
     $current_user_can_translate_strings = $this->sitepress->get_wp_helper()->current_user_can_translate_strings();
     $user_lang_pairs = $this->sitepress->get_wp_helper()->get_user_language_pairs($current_user);
     $extra_cond = "";
     if ($current_user_can_translate_strings && isset($_GET['status']) && preg_match("#" . ICL_TM_WAITING_FOR_TRANSLATOR . "-(.+)#", $_GET['status'], $matches)) {
         $status_filter = ICL_TM_WAITING_FOR_TRANSLATOR;
         $status_filter_lang = $matches[1];
         $language_code_alias = str_replace('-', '', $status_filter_lang);
         $extra_cond .= " AND str_{$language_code_alias}.language = '{$status_filter_lang}' ";
     } else {
         $status_filter = isset($_GET['status']) ? intval($_GET['status']) : false;
     }
     $search_filter = isset($_GET['search']) ? $_GET['search'] : false;
     $exact_match = isset($_GET['em']) ? $_GET['em'] == 1 : false;
     if ($status_filter !== false) {
         if ($status_filter == ICL_TM_COMPLETE) {
             $extra_cond .= " AND s.status = " . ICL_TM_COMPLETE;
         } elseif ($status_filter != ICL_TM_WAITING_FOR_TRANSLATOR) {
             $extra_cond .= " AND status IN (" . ICL_STRING_TRANSLATION_PARTIAL . "," . ICL_TM_NEEDS_UPDATE . "," . ICL_TM_NOT_TRANSLATED . "," . ICL_TM_WAITING_FOR_TRANSLATOR . ")";
         }
     }
     if ($search_filter != false) {
         if ($exact_match) {
             $extra_cond .= " AND s.value = '" . esc_sql($search_filter) . "' ";
         } else {
             $extra_cond .= " AND s.value LIKE '%" . esc_sql($search_filter) . "%' ";
         }
     }
     $extra_cond .= isset($_GET['context']) ? " AND s.context = '" . esc_sql($_GET['context']) . "'" : '';
     if (isset($_GET['show_results']) && $_GET['show_results'] == 'all') {
         $limit = 9999;
         $offset = 0;
     } else {
         $limit = $this->get_strings_per_page();
         $_GET['paged'] = isset($_GET['paged']) ? $_GET['paged'] : 1;
         $offset = ($_GET['paged'] - 1) * $limit;
     }
     /* TRANSLATOR - START */
     if ($current_user_can_translate_strings) {
         $active_languages = $this->sitepress->get_active_languages();
         foreach ($user_lang_pairs as $source_lang_code => $pair) {
             if (!isset($active_languages[$source_lang_code])) {
                 $active_languages[$source_lang_code] = $this->sitepress->get_language_details($source_lang_code);
             }
             foreach (array_keys($pair) as $target_lang_code) {
                 if (!isset($active_languages[$target_lang_code])) {
                     $active_languages[$target_lang_code] = $this->sitepress->get_language_details($target_lang_code);
                 }
             }
         }
         $_joins = $_sels = $_where = array();
         foreach ($active_languages as $l) {
             $language_code_alias = esc_sql(str_replace('-', '', $l['code']));
             $_sels[] = "str_{$language_code_alias}.id AS id_{$language_code_alias},\n\t                             str_{$language_code_alias}.status AS status_{$language_code_alias},\n\t                             str_{$language_code_alias}.value AS value_{$language_code_alias},\n\t                             str_{$language_code_alias}.translator_id AS translator_{$language_code_alias},\n\t                             str_{$language_code_alias}.translation_date AS date_{$language_code_alias}\n\t                             ";
             $_joins[] = $this->wpdb->prepare("LEFT JOIN {$this->wpdb->prefix}icl_string_translations str_{$language_code_alias}\n\t                                                ON str_{$language_code_alias}.string_id = s.id AND str_{$language_code_alias}.language = %s ", $l['code']);
             if (empty($status_filter_lang)) {
                 if ($status_filter == ICL_TM_COMPLETE) {
                     $_where[] .= " AND str_{$language_code_alias}.status = " . ICL_TM_COMPLETE;
                 } else {
                     if (empty($_lwhere)) {
                         $_lwheres = array();
                         $_lwhere = ' AND (';
                         foreach ($active_languages as $l2) {
                             $l2code_alias = esc_sql(str_replace('-', '', $l2['code']));
                             $_lwheres[] = $this->wpdb->prepare(" str_{$l2code_alias}.status = %d\n\t                                                          OR str_{$l2code_alias}.translator_id = %d ", ICL_TM_WAITING_FOR_TRANSLATOR, $current_user->ID);
                         }
                         $_lwhere .= join(' OR ', $_lwheres) . ')';
                         $_where[] = $_lwhere;
                     }
                 }
             }
         }
         $sql_query = empty($status_filter_lang) ? " WHERE s.language IN ( " . wpml_prepare_in(array_keys($user_lang_pairs)) . " ) " . join(' ', $_where) : $this->wpdb->prepare(" WHERE str_{$status_filter_lang}.status = %d\n\t\t\t\t\t\t\t\t\t\t\tAND (str_{$status_filter_lang}.translator_id IS NULL\n\t\t\t\t\t\t\t\t\t\t\t\t\tOR str_{$status_filter_lang}.translator_id = %d)", array(ICL_TM_WAITING_FOR_TRANSLATOR, $current_user->ID));
         $res = $this->get_results($sql_query, $extra_cond, $offset, $limit, $_joins, $_sels);
         if ($res) {
             $string_translations = empty($status_filter_lang) ? $this->rows_from_unfiltered($res, $active_languages, $string_translations) : $this->rows_from_lang_status_filtered($res, $active_languages, $string_translations);
         }
         /* TRANSLATOR - END */
     } else {
         if ($status_filter != ICL_TM_WAITING_FOR_TRANSLATOR) {
             $sql_query = " WHERE 1 ";
         } else {
             $sql_query = " JOIN {$this->wpdb->prefix}icl_string_translations str ON str.string_id = s.id\n\t                           WHERE str.status = " . ICL_TM_WAITING_FOR_TRANSLATOR;
         }
         $res = $this->get_results($sql_query, $extra_cond, $offset, $limit);
         if ($res) {
             $extra_cond = '';
             if (isset($_GET['translation_language'])) {
                 $extra_cond .= " AND language='" . esc_sql($_GET['translation_language']) . "'";
             }
             foreach ($res as $row) {
                 $string_translations[$row['string_id']] = $row;
                 $tr = $this->wpdb->get_results($this->wpdb->prepare("\n\t                    SELECT id, language, status, value, translator_id, translation_date  \n\t                    FROM {$this->wpdb->prefix}icl_string_translations \n\t                    WHERE string_id=%d {$extra_cond}\n\t                ", $row['string_id']), ARRAY_A);
                 if ($tr) {
                     foreach ($tr as $t) {
                         $string_translations[$row['string_id']]['translations'][$t['language']] = $t;
                     }
                 }
             }
         }
     }
     return $string_translations;
 }