Cambiar el idioma del administrador según el usuario (en un solo sitio)

9

Estoy tratando de hacer un pequeño complemento para instalar en algunos sitios de un cliente alemán.

Puedo recorrer WordPress en alemán, pero sería más fácil si estuviera en inglés.

Hay un complemento que gestiona esto ( WP Native Dashboard ) y, aunque lo hace maravillosamente, es demasiado pesado para lo que necesito. El cliente no necesita esto, yo sí.
Intenté emularlo en vano ... Almacena una opción de base de datos para verificar el intercambio en lugar de $current_user. Pero no entendí la lógica para que esto funcione.

Entonces, estoy tratando de adaptar esta solución dada por toscho , pero parece que no estoy haciendo los ganchos en los puntos correctos del proceso de WordPress.

La pregunta es: ¿qué bit falta (o estoy jugando) en el siguiente código?

<?php
/*
Plugin Name: Set User Locale
Plugin URI: https://wordpress.stackexchange.com/q/53326/12615
Description: changes the admin language according to user_login
Version: 1.0
Author: wordpress-stackexchange
*/

class Wpse53326_ChangeLocaleOnDemand
{

    public function __construct()
    {       
        add_action('admin_init', array(&$this, 'on_init'));
        add_filter( 'locale', array(&$this, 'on_change_language') );
    }

    public function on_init()
    {
    }

    public function on_change_language( $locale )
    {
        global $current_user;       

        // this prints the current user_login without problems 
        // global $firephp; 
        // $firephp->log($current_user->data->user_login,'user_login');

        //  the following works for backend/frontend
        // but if I try this conditional, it don't: if (is_admin() && 'the_user_login' == $current_user->data->user_login)
        if( is_admin() )
        {
            return 'en_US';         
        }
        return $locale;
    }
}

$wpse53326_ChangeLocaleOnDemand_instance = new Wpse53326_ChangeLocaleOnDemand();
brasofilo
fuente
Tratar admin_init. Luego suelte is_admin();y vea si $current_userrealmente contiene un subobjeto llamado data.
Kaiser
@kaiser - admin_initno , ninguno - y sí, $current_userestá poblado, uso FirePHP para depurar ... ¡gracias!
brasofilo
Ok, pregunté si $current_user->dataestá lleno :) Además: ¿funciona sin los cheques?
Kaiser
@kaiser - Modifiqué el código en la pregunta - Funciona si no busco el $current_user- Es bastante divertido porque la información está ahí ...
brasofilo
@kaiser: lo tengo funcionando, ¿qué te parece? ¡Gracias!
brasofilo

Respuestas:

8

Ok, finalmente llegué al núcleo del concepto básico de WP Native Dashboard y está funcionando ahora.

El archivo se está utilizando como mu-plugin, y cada vez que tengo que trabajar en el sitio, le cambio el nombre set-user-locale.phpaa set-user-locale.php, y luego lo vuelvo a usar . Activando y desactivando así sin que el complemento esté a la vista del cliente.

[actualización]
Siguiendo la sugerencia de kaiser, este complemento solo aparece en la lista de complementos para el usuario definido al iniciar la clase (el mismo para el que se cambia el idioma).
El complemento ahora se encuentra en la raíz de la carpeta de complementos normales.

[actualización 2]
Nueva versión: trata solo con el núcleo de la pregunta. Para la parte oculta estoy usando otra técnica . Como la versión 1.2 tenía la falla de solo ocultarse automáticamente cuando estaba activa.

<?php
/*
Plugin Name: Admin interface in English for selected users
Plugin URI: https://wordpress.stackexchange.com/a/52436/12615
Description: Edit this file to add/remove users from the list
Version: 1.5
Author: Rodolfo Buaiz
*/

class Wpse53326_ChangeLocaleOnDemand
{

    public function __construct( $the_user )
    {       
        $this->user = $the_user;
        add_filter( 'locale', array( $this, 'on_change_language' ) );
   }

    public function on_change_language( $loc )
    {
        if ( !is_admin() )
         return $loc;

        if ( function_exists( 'wp_get_current_user' ) ) 
        {
            $u = wp_get_current_user();
            if ( !isset($u->user_locale) ) 
            {
                if ( in_array( $u->data->user_login, $this->user ) )
                    $u->user_locale = '';
                else
                    $u->user_locale = 'de_DE';
            }
            return $u->user_locale;
        }

        return $loc;
    }

}

new Wpse53326_ChangeLocaleOnDemand( array( 'user1', 'User2' ) );
brasofilo
fuente
¿No de-/activatesería más fácil hacer clic ? ;) Bien verlo funcionar. +1
kaiser
1
@kaiser: buena inspiración, pero terminé usando este otro filtro ... y actualicé el código, ahora es suave y está listo para rodar; o)
brasofilo
1
Esto es realmente limpio. Me pregunto si funcionaría para WPMS? Esto sería genial para equipos multilingües. ¡Gracias!
moraleida
1
@moraleida: sí, lo hace! Acabo de probarlo como un plugin mu y con dos usuarios súper administradores.
brasofilo
1
¡Increíble! Votaría esto dos veces si pudiera. :)
moraleida