Simple Multilanguage Switcher

Assuming you’re talking about the front-end and you have your strings properly internationalized, you just need to insert the load_theme_textdomain() function to tell wordpress where are your .po files.

this is how the Toolbox Theme does it:

/**
 * Make theme available for translation
 * Translations can be filed in the /languages/ directory
 * If you're building a theme based on martins, use a find and replace
 * to change 'martins' to the name of your theme in all the template files
 */
load_theme_textdomain( 'martins', TEMPLATEPATH . '/languages' );

$locale = get_locale();
$locale_file = TEMPLATEPATH . "/languages/$locale.php";
if ( is_readable( $locale_file ) )
    require_once( $locale_file );

UPDATE:

i once played with changing users locale to do that automatically, getting the users language from the $_SERVER superglobal.

i came up with this, but it’s not working yet. Maybe you can work from it.

WARNING: THIS IS UNTESTED AND MIGHT BEHAVE WEIRDLY OR EVEN BREAK YOUR SITE, BE CAREFUL

function rm_get_locale($lang) {
    global $locale;
    // This gets the users' primary browser settings for acceptable languages
    // and transforms the string so it looks like en_US or pt_BR rather than
    // en-us and pt-br. It takes only the first value returned, no all of them.
    $langcode = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    $langcode = explode(",", $langcode['0']);
    $langcode = $langcode['0'];
    $langcode = preg_split('/-/', $langcode);
    $upper = strtoupper($langcode[1]);
    $lower = $langcode[0];

    // now we get the native wp locale and the parsed user locale
    $wplocale = get_locale();
    $userlocale = implode('_',array($lower,$upper));

    // compare them and apply the user's locale if they don't match.
    if ($userlocale != $wplocale) {
        return $userlocale;
    } else {
        return $lang;
    }


}
add_filter('locale','rm_get_locale');

error code: 523