Fix for bug 3288.
[moodle.git] / filter / multilang / filter.php
1 <?php //$Id$
3 ///////////////////////////////////////////////////////////////////////////
4 //                                                                       //
5 // This program is part of Moodle - Modular Object-Oriented Dynamic      //
6 // Learning Environment - http://moodle.org                              //
7 //                                                                       //
8 // Copyright (C) 2004  Gaëtan Frenoy <gaetan à frenoy.net>               //
9 //                     Eloy Lafuente <stronk7@moodle.org>                //
10 //                                                                       //
11 // This program is free software; you can redistribute it and/or modify  //
12 // it under the terms of the GNU General Public License as published by  //
13 // the Free Software Foundation; either version 2 of the License, or     //
14 // (at your option) any later version.                                   //
15 //                                                                       //
16 // This program is distributed in the hope that it will be useful,       //
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of        //
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //
19 // GNU General Public License for more details:                          //
20 //                                                                       //
21 //          http://www.gnu.org/copyleft/gpl.html                         //
22 //                                                                       //
23 ///////////////////////////////////////////////////////////////////////////
25 // Given XML multilinguage text, return relevant text according to
26 // current language.  i.e.=
27 //   - look for lang sections in the code.
28 //   - if there exists texts in the currently active language, print them.
29 //   - else, if there exists texts in the current parent language, print them.
30 //   - else, if there are English texts, print them
31 //   - else, print the first language in the text.
32 //
33 // This is an improved version of the original multilang filter by Gaëtan Frenoy. 
34 // It should be 100% compatible with the original one. Some new features are:
35 //   - Supports a new "short" syntax to make things easier. Simply use:
36 //         <lang lang="XX">
37 //   - Needs less resources and executes faster.
38 //   - Allows any type of content to be used. No restrictions at all!
40 function multilang_filter($courseid, $text) {
42     global $CFG;
44 /// Do a quick check using stripos to avoid unnecessary work
45     if (stripos($text, '<lang') === false && stripos($text, '<span lang') === false) {
46         return $text;
47     }
49 /// Flag this text as something not to cache
50     $CFG->currenttextiscacheable = false;
52 /// Get current language
53     $currentlang = current_language();
55 /// Get parent language
56     $langfile = "$CFG->dirroot/lang/$currentlang/moodle.php";
57     if ($result = get_string_from_file("parentlanguage", "$langfile", "\$parentlang")) {
58         eval($result);
59     }
61 /// Create an array of preffered languages
62     $preflangs = array();
63     $preflangs[] = $currentlang;     /// First, the current lang
64     if (!empty($parentlang)) {
65         $preflangs[] = $parentlang; /// Then, if available, the parent lang
66     }
67     if ($currentlang != 'en') {
68         $preflangs[] = 'en';        /// Finally, if not used, add the en lang
69     }
71 /// Break the text into lang sections
72     $search = '/<(?:lang|span) lang="([a-zA-Z_-]*)".*?>(.+?)<\/(?:lang|span)>/is';
73     preg_match_all($search,$text,$list_of_langs);
75 /// Get the existing sections langs
76     $minpref   = count($preflangs);
77     $bestkey   = 0;
78     //Iterate
79     foreach ($list_of_langs[1] as $key => $lang) {
80         //Normalize: Moodle's langs are always lowercase and they use the underscore
81         //Should we be stricter?
82         $lang = strtolower(str_replace('-','_',$lang));
83         $foundkey = array_search($lang, $preflangs);
84         if ($foundkey !== false && $foundkey !== NULL && $foundkey < $minpref) {
85             $minpref = $foundkey;
86             $bestkey = $key;
87             if ($minpref == 0) {
88                 continue;        //The best has been found. Leave iteration.
89             }
90         }
91     }
93     //If we have found some lang
94     if (!empty($lang)) {
95         $text = trim($list_of_langs[2][$bestkey]);
96     }
98     return $text;
99 }
101 ?>