Multilingual website with a database
Too many Language Repetitions

You use the "Language" key a lot. What if you decide to rename it sometime? You'll need to search everywhere for this string. It'd be better if you encapsulated it or used a constant. I prefer extensions so it might look like this where you try to get the cookie and if it is not null ? then you get the value.

public static class HttpCookieCollectionExtensions
{
    public static string Language(this HttpCookieCollection cookies)
    {
        return cookies["Language"]?.Value
    }
}


Later in your application you can reuse it everywhere which would result in a nice short and clear code ba also getting rid of this ugly condition:


 if (cookie != null &amp;&amp; cookie.Value != null) 





Bug 1


else
{
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");

}



There is a bug in this else. Both lines are the same. Did you copy/paste them?



Setting culture

Another case for encapsulation are the four lines where you set the culture. Just write a new method and put two of them there:

public static void SetCulture(string name)
{
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(name);
}




Default culture

Later you should also add a constant for the default cutlure 

const string DefaultCulture = "en";


New event handler

Now put everything together and be happy with this pretty nice two-liner event handler:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var language = HttpContext.Current.Request.Cookies.Language() ?? DefaultCulture;
    SetCulture(language);
}




Object initializer

You can also shorten the ChangeLanguage method by using an object initializer. This means that you replace this three lines


HttpCookie cookie = new HttpCookie("Language");
cookie.Value = LanguageAbbrevation;
Response.Cookies.Add(cookie);



with simply this

Response.Cookies.Add(new HttpCookie("Language")
{
    Value = LanguageAbbrevation
});




Bug 2

There is one more bug in your application. When you check for the LanguageAbbrevation here you don't set it to any default value if it's null. Consequently setting the cookie to nothing. Why don't you use en here or skip setting the cookie by putting it inside the if?


public ActionResult ChangeLanguage(String LanguageAbbrevation)
{
  if (LanguageAbbrevation != null)
  {
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguageAbbrevation);
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageAbbrevation);

  }
  Response.Cookies.Add(new HttpCookie("Language")
  {
      Value = LanguageAbbrevation
  });
  return RedirectToAction("Index", "Home");

}