Currently LanguageFactory::getLanguage accepts nearly all language codes and uses them as internal language code because LanguageNameUtils::isValidCode makes only a weak input validation. Example:
> print MediaWiki\MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( 's!r@n%e' )->getCode() s!r@n%e
But some deprecated language codes get replaced:
> print MediaWiki\MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( 'als' )->getCode() gsw
At some places even deprecated language codes are useful like in T315665: Dummy language codes are not usable on Special:AllMessages. Therefor the replacement of deprecated language codes should happen on direct on the input validation of external values like the URL parameter uselang and not in LanguageFactory::getLanguage.