Cambia la lingua dell'amministratore in base all'utente (nel sito singolo)


9

Sto cercando di creare un piccolo plugin da installare in alcuni siti di un client tedesco.

Posso fare il giro di WordPress in tedesco, ma sarebbe più facile se fosse in inglese.

C'è un plugin che gestisce questo ( WP Native Dashboard ) e anche se lo fa meravigliosamente, è troppo pesante per quello di cui ho bisogno. Il cliente non ne ha bisogno, lo faccio.
Ho provato a emularlo inutilmente ... Memorizza un'opzione di database per verificare lo scambio anziché $current_user. Ma non ho avuto la logica per farlo funzionare.

Quindi, sto cercando di adattare questa soluzione fornita da Toscho , ma sembra che non stia facendo i ganci nei punti corretti del processo di WordPress.

La domanda è: quale bit manca (o sto scherzando) nel seguente codice?

<?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();

Prova admin_init. Quindi rilascia is_admin();e vedi se $current_usercontiene davvero un oggetto secondario denominato data.
Kaiser

@kaiser - admin_initnessuno dei due - e sì, $current_userè popolato, uso FirePHP per il debug ... grazie!
brasofilo,

Ok, ho chiesto se $current_user->dataè popolato :) Plus: funziona senza i controlli?
Kaiser

@kaiser - Ho modificato il codice nella domanda - Funziona se non controllo per $current_user- È abbastanza divertente perché le informazioni sono lì ...
brasofilo

@kaiser - funziona, cosa ne pensi? Grazie!
brasofilo,

Risposte:


8

Ok, finalmente sono arrivato al nocciolo del concetto base di WP Native Dashboard e ora funziona.

Il file viene utilizzato come un mu-plugin, e ogni volta che devo lavorare nel sito lo rinomino da set-user-locale.phpaa set-user-locale.php, e poi di nuovo. Pertanto, l'attivazione e la disattivazione senza che il plug-in sia visibile dal client.

[aggiornamento]
Seguendo il suggerimento di Kaiser, questo plugin compare solo nella lista dei plugin per l'utente definito all'avvio della classe (la stessa per cui viene cambiata la lingua).
Il plug-in si trova ora alla radice della normale cartella dei plug-in.

[aggiornamento 2]
Nuova versione: si occupa solo del nocciolo della domanda. Per la parte nascosta sto usando un'altra tecnica . Poiché la versione 1.2 aveva il difetto di nascondersi automaticamente solo quando era attiva.

<?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' ) );

Fare clic non de-/activatesarebbe più semplice? ;) Va bene vederlo funzionare. +1
kaiser,

1
@kaiser - bella ispirazione ma ho finito con questo altro filtro ... e aggiornato il codice, ora è fluido e pronto a partire; o)
brasofilo,

1
Questo è davvero pulito. Mi chiedo se funzionerebbe per WPMS? Questo sarebbe fantastico per i team multilingue. Grazie!
moraleida,

1
@moraleida: sì, lo fa! Appena testato come mu-plugin e con due utenti superamministratori.
brasofilo,

1
Eccezionale! Voterei questo due volte se potessi. :)
moraleida,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.