Django provides LocaleMiddleware that does most of what you are after:
Enables language selection based on data from the request. It
customizes content for each user. See the internationalization
documentation.
The method it uses to guess the language is the same that is used by the translation machinery; that is it looks for a django_language
variable in the session, if that exists and is a valid language, it will set that language for the request. See how django discovers language preference.
Once you enable LocaleMiddleware
and set django_language
from the user's profile at your login view everything should work.