Change locale manually at runtime?

I’m trying to do a similiar thing, and the experts on the wp-hackers mailing list (Otto, Nacin) told me this:

Don’t try to change WPLANG, you can’t change a define’d constant.
Instead, change the global $locale, or put a filter on ‘locale’.

So the best solution is to apply a filter on the ‘locale’ global variable. The only way to do that is by creating a custom plugin. If you put the following piece of code into your functions.php file, it won’t work properly because it will run too late in the WP loading sequence.

Your plugin could look like this (I’m just reusing the URI testing part from OneTrickPony, you can replace it with another conditional testing method):

<?php
/*
Plugin Name: Change locale at runtime
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/

function wpsx_redefine_locale($locale) {
    // run your tests on the URI
        $lang = explode("https://wordpress.stackexchange.com/", $_SERVER['REQUEST_URI']);
        // here change to english if requested
        if(array_pop($lang) === 'en'){
          $locale="en_US";
        // otherwise stick to your default language
        }else{
          $locale="gr_GR";
        }
    return $locale;
}
add_filter('locale','wpsx_redefine_locale',10);  
?>

I hope this can help anyone!

A few more warnings (quoting Andrew Nacin), regarding the cost in terms of performance when switching the locale:

It is possible to “switch out” a locale after the default locale is
loaded, but I would advise against that as it is inefficient, unless
your default language is English, in which case it is not so bad.

Default textdomain files are loaded after plugins_loaded and
setup_theme, but before the theme is loaded and before
after_setup_theme fires. Loading English then re-loading the
textdomain into German on the init hook would be fine,
performance-wise, as English has no mo files. But loading Spanish by
default then switching to German would not.

See http://codex.wordpress.org/Plugin_API/Action_Reference for useful info about the loading sequence.

Leave a Comment