@@ -373,13 +373,13 @@ public function parseRule(&$router, &$uri)
373373 } elseif ($ this ->params ->get ('remove_default_prefix ' , 0 )) {
374374 // We don't have a prefix for the default language
375375 $ uri ->setVar ('lang ' , $ this ->default_lang );
376- } else {
376+ } elseif (! isset ( $ this -> sefs [ $ lang ])) {
377377 // No language is set, so we want to redirect to the right language
378378 $ router ->setTainted ();
379379 }
380380
381381 // The language was set both per SEF path and per query parameter. Query parameter takes precedence
382- if ($ lang ) {
382+ if ($ lang && isset ( $ this -> sefs [ $ sef ]) ) {
383383 $ uri ->setVar ('lang ' , $ lang );
384384 $ router ->setTainted ();
385385 }
@@ -422,8 +422,18 @@ public function setLanguageApplicationState(&$router, &$uri)
422422
423423 // Our parse rule discovered a language
424424 if ($ uri ->hasVar ('lang ' )) {
425- $ lang_code = $ uri ->getVar ('lang ' );
426- } else {
425+ $ uri_lang_code = $ uri ->getVar ('lang ' );
426+
427+ // Check whether the tag exists, first check for full language tag, then for short tag
428+ if (isset ($ this ->lang_codes [$ uri_lang_code ])) {
429+ $ lang_code = $ uri_lang_code ;
430+ } elseif (isset ($ this ->sefs [$ uri_lang_code ])) {
431+ // Check for short language tag
432+ $ lang_code = $ this ->sefs [$ uri_lang_code ]->lang_code ;
433+ }
434+ }
435+
436+ if (!$ lang_code ) {
427437 /**
428438 * We don't know the language yet and want to discover it.
429439 * If we remove the default prefix, call by POST or have nolangfilter set,
0 commit comments