As of PHP 4.3.x you can use multiple parameters with setlocale(). So, you can set the stage by allowing a user to pick their language (like 'English - GB') and then have the system basically guess which thing to pick:
// user pref stores 'en_gb' in the table - so ulimate you could have
$user_pref['lang'] = 'en_gb';
// part of a bigger list we'll presume
$lang['en_gb'] = array('en_GB.UTF-8', 'en_GB', 'en_UK', 'eng', 'en', 'english-uk');
// let's hope it works
$locale = setlocale(LC_ALL, $lang[$user_pref['lang']]);
Certainly, some kind of checks would need to be tossed in there, but oh well.
Ugh, messiness abounds.