You can use the LoadControl-method to load a UserControl dynamically. See this sample for details.
So in your case, you would have code like this in the CodeBehind (Page Init or Load) of your page:
MyUserControlType ctrl;
if (Session["lang"] == "en-US")
ctrl = (MyUserControl) LoadControl("~/PathToUserControl/eng.ascx");
else if (Session["lang"] == "es-ES")
ctrl = (MyUserControl) LoadControl("~/PathToUserControl/span.ascx");
else
ctrl = null;
if (ctrl != null)
{
// Initialize properties of ctrl
Controls.Add(ctrl);
}
Instead of having a long list of ifs or a switch statement, you could name your UserControls after a certain pattern and store a suffix in the session:
string userCtrlSuffix = ((string) Session["UserControlSuffix"]) ?? "Eng";
MyUserControlType ctrl = (MyUserControl) LoadControl("~/PathToUserControl/UserControl" + userCtrlSuffix + ".ascx");
// Initialize properties of ctrl
Controls.Add(ctrl);
As @samy mentioned in the comments, loading controls dynamically needs to happen early in the page lifecycle in order to handle ViewState correctly and hook up event handlers properly.