From: stronk7 Date: Sun, 7 Nov 2004 17:11:57 +0000 (+0000) Subject: New release of the multilang filter: X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=71c235bca40546cac7c1b110737ba6a66cf88e67;p=moodle.git New release of the multilang filter: - 100% compatible with previous "Multilang" filter. - Supports a new "short" syntax to make things easier. Simply use: - It needs less resources and executes faster. - It Allows any type of content to be used. No restrictions at all! Merged from MOODLE_14_STABLE --- diff --git a/filter/multilang/README.txt b/filter/multilang/README.txt index 1c35e5c9fe..1f4eedc198 100644 --- a/filter/multilang/README.txt +++ b/filter/multilang/README.txt @@ -1,50 +1,14 @@ -/////////////////////////////////////////////////////////////////////////// -// This program is part of Moodle - Modular Object-Oriented Dynamic // -// Learning Environment - http://moodle.com // -// // -// Multilingual Filter // -// $Id$ // -// // -/////////////////////////////////////////////////////////////////////////// - -This filter implements an XML syntax to provide -fully multilingual website. No only the Moodle interface -can be translated but also the content! - -To activate this filter, add a line like this to your -config.php: - - $CFG->textfilter1 = 'filter/multilang/multilang.php'; - -Syntax to display a multilingual content: - - - Introduction - - - - Introducción - - - - Einleitung - - - -/////////////////////////////////////////////////////////////////////////// -// // -// Copyright (C) 2004 Gaëtan Frenoy // -// // -// This program 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 2 of the License, or // -// (at your option) any later version. // -// // -// This program 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: // -// // -// http://www.gnu.org/copyleft/gpl.html // -// // -/////////////////////////////////////////////////////////////////////////// +$Id$ + +To Install it: + - Enable if from "Administration/Filters". + +To Use it: + - Create your contents into multiple languages. + - Enclose every language content between: + "."[[:space:]]+"."<","><", $text); - $text = eregi_replace("&", "&", $text); - -/// Parse XML multilingual file - $xml = new XMLParser($text); - $text = $xml->texts['en']; - foreach ($xml->texts as $lang => $lang_text) { - if ($lang == $currentlanguage) $text = $lang_text; - } - - return $text; -} - - - -/// XML Parser for Multilingual text -/// Search for "" tags and stores inner xml into $this->texts[lang] -/// -class XMLParser { - /// Currently parsed language - var $current_lang = NULL; - /// Currently parsed format - var $current_format = NULL; - /// Currently parsed text - var $current_text = NULL; - /// List of parsed texts so far - var $texts = NULL; - -/// Constructor - function XMLParser($data) { - /// Init member variables - $this->current_lang = NULL; - $this->current_format = NULL; - $this->current_text = ''; - $this->texts = array(); - - /// Default text for default language is input data - $this->texts['en'] = $data; - - /// Create parser - $xml_parser = xml_parser_create(''); - xml_set_object($xml_parser, &$this); - xml_set_element_handler($xml_parser, 'startElement', 'endElement'); - xml_set_character_data_handler($xml_parser, 'characterData'); - /// Parse date (embed data around dummy tag so parser will receive - /// a complete XML document - if (!xml_parse($xml_parser, ''.$data.'', true)) - { - /* - die(sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($xml_parser)), - xml_get_current_line_number($xml_parser))); - */ - } - /// Free resource - xml_parser_free($xml_parser); - } - -/// Callback on start of an XML element - function startElement($parser, $tag, $attributeList) { - if ($tag == 'LANG' && is_null($this->current_lang)) - { - // tag found, initialise current member vars - // default language is 'en' - $this->current_lang = array_key_exists("LANG", $attributeList)?strtolower($attributeList['LANG']):'en'; - // default format is 'auto' - $this->current_format = array_key_exists('FORMAT', $attributeList)?strtolower($attributeList['FORMAT']):'auto'; - // init inner xml - $this->current_text = ''; - } - elseif (!is_null($this->current_lang)) - { - // If a language has been found already, process tag and attributes - // and add it to inner xml for current language - $this->current_text .= "<{$tag}"; - foreach ($attributeList as $key => $val) { - $this->current_text .= " {$key}=\"{$val}\""; - } - $this->current_text .= ">"; - } - else { - // This code is outside any tag, text is probably not - // a valid multilingual format - } - } - -/// Callback on end of an XML element - function endElement($parser, $tag) { - if ($tag == 'LANG' && !is_null($this->current_lang)) { - // tag found while tag was already open, - // store inner xml and reset context - $this->texts[$this->current_lang] = $this->current_text; - $this->current_text = ''; - $this->current_lang = NULL; - $this->current_format = NULL; - } - elseif (!is_null($this->current_lang)) { - // If a language has been found already, process tag - // and add it to inner xml for current language - $this->current_text .= ""; - } - else { - // This code is outside any tag, text is probably not - // a valid multilingual format - } - } - -/// Callback on character data - function characterData($parser, $data) { - // Process inner text and add it to current inner xml - $this->current_text .= $data; - } -} - -?> + // +// Eloy Lafuente // +// // +// This program 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 2 of the License, or // +// (at your option) any later version. // +// // +// This program 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: // +// // +// http://www.gnu.org/copyleft/gpl.html // +// // +/////////////////////////////////////////////////////////////////////////// + +// Given XML multilinguage text, return relevant text according to +// current language. i.e.= +// - look for lang sections in the code. +// - if there exists texts in the currently active language, print them. +// - else, if there exists texts in the current parent language, print them. +// - else, if there are English texts, print them +// - else, print the first language in the text. +// +// This is an improved version of the original multilang filter by Gaëtan Frenoy. +// It should be 100% compatible with the original one. Some new features are: +// - Supports a new "short" syntax to make things easier. Simply use: +// +// - Needs less resources and executes faster. +// - Allows any type of content to be used. No restrictions at all! + +function multilang_filter($courseid, $text) { + + global $CFG; + +/// Do a quick check using stripos to avoid unnecessary work + if (stripos($text, 'currenttextiscacheable = false; + +/// Get current language + $currentlang = current_language(); + +/// Get parent language + $langfile = "$CFG->dirroot/lang/$currentlang/moodle.php"; + if ($result = get_string_from_file("parentlanguage", "$langfile", "\$parentlang")) { + eval($result); + } + +/// Create an array of preffered languages + $preflangs = array(); + $preflangs[] = $currentlang; /// First, the current lang + if (!empty($parentlang)) { + $preflangs[] = $parentlang; /// Then, if available, the parent lang + } + if ($currentlang != 'en') { + $preflangs[] = 'en'; /// Finally, if not used, add the en lang + } + +/// Break the text into lang sections + $search = '/(.+?)<\/lang>/is'; + preg_match_all($search,$text,$list_of_langs); + +/// Get the existing sections langs + $minpref = count($preflangs); + $bestkey = 0; + //Iterate + foreach ($list_of_langs[1] as $key => $lang) { + $foundkey = array_search($lang, $preflangs); + if ($foundkey !== false && $foundkey !== NULL && $foundkey < $minpref) { + $minpref = $foundkey; + $bestkey = $key; + if ($minpref == 0) { + continue; //The best has been found. Leave iteration. + } + } + } + + $text = trim($list_of_langs[2][$bestkey]); + + return $text; +} + +?>