diff --git a/lib/classes/output/language_menu.php b/lib/classes/output/language_menu.php index 846362bbe5e..a6cb9cf7376 100644 --- a/lib/classes/output/language_menu.php +++ b/lib/classes/output/language_menu.php @@ -151,7 +151,7 @@ class language_menu implements \renderable, \templatable { if ($langparam) { $attributes = [ 'data-lang' => $langparam, - 'lang' => $langparam, + 'lang' => get_html_lang_attribute_value($langparam), ]; } $lang = new \action_menu_link_secondary($node['url'], null, $node['title'], $attributes); diff --git a/lib/tests/weblib_test.php b/lib/tests/weblib_test.php index 98d25d2160f..4dc96ae6548 100644 --- a/lib/tests/weblib_test.php +++ b/lib/tests/weblib_test.php @@ -1163,9 +1163,10 @@ EXPECTED; */ public function get_html_lang_attribute_value_provider() { return [ - 'Empty lang code' => [' ', 'unknown'], + 'Empty lang code' => [' ', 'en'], 'English' => ['en', 'en'], - 'English, US' => ['en_us', 'en-us'], + 'English, US' => ['en_us', 'en'], + 'Unknown' => ['xx', 'en'], ]; } diff --git a/lib/weblib.php b/lib/weblib.php index 733ea344b8a..41f9c629b44 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -2283,11 +2283,19 @@ function highlightfast($needle, $haystack) { * @return string */ function get_html_lang_attribute_value(string $langcode): string { - if (empty(trim($langcode))) { - // If the language code passed is an empty string, return 'unknown'. - return 'unknown'; + $langcode = clean_param($langcode, PARAM_LANG); + if ($langcode === '') { + return 'en'; } - return str_replace('_', '-', $langcode); + + // Grab language ISO code from lang config. If it differs from English, then it's been specified and we can return it. + $langiso = (string) (new lang_string('iso6391', 'core_langconfig', null, $langcode)); + if ($langiso !== 'en') { + return $langiso; + } + + // Where we cannot determine the value from lang config, use the first two characters from the lang code. + return substr($langcode, 0, 2); } /**