static function _st_warnings() { if (!class_exists('ICL_AdminNotifier')) { return; } global $sitepress, $sitepress_settings; if (!isset($sitepress)) { return; } if (method_exists($sitepress, 'check_settings_integrity') && !SitePress::check_settings_integrity()) { return; } if (!isset($sitepress_settings['st']['strings_language'])) { $sitepress_settings = $sitepress->get_settings(); } if (isset($sitepress_settings['st']['strings_language'])) { if ($sitepress->get_default_language() != $sitepress_settings['st']['strings_language']) { self::_st_default_language_warning(); } elseif ($sitepress_settings['st']['strings_language'] != 'en') { self::_st_default_and_st_language_warning(); } else { ICL_AdminNotifier::removeMessage('_st_default_and_st_language_warning'); ICL_AdminNotifier::removeMessage('_st_default_language_warning'); } } }
function admin_language_switcher() { if (!SitePress::check_settings_integrity()) { return; } /** @var $wp_admin_bar WP_Admin_Bar */ global $wpdb, $wp_admin_bar, $pagenow, $mode; $all_languages_enabled = true; $current_page = basename($_SERVER['SCRIPT_NAME']); $post_type = false; $trid = false; $translations = false; $languages_links = array(); // individual translations $is_post = false; $is_tax = false; $is_menu = false; $current_language = $this->get_current_language(); switch ($pagenow) { case 'post.php': $is_post = true; $post_id = @intval($_GET['post']); $post = get_post($post_id); $post_language = $this->get_language_for_element($post_id, 'post_' . get_post_type($post_id)); if ($post_language && $post_language != $current_language) { $this->switch_lang($post_language); $current_language = $this->get_current_language(); } $trid = $this->get_element_trid($post_id, 'post_' . $post->post_type); $translations = $this->get_element_translations($trid, 'post_' . $post->post_type, true); break; case 'post-new.php': $all_languages_enabled = false; if (isset($_GET['trid'])) { $trid = intval($_GET['trid']); $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : 'post'; $translations = $this->get_element_translations($trid, 'post_' . $post_type, true); $is_post = true; } break; case 'edit-tags.php': $is_tax = true; if (isset($_GET['action']) && $_GET['action'] == 'edit') { $all_languages_enabled = false; } $taxonomy = $_GET['taxonomy']; $term_tax_id = 0; if (isset($_GET['tag_ID'])) { $term_id = @intval($_GET['tag_ID']); $term_tax_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy=%s AND term_id=%d", $taxonomy, $term_id)); } if ($term_tax_id) { $trid = $this->get_element_trid($term_tax_id, 'tax_' . $taxonomy); } if ($trid) { $translations = $this->get_element_translations($trid, 'tax_' . $taxonomy, true); } break; case 'nav-menus.php': $is_menu = true; if (isset($_GET['menu']) && $_GET['menu']) { $menu_id = $_GET['menu']; $trid = $trid = $this->get_element_trid($menu_id, 'tax_nav_menu'); $translations = $this->get_element_translations($trid, 'tax_nav_menu', true); } $all_languages_enabled = false; break; case 'upload.php': if ($mode == 'grid') { $all_languages_enabled = false; } break; } foreach ($this->get_active_languages() as $lang) { $current_page_lang = $current_page; if (isset($_SERVER['QUERY_STRING'])) { parse_str($_SERVER['QUERY_STRING'], $query_vars); unset($query_vars['lang'], $query_vars['admin_bar']); } else { $query_vars = array(); } // individual translations if ($is_post) { if (isset($translations[$lang['code']]) && isset($translations[$lang['code']]->element_id)) { $query_vars['post'] = $translations[$lang['code']]->element_id; unset($query_vars['source_lang']); $current_page_lang = 'post.php'; $query_vars['action'] = 'edit'; } else { $current_page_lang = 'post-new.php'; if (isset($post)) { $query_vars['post_type'] = $post->post_type; $query_vars['source_lang'] = $current_language; } else { $query_vars['post_type'] = $post_type; } $query_vars['trid'] = $trid; unset($query_vars['post'], $query_vars['action']); } } elseif ($is_tax) { if (isset($translations[$lang['code']]) && isset($translations[$lang['code']]->element_id)) { $query_vars['tag_ID'] = $translations[$lang['code']]->element_id; } else { $query_vars['trid'] = $trid; $query_vars['source_lang'] = $current_language; unset($query_vars['tag_ID'], $query_vars['action']); } } elseif ($is_menu) { if (!empty($menu_id)) { if (isset($translations[$lang['code']]->element_id)) { $query_vars['menu'] = $translations[$lang['code']]->element_id; } else { $query_vars['menu'] = 0; $query_vars['trid'] = $trid; $query_vars['action'] = 'edit'; } } } $query_string = http_build_query($query_vars); $query = '?'; if (!empty($query_string)) { $query .= $query_string . '&'; } $query .= 'lang=' . $lang['code']; // the default language need to specified explicitly yoo in order to set the lang cookie $link_url = admin_url($current_page_lang . $query); $flag = $this->get_flag($lang['code']); if ($flag->from_template) { $wp_upload_dir = wp_upload_dir(); $flag_url = $wp_upload_dir['baseurl'] . '/flags/' . $flag->flag; } else { $flag_url = ICL_PLUGIN_URL . '/res/flags/' . $flag->flag; } $languages_links[$lang['code']] = array('url' => $link_url . '&admin_bar=1', 'current' => $lang['code'] == $current_language, 'anchor' => $lang['display_name'], 'flag' => '<img class="icl_als_iclflag" src="' . $flag_url . '" alt="' . $lang['code'] . '" width="18" height="12" />'); } if ($all_languages_enabled) { $query = '?'; if (!empty($query_string)) { $query .= $query_string . '&'; } $query .= 'lang=all'; $link_url = admin_url(basename($_SERVER['SCRIPT_NAME']) . $query); $languages_links['all'] = array('url' => $link_url, 'current' => 'all' == $current_language, 'anchor' => __('All languages', 'sitepress'), 'flag' => '<img class="icl_als_iclflag" src="' . ICL_PLUGIN_URL . '/res/img/icon16.png" alt="all" width="16" height="16" />'); } else { // set the default language as current if ('all' == $current_language) { $current_language = $this->get_default_language(); $languages_links[$current_language]['current'] = true; } } $parent = 'WPML_ALS'; $lang = $languages_links[$current_language]; // Current language $wp_admin_bar->add_menu(array('parent' => false, 'id' => $parent, 'title' => $lang['flag'] . ' ' . $lang['anchor'] . ' <img title="' . __('help', 'sitepress') . '" id="wpml_als_help_link" src="' . ICL_PLUGIN_URL . '/res/img/question1.png" alt="' . __('help', 'sitepress') . '" width="16" height="16"/>', 'href' => false, 'meta' => array('title' => __('Showing content in:', 'sitepress') . ' ' . $lang['anchor']))); if ($languages_links) { foreach ($languages_links as $code => $lang) { if ($code == $current_language) { continue; } $wp_admin_bar->add_menu(array('parent' => $parent, 'id' => $parent . '_' . $code, 'title' => $lang['flag'] . ' ' . $lang['anchor'], 'href' => $lang['url'], 'meta' => array('title' => __('Show content in:', 'sitepress') . ' ' . $lang['anchor']))); } } add_action('all_admin_notices', array($this, '_admin_language_switcher_help_popup')); }
/** * echo simple language switcher for WPML, 'sitepress' is used as plugin translation domain */ function admin_language_switcher() { // do nothing if WPML is not active if (!class_exists('SitePress')) { return; } // If check_settings_integrity exists then it should not fail, otherwise ignore. if (method_exists('SitePress', 'check_settings_integrity') && !SitePress::check_settings_integrity()) { return; } global $sitepress; // We need those methods, so make sure they are available. if (!method_exists($sitepress, 'get_current_language') || !method_exists($sitepress, 'get_default_language') || !method_exists($sitepress, 'get_active_languages')) { return; } $languages_links = array(); $current_language = $sitepress->get_current_language(); $current_language = $current_language ? $current_language : $sitepress->get_default_language(); if (isset($_SERVER['QUERY_STRING'])) { parse_str($_SERVER['QUERY_STRING'], $query_vars); unset($query_vars['lang'], $query_vars['admin_bar']); } else { $query_vars = array(); } $query_string = http_build_query($query_vars); if (empty($query_string)) { $query_string = '?'; } else { $query_string = '?' . $query_string . '&'; } foreach ($sitepress->get_active_languages() as $lang) { $query = $query_string . 'lang=' . $lang['code']; // the default language need to specified explicitly yoo in order to set the lang cookie $link_url = admin_url(basename($_SERVER['SCRIPT_NAME']) . $query); $languages_links[$lang['code']] = array('url' => $link_url, 'current' => $lang['code'] == $current_language, 'anchor' => $lang['display_name']); } $query = $query_string . 'lang=all'; $link_url = admin_url(basename($_SERVER['SCRIPT_NAME']) . $query); $languages_links['all'] = array('url' => $link_url, 'current' => 'all' == $current_language, 'anchor' => __('All languages', 'sitepress')); // We start with the current language in our select. $lang = $languages_links[$current_language]; if ($languages_links) { ?> <select onchange="window.location=this.value" style="margin: 0 0 0 20px;"> <option value="<?php echo esc_url($lang['url']); ?> "><?php echo $lang['anchor']; ?> </option> <?php foreach ($languages_links as $code => $lang) { if ($code == $current_language) { continue; } ?> <option value="<?php echo esc_url($lang['url']); ?> "><?php echo $lang['anchor']; ?> </option> <?php } ?> </select> <?php } }
function administration_menu2() { if (!SitePress::check_settings_integrity()) { return; } $main_page = apply_filters('icl_menu_main_page', ICL_PLUGIN_FOLDER . '/menu/languages.php'); if ($this->setup()) { add_submenu_page($main_page, __('Taxonomy Translation', 'sitepress'), __('Taxonomy Translation', 'sitepress'), 'wpml_manage_taxonomy_translation', ICL_PLUGIN_FOLDER . '/menu/taxonomy-translation.php'); } }
function get_ls_languages($template_args = array()) { //Returns false if is admin and settings are corrupted if (is_admin() && !SitePress::check_settings_integrity()) { return false; } /** @var $wp_query WP_Query */ global $wpdb, $wp_query, $w_this_lang, $wpml_post_translations; $current_language = $this->get_current_language(); $default_language = $this->get_default_language(); $cache_key_args = $template_args ? array_filter($template_args) : array('default'); $cache_key_args[] = $current_language; $cache_key_args[] = $default_language; $cache_key_args = array_filter($cache_key_args); $cache_key = md5(wp_json_encode($cache_key_args)); $cache_group = 'ls_languages'; $found = false; $ls_languages = wp_cache_get($cache_key, $cache_group, $found); if ($found) { return $ls_languages; } if (is_null($this->wp_query)) { $this->set_wp_query(); } // use original wp_query for this // backup current $wp_query if (!isset($wp_query)) { return $this->get_active_languages(); } $_wp_query_back = clone $wp_query; unset($wp_query); global $wp_query; // make it global again after unset $wp_query = clone $this->wp_query; $w_active_languages = $this->get_active_languages(); $this_lang = $this->this_lang; if ($this_lang == 'all') { $w_this_lang = array('code' => 'all', 'english_name' => 'All languages', 'display_name' => __('All languages', 'sitepress')); } else { $w_this_lang = $this->get_language_details($this_lang); } if (isset($template_args['skip_missing'])) { //override default setting $icl_lso_link_empty = !$template_args['skip_missing']; } else { $icl_lso_link_empty = $this->settings['icl_lso_link_empty']; } // 1. Determine translations if (is_category()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array(get_query_var('cat'), 'category')); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); $trid = $this->get_element_trid($term_taxonomy_id, 'tax_category'); $translations = $this->get_element_translations($trid, 'tax_category', $skip_empty); } elseif (is_tag()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array(get_query_var('tag_id'), 'post_tag')); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); $trid = $this->get_element_trid($term_taxonomy_id, 'tax_post_tag'); $translations = $this->get_element_translations($trid, 'tax_post_tag', $skip_empty); } elseif (is_tax()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array($wp_query->get_queried_object_id(), get_query_var('taxonomy'))); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); if ($this->is_translated_taxonomy(get_query_var('taxonomy'))) { $trid = $this->get_element_trid($term_taxonomy_id, 'tax_' . get_query_var('taxonomy')); $translations = $this->get_element_translations($trid, 'tax_' . get_query_var('taxonomy'), $skip_empty); } else { $translations[$this->get_current_language()] = (object) array('translation_id' => 0, 'language_code' => $this->get_default_language(), 'original' => 1, 'name' => get_query_var('taxonomy'), 'term_id' => $wp_query->get_queried_object_id()); } } elseif (is_archive() && !empty($wp_query->posts)) { $translations = array(); } elseif (is_attachment()) { // Exception for attachments. Not translated. $trid = $this->get_element_trid($wp_query->get_queried_object_id(), 'post_attachment'); $translations = $this->get_element_translations($trid, 'post_attachment'); } elseif (is_page() || 'page' == get_option('show_on_front') && (isset($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_on_front') || isset($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_for_posts'))) { $trid = $this->get_element_trid($wp_query->get_queried_object_id(), 'post_page'); $translations = $this->get_element_translations($trid, 'post_page'); } elseif (is_singular() && !empty($wp_query->posts) || isset($_wp_query_back->query['name']) && isset($_wp_query_back->query['post_type'])) { $trid = $wpml_post_translations->get_element_trid($this->wp_query->post->ID); $translations = $this->get_element_translations($trid, 'post_' . $this->wp_query->post->post_type); } else { $wp_query->is_singular = false; $wp_query->is_archive = false; $wp_query->is_category = false; $wp_query->is_404 = true; } // 2. determine url foreach ($w_active_languages as $k => $lang) { $skip_lang = false; if (is_singular() || isset($_wp_query_back->query['name']) && isset($_wp_query_back->query['post_type']) || !empty($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_for_posts')) { $this_lang_tmp = $this->this_lang; $this->this_lang = $lang['code']; $lang_page_on_front = get_option('page_on_front'); $lang_page_for_posts = get_option('page_for_posts'); if ($lang_page_on_front) { $lang_page_on_front = icl_object_id($lang_page_on_front, 'page', false, $lang['code']); } if ($lang_page_for_posts) { $lang_page_for_posts = icl_object_id($lang_page_for_posts, 'page', false, $lang['code']); } if ('page' == get_option('show_on_front') && !empty($translations[$lang['code']]) && $translations[$lang['code']]->element_id == $lang_page_on_front) { $lang['translated_url'] = $this->language_url($lang['code']); } elseif ('page' == get_option('show_on_front') && !empty($translations[$lang['code']]) && $translations[$lang['code']]->element_id && $translations[$lang['code']]->element_id == $lang_page_for_posts) { if ($lang_page_for_posts) { $lang['translated_url'] = get_permalink($lang_page_for_posts); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } else { if (!empty($translations[$lang['code']]) && isset($translations[$lang['code']]->post_title)) { $lang['translated_url'] = get_permalink($translations[$lang['code']]->element_id); $lang['missing'] = 0; } else { if ($icl_lso_link_empty) { if (!empty($template_args['link_empty_to'])) { $lang['translated_url'] = str_replace('{%lang}', $lang['code'], $template_args['link_empty_to']); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } else { $skip_lang = true; } $lang['missing'] = 1; } } $this->this_lang = $this_lang_tmp; } elseif (is_category() || is_tax() || is_tag()) { if (isset($translations[$lang['code']])) { // force the taxonomy id adjustment to not modify this global $icl_adjust_id_url_filter_off; $icl_adjust_id_url_filter_off = true; $taxonomy = is_category() ? 'category' : (is_tag() ? 'post_tag' : get_query_var('taxonomy')); $lang['translated_url'] = get_term_link((int) $translations[$lang['code']]->term_id, $taxonomy); $icl_adjust_id_url_filter_off = false; // restore default behaviour $lang['missing'] = 0; } else { if ($icl_lso_link_empty) { if (!empty($template_args['link_empty_to'])) { $lang['translated_url'] = str_replace('{%lang}', $lang['code'], $template_args['link_empty_to']); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } elseif ($current_language !== $lang['code']) { // don't skip the current language $skip_lang = true; } $lang['missing'] = 1; } } elseif (is_author()) { global $authordata, $wp_query; if (empty($authordata)) { $authordata = get_userdata(get_query_var('author')); } $post_type = get_query_var('post_type') ? get_query_var('post_type') : 'post'; $query_utils = new WPML_Query_Utils(); if ($query_utils->author_query_has_posts($post_type, $authordata, $lang)) { remove_filter('home_url', array($this, 'home_url'), 1, 4); remove_filter('author_link', array($this, 'author_link')); $author_url = get_author_posts_url($authordata->ID); add_filter('home_url', array($this, 'home_url'), 1, 4); add_filter('author_link', array($this, 'author_link')); $lang['translated_url'] = $this->convert_url($author_url, $lang['code']); $lang['missing'] = 0; } else { if ($icl_lso_link_empty) { if (!empty($template_args['link_empty_to'])) { $lang['translated_url'] = str_replace('{%lang}', $lang['code'], $template_args['link_empty_to']); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } else { // dont skip the currrent language if ($current_language != $lang['code']) { $skip_lang = true; } } $lang['missing'] = 1; } } elseif (is_archive() && !is_tag()) { global $icl_archive_url_filter_off; $icl_archive_url_filter_off = true; if ($this->wp_query->is_year) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); } $lang['translated_url'] = $this->archive_url(get_year_link($this->wp_query->query_vars['year']), $lang['code']); } elseif ($this->wp_query->is_month) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); $this->wp_query->query_vars['monthnum'] = substr($this->wp_query->query_vars['m'], 4, 2); } else { if ($icl_lso_link_empty) { if (!empty($template_args['link_empty_to'])) { $lang['translated_url'] = str_replace('{%lang}', $lang['code'], $template_args['link_empty_to']); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } $lang['missing'] = 1; } $lang['translated_url'] = $this->archive_url(get_month_link($this->wp_query->query_vars['year'], $this->wp_query->query_vars['monthnum']), $lang['code']); } elseif ($this->wp_query->is_day) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); $this->wp_query->query_vars['monthnum'] = substr($this->wp_query->query_vars['m'], 4, 2); $this->wp_query->query_vars['day'] = substr($this->wp_query->query_vars['m'], 6, 2); gmdate('Y', current_time('timestamp')); //force wp_timezone_override_offset to be called } $lang['translated_url'] = $this->archive_url(get_day_link($this->wp_query->query_vars['year'], $this->wp_query->query_vars['monthnum'], $this->wp_query->query_vars['day']), $lang['code']); } else { if (isset($this->wp_query->query_vars['post_type'])) { do_action('_icl_before_archive_url', $this->wp_query->query_vars['post_type'], $lang['code']); if ($this->is_translated_post_type($this->wp_query->query_vars['post_type']) && function_exists('get_post_type_archive_link')) { remove_filter('post_type_archive_link', array($this, 'post_type_archive_link_filter'), 10); $post_type = $this->wp_query->query_vars['post_type']; $url = $this->convert_url(get_post_type_archive_link($post_type), $lang['code']); $lang['translated_url'] = $this->adjust_cpt_in_url($url, $post_type, $lang['code']); } else { if ($k != $this->get_default_language()) { $skip_lang = true; unset($w_active_languages[$k]); } } do_action('_icl_after_archive_url', $this->wp_query->query_vars['post_type'], $lang['code']); } } add_filter('post_type_archive_link', array($this, 'post_type_archive_link_filter'), 10, 2); $icl_archive_url_filter_off = false; } elseif (is_search()) { $url_glue = strpos($this->language_url($lang['code']), '?') === false ? '?' : '&'; $lang['translated_url'] = $this->language_url($lang['code']) . $url_glue . 's=' . urlencode($wp_query->query['s']); } else { global $icl_language_switcher_preview; if ($icl_lso_link_empty || is_home() || is_404() || 'page' == get_option('show_on_front') && ($this->wp_query->queried_object_id == get_option('page_on_front') || $this->wp_query->queried_object_id == get_option('page_for_posts')) || $icl_language_switcher_preview || WPML_Root_Page::is_current_request_root()) { $lang['translated_url'] = $this->language_url($lang['code']); $skip_lang = false; } else { $skip_lang = true; unset($w_active_languages[$k]); } } if (!$skip_lang) { $w_active_languages[$k] = $lang; } else { unset($w_active_languages[$k]); } } $languages_helper = new WPML_Languages(); // 3. foreach ($w_active_languages as $k => $v) { $w_active_languages[$k] = $languages_helper->get_ls_language($k, $current_language, $w_active_languages[$k]); } // 4. pass GET parameters $parameters_copied = apply_filters('icl_lang_sel_copy_parameters', array_map('trim', explode(',', wpml_get_setting_filter('', 'icl_lang_sel_copy_parameters')))); if ($parameters_copied) { foreach ($_GET as $k => $v) { if (in_array($k, $parameters_copied)) { $gets_passed[$k] = $v; } } } if (!empty($gets_passed)) { $gets_passed = http_build_query($gets_passed); foreach ($w_active_languages as $code => $al) { if (empty($al['missing'])) { $glue = false !== strpos($w_active_languages[$code]['url'], '?') ? '&' : '?'; $w_active_languages[$code]['url'] .= $glue . $gets_passed; } } } // restore current $wp_query unset($wp_query); global $wp_query; // make it global again after unset $wp_query = clone $_wp_query_back; unset($_wp_query_back); $w_active_languages = apply_filters('icl_ls_languages', $w_active_languages); $w_active_languages = $languages_helper->sort_ls_languages($w_active_languages, $template_args); // Change the url, in case languages in subdomains are set. if ($this->settings['language_negotiation_type'] == 2) { foreach ($w_active_languages as $lang => $element) { $w_active_languages[$lang]['url'] = $this->convert_url($element['url'], $lang); } } wp_reset_query(); wp_cache_set($cache_key, $w_active_languages, $cache_group); return $w_active_languages; }