उपयोगकर्ता के आधार पर व्यवस्थापक भाषा बदलें (एकल-साइट में)


9

मैं एक जर्मन ग्राहक की कुछ साइटों में स्थापित करने के लिए एक छोटा सा प्लगइन बनाने की कोशिश कर रहा हूँ।

मैं जर्मन में वर्डप्रेस के आसपास अपना रास्ता बना सकता हूं, लेकिन अगर यह अंग्रेजी में होता तो आसान होता।

वहाँ एक प्लगइन है जो इस ( WP देशी डैशबोर्ड ) का प्रबंधन करता है और यद्यपि यह आश्चर्यजनक रूप से करता है, यह मेरी आवश्यकता के लिए बहुत भारी वजन है। ग्राहक को इसकी आवश्यकता नहीं है, मैं करता हूँ।
कोई फायदा नहीं हुआ इसका अनुकरण करने की कोशिश की ... इसके बजाय स्वैपिंग के लिए जाँच करने के लिए एक डेटाबेस विकल्प संग्रहीत करता है $current_user। लेकिन मुझे इसके लिए काम करने का तर्क नहीं मिला।

इसलिए, मैं toscho द्वारा दिए गए इस समाधान को अनुकूलित करने का प्रयास कर रहा हूं , लेकिन लगता है कि मैं वर्डप्रेस प्रक्रिया के सही बिंदुओं में हुक नहीं बना रहा हूं।

सवाल यह है कि निम्नलिखित कोड में कौन सा बिट गायब है (या मैं गड़बड़ कर रहा हूं) ?

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

कोशिश करो admin_init। फिर ड्रॉप करें is_admin();और देखें कि $current_userक्या वास्तव में एक उप ऑब्जेक्ट नामित है data
कासर

@kaiser - नहीं, admin_initन ही - और हाँ, $current_userआबाद है, मैं डीबगिंग के लिए FirePHP का उपयोग करता हूं ... धन्यवाद!
ब्रासोफिलो

ठीक है, मैंने पूछा कि $current_user->dataक्या आबादी है :) प्लस: क्या यह चेक w / o काम करता है?
कासर

@kaiser - मैंने प्रश्न में कोड को संशोधित किया है - यह काम करता है अगर मैं इसके लिए जांच नहीं करता हूं $current_user- यह काफी हास्यास्पद है क्योंकि जानकारी है ...
ब्रासाफिलो

@kaiser - यह काम कर रहा है, आपको क्या लगता है? धन्यवाद!
ब्रासोफिलो

जवाबों:


8

ठीक है, अंत में WP मूल डैशबोर्ड मूल अवधारणा के मूल में आ गया और अब यह काम कर रहा है।

फ़ाइल एक के रूप में इस्तेमाल किया जा रहा है mu-plugin, और मैं से इसका नाम बदलना जब भी मैं साइट में काम करने के लिए है set-user-locale.phpaकरने के लिए set-user-locale.php, और उसके बाद फिर से वापस। इस प्रकार क्लाइंट की दृष्टि में प्लगइन के बिना सक्रिय और निष्क्रिय करना।

[अद्यतन]
kaiser के संकेत के बाद, यह प्लगइन केवल क्लास शुरू करते समय परिभाषित उपयोगकर्ता के लिए प्लगइन्स सूची में दिखाता है (वही जिसके लिए भाषा बदली जाती है)।
प्लगइन अब नियमित प्लगइन्स फ़ोल्डर की जड़ में स्थित है।

[अद्यतन २]
नया संस्करण: केवल प्रश्न के मूल से संबंधित है। छिपने वाले हिस्से के लिए मैं एक और तकनीक का उपयोग कर रहा हूं । संस्करण 1.2 के रूप में सक्रिय होने पर केवल ऑटो-छिपाने का दोष था।

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

बस क्लिक de-/activateकरना आसान नहीं होगा ? ;) यह काम देखकर ठीक है। +1
केसर

1
@kaiser - अच्छी प्रेरणा, लेकिन इस अन्य फ़िल्टर का उपयोग करके समाप्त हो गया ... और कोड को अपडेट किया, अब यह चिकनी है और रोल करने के लिए तैयार है; ओ)
ब्रसोफिलो

1
यह काफी साफ सुथरा है। मुझे आश्चर्य है कि क्या यह WPMS के लिए काम करेगा? यह बहुभाषी टीमों के लिए बहुत बढ़िया होगा। धन्यवाद!
मोरेलिडा

1
@ मोरेलिडा: हाँ, यह करता है! बस एक म्यू-प्लगइन के रूप में और दो सुपर-एडमिन उपयोगकर्ताओं के साथ परीक्षण किया गया।
ब्रासोफिलो

1
बहुत बढ़िया! अगर मैं कर सकता तो मैं इसे दो बार बढ़ाऊंगा। :)
मोरेलिडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.