array_diff(a1, a2) will return an array of a1 values which are not in a2. So converting $lang to an array value as array($lang) and taking array difference will give you the desired values
You are also missing an </a>
at the first <a href=
$url_langs=array('fra','cat','hun'...); //CURRENT LANGS in use
$all_langs=array('eng','fra','por','ser','cat','dan','hun','fin','est','esl',...);
foreach($all_langs as $lang){
echo (in_array($lang,$url_langs)) ?
'<a href="'
. implode('|',array_diff($url_langs, array($lang)))
. '">' . $lang . '</a></b> ' :
'<a href="'
. implode('|',$url_langs) . '|' . $lang . '">' . $lang . '</a> ';
}