/** * @param $language * * @return bool */ private function has_any_strings_in_shared_cached($language) { $sql = "\n\t\t\tSELECT id FROM {$this->wpdb->prefix}icl_string_urls\n\t\t\tWHERE language = %s AND url IS NULL\n\t\t\tORDER BY id ASC LIMIT 1\n\t\t"; $query = $this->wpdb->prepare($sql, array($language)); $value = $this->wpdb->get_var($query); return (bool) $value; }
function get_element_lang_code($element_id) { $cache_key_array = array($element_id, $this->element_type); $cache_key = md5(serialize($cache_key_array)); $cache_group = 'WPML_Element_Type_Translation::get_language_for_element'; $cache_found = false; $cache = $this->cache_factory->get($cache_group); $result = $cache->get($cache_key, $cache_found); if (!$cache_found) { $language_for_element_prepared = $this->wpdb->prepare("SELECT language_code \n\t\t\t\tFROM {$this->wpdb->prefix}icl_translations\n\t\t\t\tWHERE element_id=%d\n\t\t\t\tAND element_type=%s\n\t\t\t\tLIMIT 1", array($element_id, $this->element_type)); $result = $this->wpdb->get_var($language_for_element_prepared); if ($result) { $cache->set($cache_key, $result); } } return $result; }
/** * @param array $args * @param string $output_type * @return int|mixed */ public function find($args, $output_type = OBJECT) { $args = wp_parse_args($args, array('select' => '*', 'offset' => 0, 'limit' => 1, 'orderby' => 'id', 'order' => 'DESC', 'type' => '', 'email' => '', 'datetime_after' => '', 'datetime_before' => '', 'include_errors' => true)); $where = array(); $params = array(); // build general select from query $query = sprintf("SELECT %s FROM `%s`", $args['select'], $this->table_name); // add email to WHERE clause if ('' !== $args['email']) { $where[] = 'email LIKE %s'; $params[] = '%%' . $this->db->esc_like($args['email']) . '%%'; } // add type to WHERE clause if ('' !== $args['type']) { $where[] = 'type = %s'; $params[] = $args['type']; } // add datetime to WHERE clause if ('' !== $args['datetime_after']) { $where[] = 'datetime >= %s'; $params[] = $args['datetime_after']; } if ('' !== $args['datetime_before']) { $where[] = 'datetime <= %s'; $params[] = $args['datetime_before']; } // add where parameters if (count($where) > 0) { $query .= ' WHERE ' . implode(' AND ', $where); } // prepare parameters if (!empty($params)) { $query = $this->db->prepare($query, $params); } // return result count if ($args['select'] === 'COUNT(*)') { return (int) $this->db->get_var($query); } // return single row if ($args['limit'] === 1) { $query .= ' LIMIT 1'; return $this->db->get_row($query); } // perform rest of query $args['limit'] = absint($args['limit']); $args['offset'] = absint($args['offset']); $args['orderby'] = preg_replace("/[^a-zA-Z]/", "", $args['orderby']); $args['order'] = preg_replace("/[^a-zA-Z]/", "", $args['order']); // add ORDER BY, OFFSET and LIMIT to SQL $query .= sprintf(' ORDER BY `%s` %s LIMIT %d, %d', $args['orderby'], $args['order'], $args['offset'], $args['limit']); return $this->db->get_results($query, $output_type); }
function reset_pro_translation_configuration() { $translation_service_name = $this->TranslationProxy->get_current_service_name(); $this->sitepress->set_setting('content_translation_languages_setup', false); $this->sitepress->set_setting('content_translation_setup_complete', false); $this->sitepress->set_setting('content_translation_setup_wizard_step', false); $this->sitepress->set_setting('translator_choice', false); $this->sitepress->set_setting('icl_lang_status', false); $this->sitepress->set_setting('icl_balance', false); $this->sitepress->set_setting('icl_support_ticket_id', false); $this->sitepress->set_setting('icl_current_session', false); $this->sitepress->set_setting('last_get_translator_status_call', false); $this->sitepress->set_setting('last_icl_reminder_fetch', false); $this->sitepress->set_setting('icl_account_email', false); $this->sitepress->set_setting('translators_management_info', false); $this->sitepress->set_setting('site_id', false); $this->sitepress->set_setting('access_key', false); $this->sitepress->set_setting('ts_site_id', false); $this->sitepress->set_setting('ts_access_key', false); if (class_exists('TranslationProxy_Basket')) { //Cleaning the basket TranslationProxy_Basket::delete_all_items_from_basket(); } $sql_for_remote_rids = $this->wpdb->prepare("FROM {$this->wpdb->prefix}icl_translation_status\n\t\t\t\t\t\t\t\t \t\t\t\tWHERE translation_service != 'local'\n\t\t\t\t\t\t\t\t \t\t\t\t\tAND translation_service != 0\n\t\t\t\t\t\t\t\t\t\t\t\t\tAND status IN ( %d, %d )", ICL_TM_WAITING_FOR_TRANSLATOR, ICL_TM_IN_PROGRESS); //Delete all translation service jobs with status "waiting for translator" or "in progress" $this->wpdb->query("DELETE FROM {$this->wpdb->prefix}icl_translate_job WHERE rid IN (SELECT rid {$sql_for_remote_rids})"); //Delete all translation statuses with status "waiting for translator" or "in progress" $this->wpdb->query("DELETE {$sql_for_remote_rids}"); //Cleaning up Translation Proxy settings $this->sitepress->set_setting('icl_html_status', false); $this->sitepress->set_setting('language_pairs', false); if (!$this->TranslationProxy->has_preferred_translation_service()) { $this->sitepress->set_setting('translation_service', false); $this->sitepress->set_setting('icl_translation_projects', false); } $this->sitepress->save_settings(); $this->wpdb->query("TRUNCATE TABLE {$this->wpdb->prefix}icl_core_status"); $this->wpdb->query("TRUNCATE TABLE {$this->wpdb->prefix}icl_content_status"); $this->wpdb->query("TRUNCATE TABLE {$this->wpdb->prefix}icl_string_status"); $this->wpdb->query("TRUNCATE TABLE {$this->wpdb->prefix}icl_node"); $this->wpdb->query("TRUNCATE TABLE {$this->wpdb->prefix}icl_reminders"); if ($this->TranslationProxy->has_preferred_translation_service() && $translation_service_name) { $confirm_message = 'The translation process with %1$s was reset.'; } elseif ($translation_service_name) { $confirm_message = 'Your site was successfully disconnected from %1$s. Go to the translators tab to connect a new %1$s account or use a different translation service.'; } else { $confirm_message = 'PRO translation has been reset.'; } $response = sprintf(__($confirm_message, 'wpml-translation-management'), $translation_service_name); return $response; }
private function get_strings_summary($source_language) { $strings_query = "\n\t\t\t\tSELECT\n\t\t\t\t s.id, s.context as domain, s.gettext_context as context, s.name, s.value,\n\t\t\t\t (SELECT count(*)\n\t\t\t\t \tFROM {$this->wpdb->prefix}icl_string_translations t\n\t\t\t\t \tWHERE t.string_id = s.id AND t.language<>s.language) as translations\n\t\t\t\tFROM {$this->wpdb->prefix}icl_strings s\n\t\t\t\tWHERE s.language = %s\n\t\t\t\tORDER BY s.context, s.domain_name_context_md5;\n\t\t\t\t"; $strings_prepared = $this->wpdb->prepare($strings_query, $source_language); $strings = $this->wpdb->get_results($strings_prepared); $active_languages = $this->sitepress->get_active_languages(); $active_languages_count = count($active_languages); foreach ($strings as $string) { $wpml_string = new WPML_String($string->id, $this->sitepress, $this->wpdb); if (!isset($this->report['strings'])) { $this->init_strings_report($wpml_string); } $type = 'strings'; $this->report[$type]['count']['total']++; if ($string->translations < $active_languages_count) { $this->report[$type]['count']['untranslated'] += $active_languages_count - $string->translations - 1; } $element_attributes = array('element_id' => $string->id, 'element_type' => 'string', 'post_type' => 'string'); $words_count = $wpml_string->get_words_count(); $words_count = apply_filters('wpml_element_words_count', $words_count, $element_attributes); $this->report[$type]['words']['total'] += $words_count; $this->report[$type]['words']['untranslated'] = $this->report[$type]['words']['total'] * $this->report[$type]['count']['untranslated']; } }
private function get_translation_statuses() { $post_translations = $this->get_post_translations(); $status = array(); foreach ($post_translations as $language => $translation) { $res_query = "SELECT status as status_code, needs_update FROM {$this->wpdb->prefix}icl_translation_status WHERE translation_id=%d"; $res_args = array($translation->translation_id); $res_prepare = $this->wpdb->prepare($res_query, $res_args); $res = $this->wpdb->get_row($res_prepare); if ($res) { $res->status = $res->status_code; switch ($res->status) { case ICL_TM_WAITING_FOR_TRANSLATOR: $res->status = __('Waiting for translator', 'wpml-string-translation'); break; case ICL_TM_IN_PROGRESS: $res->status = __('In progress', 'wpml-string-translation'); break; case ICL_TM_NEEDS_UPDATE: $res->status = ''; break; case ICL_TM_COMPLETE: $res->status = __('Complete', 'wpml-string-translation'); break; default: $res->status = __('Not translated', 'wpml-string-translation'); break; } if ($res->needs_update) { if ($res->status) { $res->status .= ' - '; } $res->status .= __('Needs update', 'wpml-string-translation'); } $status[$language] = $res; } } return $status; }
/** * @param WP_User $current_user * * @return array */ public function get_pending_translation_stats($current_user) { $user_lang_pairs = get_user_meta($current_user->ID, $this->wpdb->prefix . 'language_pairs', true); $stats = array(); if (!empty($user_lang_pairs)) { $conds = array(); $target_langs = array(); foreach ($user_lang_pairs as $source_lang => $pair) { $target_lang_codes = array_keys($pair); $conds[] = $this->wpdb->prepare(" ( s.language = %s AND st.language IN (" . wpml_prepare_in($target_lang_codes) . ") ) ", $source_lang); $target_langs = array_unique(array_merge($target_langs, $target_lang_codes)); } $results = $this->wpdb->get_results($this->wpdb->prepare("\n SELECT COUNT(s.id) AS c, st.language\n FROM {$this->wpdb->prefix}icl_string_translations st\n JOIN {$this->wpdb->prefix}icl_strings s\n ON s.id = st.string_id\n WHERE st.status=%d AND ( " . join(" OR ", $conds) . " )\n AND (translator_id IS NULL OR translator_id = %d)\n GROUP BY st.language\n ORDER BY c DESC\n ", ICL_TM_WAITING_FOR_TRANSLATOR, $current_user->ID)); foreach ($results as $r) { $_stats[$r->language] = $r->c; } foreach ($target_langs as $lang) { $stats[$lang] = isset($_stats[$lang]) ? $_stats[$lang] : 0; } } return $stats; }
private function get_language_for_element($id, $element_type) { $string_query = "SELECT language FROM {$this->wpdb->prefix}icl_strings WHERE id=%s"; $string_prepared = $this->wpdb->prepare($string_query, $id); return $this->wpdb->get_var($string_prepared); }
public function get_string_translations() { $string_translations = array(); $current_user = $this->sitepress->get_current_user(); $active_languages = $this->sitepress->get_active_languages(); // error_log(serialize($active_languages), 3, WP_CONTENT_DIR . '/debug.log'); $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) { // do nothing } else { $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) . "%' "; } } $context_filter = isset($_GET['context']) ? $_GET['context'] : false; if ($context_filter !== false) { $extra_cond .= " AND s.context = '" . esc_sql($context_filter) . "'"; } if (isset($_GET['show_results']) && $_GET['show_results'] == 'all') { $limit = 9999; $offset = 0; } else { $limit = $this->sitepress_settings['st']['strings_per_page']; if (!isset($_GET['paged'])) { $_GET['paged'] = 1; } $offset = ($_GET['paged'] - 1) * $limit; } /* TRANSLATOR - START */ if ($current_user_can_translate_strings) { if (!empty($status_filter_lang)) { $_joins = $_sels = $_where = array(); foreach ($active_languages as $l) { if ($l['code'] == $this->sitepress_settings['st']['strings_language']) { continue; } $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']); } $sql = "\n\t SELECT SQL_CALC_FOUND_ROWS s.id AS string_id, s.language AS string_language, s.context, s.gettext_context, s.name, s.value, s.status,\n\t " . join(", ", $_sels) . "\n\t FROM {$this->wpdb->prefix}icl_strings s \n\t " . join("\n", $_joins) . "\n\t WHERE \n\t str_{$status_filter_lang}.status = %d AND\n\t (str_{$status_filter_lang}.translator_id IS NULL OR str_{$status_filter_lang}.translator_id = %d)\n\t {$extra_cond}\n\t ORDER BY string_id DESC\n\t LIMIT {$offset},{$limit}\n\t "; $sql_prepared = $this->wpdb->prepare($sql, array(ICL_TM_WAITING_FOR_TRANSLATOR, $current_user->ID)); $res = $this->wpdb->get_results($sql_prepared, ARRAY_A); } else { $_joins = $_sels = $_where = array(); foreach ($active_languages as $l) { if ($l['code'] == $this->sitepress_settings['st']['strings_language'] || empty($user_lang_pairs[$this->sitepress_settings['st']['strings_language']][$l['code']])) { continue; } $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 ($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) { if ($l2['code'] == $this->sitepress_settings['st']['strings_language'] || empty($user_lang_pairs[$this->sitepress_settings['st']['strings_language']][$l2['code']])) { continue; } $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 = "\n\t SELECT SQL_CALC_FOUND_ROWS s.id AS string_id, s.language AS string_language, s.context, s.gettext_context, s.name, s.value, s.status, " . join(', ', $_sels) . "\n\t FROM {$this->wpdb->prefix}icl_strings s " . join("\n", $_joins) . "\n\t WHERE s.language = '{$this->sitepress_settings['st']['strings_language']}' " . join(' ', $_where) . "\n\t {$extra_cond}\n\t ORDER BY s.id DESC\n\t LIMIT {$offset},{$limit}\n\t "; $res = $this->wpdb->get_results($sql, ARRAY_A); } $this->wp_query->found_posts = $this->wpdb->get_var("SELECT FOUND_ROWS()"); $this->wp_query->query_vars['posts_per_page'] = $limit; $this->wp_query->max_num_pages = ceil($this->wp_query->found_posts / $limit); if ($res) { if (!empty($status_filter_lang)) { foreach ($res as $row) { $_translations = array(); foreach ($active_languages as $l) { if ($l['code'] == $this->sitepress_settings['st']['strings_language']) { continue; } $language_code_alias = esc_sql(str_replace('-', '', $l['code'])); if ($row['id_' . $language_code_alias]) { $_translations[$l['code']] = array('id' => $row['id_' . $language_code_alias], 'status' => $row['status_' . $language_code_alias], 'language' => $l['code'], 'value' => $row['value_' . $language_code_alias], 'translator_id' => $row['translator_' . $language_code_alias], 'translation_date' => $row['date_' . $language_code_alias]); } } $string_translations[$row['string_id']] = array('string_id' => $row['string_id'], 'string_language' => $row['string_language'], 'context' => $row['context'], 'gettext_context' => $row['gettext_context'], 'name' => $row['name'], 'value' => $row['value'], 'status' => ICL_TM_WAITING_FOR_TRANSLATOR, 'translations' => $_translations); } } else { foreach ($res as $row) { $_translations = array(); $_status = ICL_TM_NOT_TRANSLATED; $_statuses = array(); foreach ($active_languages as $l) { if ($l['code'] == $this->sitepress_settings['st']['strings_language'] || empty($user_lang_pairs[$this->sitepress_settings['st']['strings_language']][$l['code']])) { continue; } $language_code_alias = str_replace('-', '', $l['code']); if ($row['id_' . $language_code_alias]) { $_translations[$l['code']] = array('id' => $row['id_' . $language_code_alias], 'status' => $row['status_' . $language_code_alias], 'language' => $l['code'], 'value' => $row['value_' . $language_code_alias], 'translator_id' => $row['translator_' . $language_code_alias], 'translation_date' => $row['date_' . $language_code_alias]); } $_statuses[$l['code']] = intval($row['status_' . $language_code_alias]); if ($row['status_' . $language_code_alias] == ICL_TM_WAITING_FOR_TRANSLATOR) { $_status = ICL_TM_WAITING_FOR_TRANSLATOR; } } $_statuses = array_values($_statuses); $_statuses = array_unique($_statuses); if ($_statuses == array(ICL_TM_NOT_TRANSLATED)) { $_status = ICL_TM_NOT_TRANSLATED; } elseif ($_statuses == array(ICL_TM_COMPLETE, ICL_TM_NOT_TRANSLATED)) { $_status = ICL_STRING_TRANSLATION_PARTIAL; } elseif ($_statuses == array(ICL_TM_COMPLETE)) { $_status = ICL_TM_COMPLETE; } elseif (in_array(ICL_TM_WAITING_FOR_TRANSLATOR, $_statuses) || in_array(ICL_TM_NEEDS_UPDATE, $_statuses)) { $_status = ICL_TM_WAITING_FOR_TRANSLATOR; } $string_translations[$row['string_id']] = array('string_id' => $row['string_id'], 'string_language' => $row['string_language'], 'context' => $row['context'], 'gettext_context' => $row['gettext_context'], 'name' => $row['name'], 'value' => $row['value'], 'status' => $_status, 'translations' => $_translations); } } } /* TRANSLATOR - END */ } else { // removed check for language = default lang if ($status_filter != ICL_TM_WAITING_FOR_TRANSLATOR) { $res = $this->wpdb->get_results("\n\t SELECT SQL_CALC_FOUND_ROWS id AS string_id, language AS string_language, context, gettext_context, name, value, status \n\t FROM {$this->wpdb->prefix}icl_strings s\n\t WHERE \n\t 1\n\t {$extra_cond}\n\t ORDER BY string_id DESC\n\t LIMIT {$offset},{$limit}\n\t ", ARRAY_A); } else { $res = $this->wpdb->get_results("\n\t SELECT SQL_CALC_FOUND_ROWS s.id AS string_id, s.language AS string_language, s.context, s.gettext_context, s.name, s.value, " . ICL_TM_WAITING_FOR_TRANSLATOR . " AS status\n\t FROM {$this->wpdb->prefix}icl_strings s\n\t JOIN {$this->wpdb->prefix}icl_string_translations str ON str.string_id = s.id\n\t WHERE \n\t str.status = " . ICL_TM_WAITING_FOR_TRANSLATOR . "\n\t {$extra_cond}\n\t ORDER BY string_id DESC\n\t LIMIT {$offset},{$limit}\n\t ", ARRAY_A); } if (!is_null($this->wp_query)) { $this->wp_query->found_posts = $this->wpdb->get_var("SELECT FOUND_ROWS()"); $this->wp_query->query_vars['posts_per_page'] = $limit; $this->wp_query->max_num_pages = ceil($this->wp_query->found_posts / $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; }