Changer la langue d'administration en fonction de l'utilisateur (sur un seul site)

9

J'essaie de faire un petit plugin à installer sur certains sites d'un client allemand.

Je peux me déplacer dans WordPress en allemand, mais ce serait plus facile s'il était en anglais.

Il y a un plugin qui gère cela ( WP Native Dashboard ) et bien qu'il le fasse à merveille, c'est trop lourd pour ce dont j'ai besoin. Le client n'a pas besoin de ça, j'en ai besoin.
J'ai essayé de l'émuler en vain ... Il stocke une option de base de données pour vérifier la permutation au lieu de $current_user. Mais je n'ai pas eu la logique pour que cela fonctionne.

Donc, j'essaie d'adapter cette solution donnée par toscho , mais on dirait que je ne fais pas les crochets aux bons points du processus WordPress.

La question est: quel bit manque (ou je suis en train de déconner) dans le code suivant?

<?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
la source
Essayez admin_init. Ensuite, déposez is_admin();et voyez s'il $current_usercontient vraiment un sous-objet nommé data.
kaiser
@kaiser - admin_initnon , non plus - et oui, $current_userest peuplé, j'utilise FirePHP pour le débogage ... merci!
brasofilo
Ok, j'ai demandé si $current_user->dataest rempli :) Plus: ça marche sans les chèques?
kaiser
@kaiser - J'ai modifié le code dans la question - Ça marche si je ne vérifie pas le $current_user- C'est assez marrant car les infos sont là ...
brasofilo
@kaiser - ça marche, qu'en pensez-vous? Merci!
brasofilo

Réponses:

8

Ok, enfin arrivé au cœur du concept de base de WP Native Dashboard et cela fonctionne maintenant.

Le fichier est utilisé en tant que mu-plugin, et chaque fois que je dois travailler sur le site, je le renomme de set-user-locale.phpaà set-user-locale.php, puis de nouveau. Ainsi, l'activation et la désactivation sans que le plugin ne soit visible par le client.

[mise à jour]
Suivant le conseil de Kaiser, ce plugin n'apparaît que dans la liste des plugins pour l'utilisateur défini lors du lancement de la classe (la même pour laquelle la langue est modifiée).
Le plugin est maintenant situé à la racine du dossier des plugins standard.

[mise à jour 2]
Nouvelle version: ne traite que le cœur de la question. Pour la partie cachée, j'utilise une autre technique . Comme la version 1.2 avait le défaut de ne se cacher que lorsqu'elle était active.

<?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
la source
Ne serait-il pas plus simple de cliquer de-/activate? ;) Très bien le voir fonctionner. +1
kaiser
1
@kaiser - belle inspiration mais a fini d'utiliser cet autre filtre ... et a mis à jour le code, maintenant il est lisse et prêt à rouler; o)
brasofilo
1
C'est vraiment soigné. Je me demande si cela fonctionnerait pour WPMS? Ce serait génial pour les équipes multilingues. Merci!
moralida
1
@moraleida: oui, c'est le cas! Je viens de tester en tant que plugin mu et avec deux utilisateurs super-administrateurs.
brasofilo
1
Impressionnant! Je voterais deux fois si je le pouvais. :)
moraleida