From 67da548b4828e4e7d5a10c38478c3656e1305bac Mon Sep 17 00:00:00 2001 From: Jun Pataleta Date: Fri, 22 Oct 2021 20:50:44 +0800 Subject: [PATCH] MDL-72885 output: Add lang attribute for language menu items --- lib/classes/output/language_menu.php | 22 +++++++++++++++++-- .../user_action_menu_submenu_items.mustache | 3 ++- lib/tests/output/language_menu_test.php | 13 +++++++++-- theme/boost/templates/language_menu.mustache | 3 ++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/classes/output/language_menu.php b/lib/classes/output/language_menu.php index 36384725a18..846362bbe5e 100644 --- a/lib/classes/output/language_menu.php +++ b/lib/classes/output/language_menu.php @@ -96,6 +96,14 @@ class language_menu implements \renderable, \templatable { // Add the lang picker if needed. foreach ($this->langs as $langtype => $langname) { $isactive = $langtype == $this->currentlang; + $attributes = []; + if (!$isactive) { + // Set the lang attribute for languages different from the page's current language. + $attributes[] = [ + 'key' => 'lang', + 'value' => get_html_lang_attribute_value($langtype), + ]; + } $node = [ 'title' => $langname, 'text' => $langname, @@ -103,6 +111,9 @@ class language_menu implements \renderable, \templatable { 'isactive' => $isactive, 'url' => $isactive ? new \moodle_url('#') : new \moodle_url($this->page->url, ['lang' => $langtype]), ]; + if (!empty($attributes)) { + $node['attributes'] = $attributes; + } $nodes[] = $node; @@ -135,8 +146,15 @@ class language_menu implements \renderable, \templatable { } $langmenu->set_menu_trigger($menuname); foreach ($languagedata['items'] as $node) { - $lang = new \action_menu_link_secondary($node['url'], null, $node['title'], - ['data-lang' => $node['url']->get_param('lang')]); + $langparam = $node['url']->get_param('lang'); + $attributes = []; + if ($langparam) { + $attributes = [ + 'data-lang' => $langparam, + 'lang' => $langparam, + ]; + } + $lang = new \action_menu_link_secondary($node['url'], null, $node['title'], $attributes); $langmenu->add($lang); } return $langmenu->export_for_template($output); diff --git a/lib/templates/user_action_menu_submenu_items.mustache b/lib/templates/user_action_menu_submenu_items.mustache index 605ab867116..35a25e3eeea 100644 --- a/lib/templates/user_action_menu_submenu_items.mustache +++ b/lib/templates/user_action_menu_submenu_items.mustache @@ -41,7 +41,8 @@ }} {{#items}} {{#link}} - + {{text}} {{/link}} diff --git a/lib/tests/output/language_menu_test.php b/lib/tests/output/language_menu_test.php index eccf12e974e..7587227f8f3 100644 --- a/lib/tests/output/language_menu_test.php +++ b/lib/tests/output/language_menu_test.php @@ -72,10 +72,19 @@ class language_menu_test extends \advanced_testcase { // Assert that the number of language menu items matches the number of the expected items. $this->assertEquals(count($expected['items']), count($response['items'])); foreach ($expected['items'] as $expecteditem) { + $lang = $expecteditem['lang']; // We need to manually generate the url key and its value in the expected item array as this cannot // be done in the data provider due to the change of the state of $PAGE. - $expecteditem['url'] = $expecteditem['isactive'] ? new \moodle_url('#') : - new \moodle_url($PAGE->url, ['lang' => $expecteditem['lang']]); + if ($expecteditem['isactive']) { + $expecteditem['url'] = new \moodle_url('#'); + } else { + $expecteditem['url'] = new \moodle_url($PAGE->url, ['lang' => $lang]); + // When the language menu item is not the current language, it will contain the lang attribute. + $expecteditem['attributes'][] = [ + 'key' => 'lang', + 'value' => $lang + ]; + } // The lang value is only used to generate the url, so this key can be removed. unset($expecteditem['lang']); diff --git a/theme/boost/templates/language_menu.mustache b/theme/boost/templates/language_menu.mustache index 305f8a85c63..b3f77d2d9e7 100644 --- a/theme/boost/templates/language_menu.mustache +++ b/theme/boost/templates/language_menu.mustache @@ -53,7 +53,8 @@