/**
  * Negotiates the application language.
  *
  * @param Request $request
  * @return string the chosen language
  */
 protected function negotiateLanguage($request)
 {
     if (!empty($this->languageParam) && ($language = $request->get($this->languageParam)) !== null) {
         if (isset($this->languages[$language])) {
             return $this->languages[$language];
         }
         foreach ($this->languages as $key => $supported) {
             if (is_int($key) && $this->isLanguageSupported($language, $supported)) {
                 return $supported;
             }
         }
         return reset($this->languages);
     }
     foreach ($request->getAcceptableLanguages() as $language) {
         if (isset($this->languages[$language])) {
             return $this->languages[$language];
         }
         foreach ($this->languages as $key => $supported) {
             if (is_int($key) && $this->isLanguageSupported($language, $supported)) {
                 return $supported;
             }
         }
     }
     return reset($this->languages);
 }