mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 06:18:28 +01:00
MDL-60209 mathjax: Fix mapping of the Moodle language to the MathJax
While working on the issue, I noticed that the current implementation of the method filter_mathjaxloader::map_language_code() is suboptimal and does not work well for many Moodle language packs such as pt_br or de_du and other variants. It did not give particularly wrong results. It just fell back to the default English too early without trying more hard. This patch improves the mapping logic and adds a unit test for the method.
This commit is contained in:
parent
b7ab8e4e9b
commit
47cf9455d9
@ -36,55 +36,39 @@ class filter_mathjaxloader extends moodle_text_filter {
|
|||||||
* @return string The MathJax language code.
|
* @return string The MathJax language code.
|
||||||
*/
|
*/
|
||||||
public function map_language_code($moodlelangcode) {
|
public function map_language_code($moodlelangcode) {
|
||||||
$mathjaxlangcodes = array('br',
|
|
||||||
'cdo',
|
|
||||||
'cs',
|
|
||||||
'da',
|
|
||||||
'de',
|
|
||||||
'en',
|
|
||||||
'eo',
|
|
||||||
'es',
|
|
||||||
'fa',
|
|
||||||
'fi',
|
|
||||||
'fr',
|
|
||||||
'gl',
|
|
||||||
'he',
|
|
||||||
'ia',
|
|
||||||
'it',
|
|
||||||
'ja',
|
|
||||||
'ko',
|
|
||||||
'lb',
|
|
||||||
'mk',
|
|
||||||
'nl',
|
|
||||||
'oc',
|
|
||||||
'pl',
|
|
||||||
'pt',
|
|
||||||
'pt-br',
|
|
||||||
'ru',
|
|
||||||
'sl',
|
|
||||||
'sv',
|
|
||||||
'tr',
|
|
||||||
'uk',
|
|
||||||
'zh-hans');
|
|
||||||
$exceptions = array('cz' => 'cs');
|
|
||||||
|
|
||||||
// First see if this is an exception.
|
// List of language codes found in the MathJax/localization/ directory.
|
||||||
if (isset($exceptions[$moodlelangcode])) {
|
$mathjaxlangcodes = [
|
||||||
$moodlelangcode = $exceptions[$moodlelangcode];
|
'ar', 'ast', 'bcc', 'bg', 'br', 'ca', 'cdo', 'ce', 'cs', 'cy', 'da', 'de', 'diq', 'en', 'eo', 'es', 'fa',
|
||||||
|
'fi', 'fr', 'gl', 'he', 'ia', 'it', 'ja', 'kn', 'ko', 'lb', 'lki', 'lt', 'mk', 'nl', 'oc', 'pl', 'pt',
|
||||||
|
'pt-br', 'qqq', 'ru', 'scn', 'sco', 'sk', 'sl', 'sv', 'th', 'tr', 'uk', 'vi', 'zh-hans', 'zh-hant'
|
||||||
|
];
|
||||||
|
|
||||||
|
// List of explicit mappings and known exceptions (moodle => mathjax).
|
||||||
|
$explicit = [
|
||||||
|
'cz' => 'cs',
|
||||||
|
'pt_br' => 'pt-br',
|
||||||
|
'zh_tw' => 'zh-hant',
|
||||||
|
'zh_cn' => 'zh-hans',
|
||||||
|
];
|
||||||
|
|
||||||
|
// If defined, explicit mapping takes the highest precedence.
|
||||||
|
if (isset($explicit[$moodlelangcode])) {
|
||||||
|
return $explicit[$moodlelangcode];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now look for an exact lang string match.
|
// If there is exact match, it will be probably right.
|
||||||
if (in_array($moodlelangcode, $mathjaxlangcodes)) {
|
if (in_array($moodlelangcode, $mathjaxlangcodes)) {
|
||||||
return $moodlelangcode;
|
return $moodlelangcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now try shortening the moodle lang string.
|
// Finally try to find the best matching mathjax pack.
|
||||||
$moodlelangcode = preg_replace('/-.*/', '', $moodlelangcode);
|
$parts = explode('_', $moodlelangcode, 2);
|
||||||
// Look for a match on the shortened string.
|
if (in_array($parts[0], $mathjaxlangcodes)) {
|
||||||
if (in_array($moodlelangcode, $mathjaxlangcodes)) {
|
return $parts[0];
|
||||||
return $moodlelangcode;
|
|
||||||
}
|
}
|
||||||
// All failed - use english.
|
|
||||||
|
// No more guessing, use English.
|
||||||
return 'en';
|
return 'en';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
72
filter/mathjaxloader/tests/filter_test.php
Normal file
72
filter/mathjaxloader/tests/filter_test.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
// This file is part of Moodle - http://moodle.org/
|
||||||
|
//
|
||||||
|
// Moodle is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Moodle is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the {@link filter_mathjaxloader_filter_testcase} class.
|
||||||
|
*
|
||||||
|
* @package filter_mathjaxloader
|
||||||
|
* @category test
|
||||||
|
* @copyright 2017 David Mudrák <david@moodle.com>
|
||||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
|
global $CFG;
|
||||||
|
require_once($CFG->dirroot.'/filter/mathjaxloader/filter.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for the MathJax loader filter.
|
||||||
|
*
|
||||||
|
* @copyright 2017 David Mudrak <david@moodle.com>
|
||||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||||
|
*/
|
||||||
|
class filter_mathjaxloader_filter_testcase extends advanced_testcase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the functionality of {@link filter_mathjaxloader::map_language_code()}.
|
||||||
|
*
|
||||||
|
* @param string $moodlelangcode the user's current language
|
||||||
|
* @param string $mathjaxlangcode the mathjax language to be used for the moodle language
|
||||||
|
*
|
||||||
|
* @dataProvider test_map_language_code_expected_mappings
|
||||||
|
*/
|
||||||
|
public function test_map_language_code($moodlelangcode, $mathjaxlangcode) {
|
||||||
|
|
||||||
|
$filter = new filter_mathjaxloader(context_system::instance(), []);
|
||||||
|
$this->assertEquals($mathjaxlangcode, $filter->map_language_code($moodlelangcode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data provider for {@link self::test_map_language_code}
|
||||||
|
*
|
||||||
|
* @return array of [moodlelangcode, mathjaxcode] tuples
|
||||||
|
*/
|
||||||
|
public function test_map_language_code_expected_mappings() {
|
||||||
|
|
||||||
|
return [
|
||||||
|
['cz', 'cs'], // Explicit mapping.
|
||||||
|
['cs', 'cs'], // Implicit mapping (exact match).
|
||||||
|
['ca_valencia', 'ca'], // Implicit mapping of a Moodle language variant.
|
||||||
|
['pt_br', 'pt-br'], // Explicit mapping.
|
||||||
|
['en_kids', 'en'], // Implicit mapping of English variant.
|
||||||
|
['de_kids', 'de'], // Implicit mapping of non-English variant.
|
||||||
|
['es_mx_kids', 'es'], // More than one underscore in the name.
|
||||||
|
['zh_tw', 'zh-hant'], // Explicit mapping of the Taiwain Chinese in the traditional script.
|
||||||
|
['zh_cn', 'zh-hans'], // Explicit mapping of the Simplified Chinese script.
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user