/** * Set the current language: if not found in the URL or REFERER, then keep the default * @since 1.1.1 */ public function init_current_language() { /** * Keep the default language if any of the code before does not detect another one. */ $this->language = $this->default_language; /** * Theoretically, we might not have any URL to get the language info from. */ $url_to_check = ''; if (WPGlobus_WP::is_doing_ajax()) { /** * If DOING_AJAX, we cannot retrieve the language information from the URL, * because it's always `admin-ajax`. * Therefore, we'll rely on the HTTP_REFERER (if it exists). */ if (!empty($_SERVER['HTTP_REFERER'])) { $url_to_check = $_SERVER['HTTP_REFERER']; } } else { /** * If not AJAX and not ADMIN then we are at the front. Will use the current URL. */ if (!is_admin()) { $url_to_check = WPGlobus_Utils::current_url(); } } /** * If we have an URL, extract language from it. * If extracted, set it as a current. */ if ($url_to_check) { $language_from_url = WPGlobus_Utils::extract_language_from_url($url_to_check); if ($language_from_url) { $this->language = $language_from_url; } } }
/** * @since 1.2.3 * @param string $language * @param WPGlobus_Config $config Alternative configuration (i.e. Unit Test mock object) * @return string */ public static function localize_current_url($language = '', WPGlobus_Config $config = null) { $url = apply_filters('wpglobus_pre_localize_current_url', '', $language); if (!$url) { /** * Use the global configuration is alternative not passed */ if (null === $config) { // @codeCoverageIgnoreStart $config = WPGlobus::Config(); } // @codeCoverageIgnoreEnd $url = WPGlobus_Utils::localize_url(WPGlobus_Utils::current_url(), $language, $config); } return $url; }
/** * Add language switcher to navigation menu * * @param array $sorted_menu_items * @param stdClass $args An object containing wp_nav_menu() arguments. * * @return array * @see wp_nav_menu() */ public function on_add_item($sorted_menu_items, $args) { if (empty(WPGlobus::Config()->nav_menu)) { /** * User can use WPGlobus widget * @since 1.0.7 */ $disable_add_selector = true; } elseif ('all' === WPGlobus::Config()->nav_menu) { /** * Attach to every nav menu * @since 1.0.7 */ $disable_add_selector = false; } else { $items = array(); foreach ($sorted_menu_items as $item) { $items[] = $item->ID; } $disable_add_selector = true; foreach ($this->menus as $key => $menu) { $diff = array_diff($items, $menu->menu_items); if (empty($diff) && WPGlobus::Config()->nav_menu === $menu->slug) { $disable_add_selector = false; break; } } } /** * Filter to add or not language selector to the menu. * Returning boolean. * @since 1.5.8 * * @param bool $disable_add_selector Disable or not to add language selector to the menu. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $disable_add_selector = apply_filters('wpglobus_menu_add_selector', $disable_add_selector, $args); if ($disable_add_selector) { return $sorted_menu_items; } /** * List of all languages, except the main one. * * @var string[] $extra_languages */ $extra_languages = array(); foreach (WPGlobus::Config()->enabled_languages as $languages) { if ($languages !== WPGlobus::Config()->language) { $extra_languages[] = $languages; } } /** * Filter extra languages. * Returning array. * @since 1.0.13 * * @param array $extra_languages An array of languages to show in the menu. * @param string WPGlobus::Config()->language The current language. */ $extra_languages = apply_filters('wpglobus_extra_languages', $extra_languages, WPGlobus::Config()->language); // Main menu item classes. $menu_item_classes = array('', 'menu-item', 'menu-item-type-custom', 'menu-item-object-custom', 'menu_item_wpglobus_menu_switch', 'wpglobus-selector-link'); // Submenu item classes. $submenu_item_classes = array('', 'menu-item', 'menu-item-type-custom', 'menu-item-object-custom', 'sub_menu_item_wpglobus_menu_switch', 'wpglobus-selector-link'); if (apply_filters('wpglobus_dropdown_menu', true, WPGlobus::Config())) { $parent_item_ID = 9999999999; # 9 999 999 999 } else { $parent_item_ID = 0; } $span_classes_lang = $this->_get_language_classes(WPGlobus::Config()->language); $current_url = WPGlobus_Utils::current_url(); $item = new stdClass(); $item->ID = 0 === $parent_item_ID ? 'wpglobus_menu_switch_' . WPGlobus::Config()->language : $parent_item_ID; $item->db_id = $item->ID; $item->object_id = $item->ID; $item->object = 'custom'; $item->menu_item_parent = 0; $item->title = '<span class="' . implode(' ', $span_classes_lang) . '">' . $this->_get_flag_name(WPGlobus::Config()->language) . '</span>'; // The top menu level points to the current URL. Useless? Maybe good for refresh. $item->url = $current_url; $item->classes = $menu_item_classes; $item->classes[] = 'wpglobus-current-language'; $item->description = ''; $item->language = WPGlobus::Config()->language; $wpglobus_menu_items[] = new WP_Post($item); foreach ($extra_languages as $language) { $span_classes_lang = $this->_get_language_classes($language); $item = new stdClass(); $item->ID = 'wpglobus_menu_switch_' . $language; $item->db_id = $item->ID; $item->object_id = $item->ID; $item->object = 'custom'; $item->menu_item_parent = $parent_item_ID; $item->title = '<span class="' . implode(' ', $span_classes_lang) . '">' . $this->_get_flag_name($language) . '</span>'; // This points to the URL localized for the selected language. $item->url = WPGlobus_Utils::localize_current_url($language); $item->classes = 0 === $parent_item_ID ? $menu_item_classes : $submenu_item_classes; $item->description = ''; $item->language = $language; $wpglobus_menu_items[] = new WP_Post($item); } $languages = $extra_languages; array_unshift($languages, WPGlobus::Config()->language); return array_merge($sorted_menu_items, apply_filters('wpglobus_menu_items', $wpglobus_menu_items, $languages)); }
/** * "Stub" test for coverage. * * @covers WPGlobus_Utils::current_url */ public static function test_current_url() { $_SERVER['HTTP_HOST'] = 'www.example.com'; $_SERVER['REQUEST_URI'] = '/folder/file?var=value'; self::assertEquals('http://www.example.com/folder/file?var=value', WPGlobus_Utils::current_url()); }
/** * Add language switcher to navigation menu * * @param array $sorted_menu_items * @param object $args An object containing wp_nav_menu() arguments. * * @return array * @see wp_nav_menu() */ function on_add_item($sorted_menu_items, $args) { if (empty(WPGlobus::Config()->nav_menu)) { /** * User can use WPGlobus widget * @since 1.0.7 */ return $sorted_menu_items; } elseif ('all' == WPGlobus::Config()->nav_menu) { /** * Attach to every nav menu * @since 1.0.7 */ } else { $items = array(); foreach ($sorted_menu_items as $item) { $items[] = $item->ID; } $return = true; foreach ($this->menus as $key => $menu) { $diff = array_diff($items, $menu->menu_items); if (empty($diff) && WPGlobus::Config()->nav_menu === $menu->slug) { $return = false; break; } } if ($return) { return $sorted_menu_items; } } $extra_languages = array(); foreach (WPGlobus::Config()->enabled_languages as $languages) { if ($languages != WPGlobus::Config()->language) { $extra_languages[] = $languages; } } /** * Filter extra languages. * Returning array. * @since 1.0.13 * * @param array $extra_languages An array with languages to show off in menu. * @param string WPGlobus::Config()->language The current language. */ $extra_languages = apply_filters('wpglobus_extra_languages', $extra_languages, WPGlobus::Config()->language); /** main menu item classes */ $menu_item_classes = array('', 'menu-item', 'menu_item_wpglobus_menu_switch', 'wpglobus-selector-link'); /** submenu item classes */ $submenu_item_classes = array('', 'sub_menu_item_wpglobus_menu_switch', 'wpglobus-selector-link'); if (apply_filters('wpglobus_dropdown_menu', true, WPGlobus::Config())) { $parent_item_ID = 9999999999; # 9 999 999 999 } else { $parent_item_ID = 0; } $span_classes_lang = $this->_get_language_classes(WPGlobus::Config()->language); $current_url = WPGlobus_Utils::current_url(); $item = new stdClass(); $item->ID = $parent_item_ID == 0 ? 'wpglobus_menu_switch_' . WPGlobus::Config()->language : $parent_item_ID; $item->db_id = $parent_item_ID == 0 ? 'wpglobus_menu_switch_' . WPGlobus::Config()->language : $parent_item_ID; $item->menu_item_parent = 0; $item->title = '<span class="' . implode(' ', $span_classes_lang) . '">' . $this->_get_flag_name(WPGlobus::Config()->language) . '</span>'; // The top menu level points to the current URL. Useless? Maybe good for refresh. $item->url = $current_url; $item->classes = $menu_item_classes; $item->classes[] = 'wpglobus-current-language'; $item->description = ''; $item->language = WPGlobus::Config()->language; $wpglobus_menu_items[] = $item; foreach ($extra_languages as $language) { $span_classes_lang = $this->_get_language_classes($language); $item = new stdClass(); $item->ID = 'wpglobus_menu_switch_' . $language; $item->db_id = 'wpglobus_menu_switch_' . $language; $item->menu_item_parent = $parent_item_ID; $item->title = '<span class="' . implode(' ', $span_classes_lang) . '">' . $this->_get_flag_name($language) . '</span>'; // This points to the URL localized for the selected language // $item->url = WPGlobus_Utils::localize_url( $current_url, $language ); $item->url = WPGlobus_Utils::localize_current_url($language); $item->classes = $parent_item_ID == 0 ? $menu_item_classes : $submenu_item_classes; $item->description = ''; $item->language = $language; $wpglobus_menu_items[] = $item; } $languages = $extra_languages; array_unshift($languages, WPGlobus::Config()->language); return array_merge($sorted_menu_items, apply_filters('wpglobus_menu_items', $wpglobus_menu_items, $languages)); }