Contribution page validation errors display and confirmation screen switch to default language instead of remaining in the current language
This was a configuration error on our part. Clean URLs was not fully functional - the language prefix was missing from the beginning of non-clean URLs so the final URLs were resolving to only the default language.

Adding $conf['clean_url'] = 1; to the settings file resolves the issue.

Thank you @bgm for helping with the demo site so that we could narrow this down to an issue with our site specifically.