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