content_language_no_outbound
This module provides a language negotiator similar to Drupal's "content language" language negotiator. It uses the language_content_entity query parameter to determine the language of the content, but - different from Drupal's content language negotiator - it will never add that query parameter to outbound paths (i.e. any links on the page). It therefore leaves setting the parameter to other modules, as it makes no assumptions about when the query parameter should actually be used.
Features
This module provides a content language detection that does not alter any outbound URLs (links) and therefore does not interfere with your language switching mechanism. It only reads the content language from the language_content_entity query parameter without setting it.
The intended use case is that in the admin backend you want to be able to edit node translations without changing the interface language (via language_content_entity), but in the frontend, the language switcher should only ever change the interface language, not the content language. Drupal's content language negotiator alters the language switcher's behavior in that it will not change the interface language when on a node page, but the content language, because it makes some assumptions about when the language switcher should switch the interface language and when it should change the content language. This module leaves the logic about what language to change where to other modules, as it just never interferes with the language switching methods.
Post-Installation
On the configuration page for detection and selection of languages, enable "Content language (no outbound)" for content language detection (and disable "Content language", you don't want both).