Typically I would go into Global.asax.cs and add the code to set context language / culture and commerce price group / currency from a cookie (if available) in the session_start event.
I see multiple posts which do not recommend altering global.asax now for Sitecore and use pipelines instead.
I see a pipeline for SessionEnd in showconfig.aspx - but none for SessionStart - would you know where I should add this? I also saw this: https://sitecorejohn.wordpress.com/2008/11/19/overriding-sitecores-logic-to-determine-the-context-language/ but this would execute on every http request.
I could check if session exists and only them execute the code, (as suggested here: https://stackoverflow.com/questions/38308613/sitecore-session-started-pipeline) but it would still run the check on every http request anyhow? Is there a way around this?