371 lines
8.5 KiB
PHP
371 lines
8.5 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* View Admin As - Language switcher
|
||
|
|
*
|
||
|
|
* @author Jory Hogeveen <info@keraweb.nl>
|
||
|
|
* @package View_Admin_As
|
||
|
|
*/
|
||
|
|
|
||
|
|
if ( ! defined( 'VIEW_ADMIN_AS_DIR' ) ) {
|
||
|
|
die();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Language switcher add-on.
|
||
|
|
*
|
||
|
|
* @author Jory Hogeveen <info@keraweb.nl>
|
||
|
|
* @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.
|