Skip to main content
Bounty Ended with 100 reputation awarded by kaiser
added 154 characters in body
Source Link
Stephen Harris
  • 32.6k
  • 6
  • 84
  • 118
class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';
    
    /**
     * Hook the functions
     */
    public function __construct(){
    
        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }
    
    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }
    
    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }
    
    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
         $name = self::$name;
         $locale = get_locale();
        
        $files$langs = globget_available_languages(WP_LANG_DIR.'/??_??.mo');
        $langs=array('en_US');
   $langs[] = 'en_US';

   
       //For the foreachlabels ($files as $fileformat_code_lang){
         require_once( ABSPATH . $langs[]=basename($file,''wp-admin/includes/ms.mo'php');
        }
        
        $html = "<form method='post'> ";
         $html .= "<select name='{$name}'>";
            foreach($langs as $lang){
              $label = format_code_lang( $lang );
              $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$lang$label}</option>";
            }
         $html .= "</select>";
         $html .= get_submit_button('Change Language','secondary', 'submit', true);
         $html .= "</form >";
        
         return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();
class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';
    
    /**
     * Hook the functions
     */
    public function __construct(){
    
        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }
    
    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }
    
    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }
    
    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
        $name = self::$name;
        $locale = get_locale();
        
        $files = glob(WP_LANG_DIR.'/??_??.mo');
        $langs=array('en_US');
        
         foreach ($files as $file){
            $langs[]=basename($file,'.mo');
        }
        
        $html = "<form method='post'> ";
        $html .= "<select name='{$name}'>";
            foreach($langs as $lang){
                $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$lang}</option>";
            }
        $html .= "</select>";
        $html .= get_submit_button('Change Language','secondary', 'submit', true);
        $html .= "</form >";
        
        return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();
class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';
    
    /**
     * Hook the functions
     */
    public function __construct(){
    
        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }
    
    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }
    
    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }
    
    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
         $name = self::$name;
         $locale = get_locale();
         $langs = get_available_languages();
         $langs[] = 'en_US';

         //For the labels (format_code_lang)
         require_once( ABSPATH . 'wp-admin/includes/ms.php');

         $html = "<form method='post'> ";
         $html .= "<select name='{$name}'>";
         foreach($langs as $lang){
              $label = format_code_lang( $lang );
              $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$label}</option>";
        }
         $html .= "</select>";
         $html .= get_submit_button('Change Language','secondary', 'submit', true);
         $html .= "</form >";

         return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();
Source Link
Stephen Harris
  • 32.6k
  • 6
  • 84
  • 118

By far the best (easiest) way is to use the locale filter (inside get_locale()).

First set up a quick function for retrieving a different language to use on the locale filter.

/**
 * A function returns with returns the user's selectd locale, if stored. 
 */
function wpse35622_get_new_locale($locale=false){
$new_locale = get_user_meta(get_current_user_id(), 'wpse_locale', true);
    if($new_locale)
        return $new_locale;

    return $locale;
}

I've left this as a global function, might be handy...? The rest of the plug-in I've wrapped inside a class.

It creates a drop-down of possible languages from which you can select.

Drawbacks

  • Searches wp-content/languages for files of the form xx_xx.mo. If it's not of that form (not all .mo files are) the plug-in won't pick up on it!
  • The drop down gives a list of the found locales to choose from, but these are displayed in the 'xx_xx` format of locales, not a human friendly way - any ideas??
  • Does $locale do anything other than language? If so it's still possible to get the locale the same, but provide alternative translations. It's a lot messier though...

The code

class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';
    
    /**
     * Hook the functions
     */
    public function __construct(){
    
        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }
    
    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }
    
    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }
    
    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
        $name = self::$name;
        $locale = get_locale();
        
        $files = glob(WP_LANG_DIR.'/??_??.mo');
        $langs=array('en_US');
        
        foreach ($files as $file){
            $langs[]=basename($file,'.mo');
        }
        
        $html = "<form method='post'> ";
        $html .= "<select name='{$name}'>";
            foreach($langs as $lang){
                $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$lang}</option>";
            }
        $html .= "</select>";
        $html .= get_submit_button('Change Language','secondary', 'submit', true);
        $html .= "</form >";
        
        return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();