단일 사이트에서 사용자를 기준으로 관리 언어 변경


9

독일 클라이언트의 일부 사이트에 설치할 작은 플러그인을 만들려고합니다.

독일어로 WordPress를 둘러 볼 수는 있지만 영어로되어 있으면 더 쉬울 것입니다.

이것을 관리하는 플러그인 ( WP Native Dashboard )이 있으며 훌륭하게 수행하지만 필요한 것에 너무 무겁습니다. 클라이언트는 이것을 필요로하지 않습니다.
아무 소용이없이 에뮬레이션하려고 시도했습니다 ... 대신 스왑을 확인하는 데이터베이스 옵션이 저장됩니다 $current_user. 그러나 나는 이것이 작동하는 논리를 얻지 못했습니다.

그래서 toscho가 제공 한이 솔루션 을 적용하려고 하지만 WordPress 프로세스의 올바른 지점에서 후크를 만들지 않는 것처럼 보입니다.

문제는 다음 코드에서 어떤 비트가 누락되었거나 엉망 입니까?

<?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_userdata
카이저

@kaiser-아니, admin_init아니-그리고 $current_user그래도 채워진다. 나는 디버깅을 위해 FirePHP를 사용한다 ... 고마워!
brasofilo

좋아, 나는 $current_user->data채워 졌는지 물었다. :) Plus : 수표없이 작동합니까?
카이저

@kaiser-질문의 코드를 수정했습니다.-확인하지 않으면 작동합니다 $current_user.- 정보가 있기 때문에 꽤 재밌 습니다 ...
brasofilo

@kaiser-작동 시켰습니다. 어떻게 생각하십니까? 감사!
brasofilo

답변:


8

좋아, 마침내 WP Native Dashboard 기본 개념 의 핵심에 도달 했으며 현재 작동하고 있습니다.

파일이로 사용 중이며 mu-plugin사이트에서 작업해야 할 때마다 파일 이름을에서 (으) set-user-locale.phpa로 변경 set-user-locale.php한 다음 다시 되돌립니다. 따라서 플러그인이 클라이언트에게 보이지 않고 활성화 및 비활성화됩니다.

[update]
kaiser의 힌트에 따라이 플러그인은 클래스를 시작할 때 정의 된 사용자 (언어가 변경되는 것과 동일한)의 플러그인 목록에만 표시됩니다.
플러그인은 이제 일반 플러그인 폴더의 루트에 있습니다.

[업데이트 2]
새 버전 : 질문의 핵심 만 다룹니다. 숨는 부분에는 다른 기술을 사용하고 있습니다. 버전 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
kaiser

1
@kaiser-좋은 영감을 주었지만 이 다른 필터를 사용하여 끝내고 ... 코드를 업데이트했습니다. 이제 매끄럽고 굴릴 준비가되었습니다. o)
brasofilo

1
이것은 매우 깔끔합니다. WPMS에서 작동하는지 궁금합니다. 이것은 다국어 팀에게는 최고 일 것입니다. 감사!
moraleida

1
@ moraleida : 예, 그렇습니다! mu-plugin과 두 명의 최고 관리자로 테스트했습니다.
brasofilo

1
대박! 내가 할 수 있다면 나는 이것을 두 번 공표했다. :)
moraleida 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.