* @package View_Admin_As */ if ( ! defined( 'VIEW_ADMIN_AS_DIR' ) ) { die(); } /** * Language switcher add-on. * * @author Jory Hogeveen * @package View_Admin_As * @since 1.7.5 * @version 1.8 * @uses \VAA_View_Admin_As_Type Extends class */ class VAA_View_Admin_As_Languages extends VAA_View_Admin_As_Type { /** * The single instance of the class. * * @since 1.7.5 * @static * @var \VAA_View_Admin_As_Languages */ private static $_instance = null; /** * Option key. * * @since 1.7.5 * @var string */ protected $optionKey = 'languages'; /** * @since 1.7.5 * @var string */ protected $type = 'locale'; /** * The icon for this view type. * * @since 1.8 * @var string */ protected $icon = 'dashicons-translation'; /** * Populate the instance. * * @since 1.7.5 * @access protected * @param \VAA_View_Admin_As $vaa The main VAA object. */ protected function __construct( $vaa ) { self::$_instance = $this; parent::__construct( $vaa ); if ( ! $this->has_access() ) { return; } $this->priorities = array( 'toolbar' => 9, 'view_title' => 90, 'validate_view_data' => 10, 'update_view' => 10, 'do_view' => 10, ); $this->label = __( 'Languages', VIEW_ADMIN_AS_DOMAIN ); $this->label_singular = __( 'Language', VIEW_ADMIN_AS_DOMAIN ); } /** * Apply the language view. * * @since 1.7.5 * @access public */ public function do_view() { if ( parent::do_view() ) { $this->add_filter( 'locale', array( $this, 'filter_locale' ) ); $this->add_action( 'after_setup_theme', array( $this, 'action_switch_to_locale' ), 0 ); // Overwrite user setting for freeze locale. $this->add_filter( 'view_admin_as_freeze_locale', '__return_false', 99 ); } } /** * Change the site language. * * @since 1.7.5 * @access public * param string $locale * @return string */ public function filter_locale() { return $this->selected; } /** * Change the site language. * * @since 1.7.5 * @access public */ public function action_switch_to_locale() { if ( function_exists( 'switch_to_locale' ) ) { switch_to_locale( $this->selected ); } } /** * Validate data for this view type * * @since 1.7.5 * @param null $null Default return (invalid) * @param mixed $data The view data * @return mixed */ public function validate_view_data( $null, $data = null ) { if ( is_string( $data ) && $this->get_data( $data ) ) { return $data; } return $null; } /** * Change the VAA admin bar menu title. * * @since 1.7.5 * @since 1.8 Renamed from vaa_admin_bar_view_titles(). * @access public * @param array $titles The current title(s). * @return array */ public function view_title( $titles = array() ) { $language = $this->get_data( $this->selected ); if ( $language ) { $titles[ /* No need for view type key. */ ] = $this->get_view_title( $this->selected ); } return $titles; } /** * Get the view title. * * @since 1.8 * @param string $locale The locale. * @return string */ public function get_view_title( $locale ) { $title = $this->get_data( $locale ); /** * Change the display title for language nodes. * * @since 1.8 * @param string $title Language (native). * @param string $locale The locale. * @return string */ $title = apply_filters( 'vaa_admin_bar_view_title_' . $this->type, $title, $locale ); return $title; } /** * Add the admin bar items. * * @since 1.7.5 * @access public * @param \WP_Admin_Bar $admin_bar The toolbar object. * @param string $root The root item. */ public function admin_bar_menu( $admin_bar, $root ) { static $done; if ( $done ) return; $main_root = $root; $root = $main_root . '-locale'; $admin_bar->add_group( array( 'id' => $root, 'parent' => $main_root, 'meta' => array( 'class' => 'ab-sub-secondary', ), ) ); $admin_bar->add_node( array( 'id' => $root . '-title', 'parent' => $root, 'title' => VAA_View_Admin_As_Form::do_icon( $this->icon ) . $this->label, 'href' => false, 'meta' => array( 'class' => 'vaa-has-icon ab-vaa-title' . ( ( $this->store->get_view( $this->type ) ) ? ' current' : '' ), 'tabindex' => '0', ), ) ); $admin_bar->add_group( array( 'id' => $root . '-languages', 'parent' => $root . '-title', 'meta' => array( 'class' => 'vaa-auto-max-height', ), ) ); /** * Add items at the beginning of the rua group. * * @see 'admin_bar_menu' action * @link https://codex.wordpress.org/Class_Reference/WP_Admin_Bar * @param \WP_Admin_Bar $admin_bar The toolbar object. * @param string $root The current root item. */ do_action( 'vaa_admin_bar_languages_before', $admin_bar, $root ); // Add the levels. include VIEW_ADMIN_AS_DIR . 'ui/templates/adminbar-language-items.php'; /** * Add items at the end of the rua group. * * @see 'admin_bar_menu' action * @link https://codex.wordpress.org/Class_Reference/WP_Admin_Bar * @param \WP_Admin_Bar $admin_bar The toolbar object. * @param string $root The current root item. */ do_action( 'vaa_admin_bar_languages_after', $admin_bar, $root ); } /** * Store the available languages. * * @since 1.7.5 * @since 1.8 Renamed from store_languages(). * @access public */ public function store_data() { $installed = get_available_languages(); if ( ! $installed || ( 1 === count( $installed ) && 'en_US' === reset( $installed ) ) ) { return; } $existing = (array) $this->store->get_optionData( $this->optionKey ); $languages = $existing; if ( array_diff_key( array_flip( $installed ), $existing ) ) { // New languages detected. Call the WP API to get language info. $languages = $this->get_wp_languages( $languages ); } $data_languages['en_US'] = 'English'; // Same order as WordPress. sort( $installed ); foreach ( $installed as $locale ) { if ( array_key_exists( $locale, $languages ) ) { $data_languages[ $locale ] = $languages[ $locale ]; } } if ( $languages !== $existing ) { $this->store->update_optionData( $data_languages, $this->optionKey, true ); } $this->set_data( $data_languages ); } /** * Call the WP API to get language info. * * @since 1.7.5 * @param array $languages Existing languages. * @return array */ private function get_wp_languages( $languages ) { if ( ! file_exists( ABSPATH . 'wp-admin/includes/translation-install.php' ) ) { // @todo Notice on debug. return $languages; } require_once ABSPATH . 'wp-admin/includes/translation-install.php'; if ( ! function_exists( 'wp_get_available_translations' ) ) { return $languages; } $wp_languages = wp_get_available_translations(); if ( ! $wp_languages ) { return $languages; } foreach ( $wp_languages as $locale => $language_info ) { $name = $locale; if ( isset( $language_info['native_name'] ) ) { $name = $language_info['native_name']; } $languages[ $locale ] = $name; } return $languages; } /** * Set the view type data. * * @since 1.8 * @access public * @param mixed $val * @param string $key (optional) The data key. * @param bool $append (optional) Append if it doesn't exist? */ public function set_data( $val, $key = null, $append = true ) { $this->store->set_languages( $val, $key, $append ); } /** * Get a language by locale. * * @since 1.7.5 * @since 1.8 Renamed from get_languages(). * @access public * @param string $key (optional) The language locale. * @return mixed */ public function get_data( $key = '-1' ) { if ( ! is_string( $key ) ) { return false; } if ( '-1' === $key ) { $key = null; } return $this->store->get_languages( $key ); } /** * Main Instance. * * Ensures only one instance of this class is loaded or can be loaded. * * @since 1.7.5 * @access public * @static * @param \VAA_View_Admin_As $caller The referrer class. * @return \VAA_View_Admin_As_Languages $this */ public static function get_instance( $caller = null ) { if ( is_null( self::$_instance ) ) { self::$_instance = new self( $caller ); } return self::$_instance; } } // End class VAA_View_Admin_As_Languages.