From: mudrd8mz Date: Wed, 21 Nov 2007 03:03:59 +0000 (+0000) Subject: MDL-8090 Merged from stable X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=1b6cbebf27919cee75b520fc9367e565e2ce26c8;p=moodle.git MDL-8090 Merged from stable --- diff --git a/admin/lang.php b/admin/lang.php index 30ec8d203d..f0eb1e9735 100644 --- a/admin/lang.php +++ b/admin/lang.php @@ -7,6 +7,8 @@ * @param bool $uselocal save translations into *_local pack? */ + $dbg = ''; // debug output; + require_once('../config.php'); require_once($CFG->libdir.'/adminlib.php'); @@ -18,15 +20,21 @@ define('LANG_SUBMIT_REPEAT_EVERY', 20); // if so, after how many lines? define('LANG_DISPLAY_MISSING_LINKS', 1); // display "go to first/next missing string" links? define('LANG_DEFAULT_FILE', ''); // default file to translate. Empty allowed + define('LANG_DEFAULT_HELPFILE', ''); // default helpfile to translate. Empty allowed define('LANG_LINK_MISSING_STRINGS', 1); // create links from "missing" page to "compare" page? define('LANG_DEFAULT_USELOCAL', 0); // should *_utf8_local be used by default? define('LANG_MISSING_TEXT_MAX_LEN', 60); // maximum length of the missing text to display define('LANG_KEEP_ORPHANS', 1); // keep orphaned strings (i.e. strings w/o English reference) define('LANG_SEARCH_EXTRA', 1); // search lang files in extra locations - $mode = optional_param('mode', '', PARAM_ALPHA); - $currentfile = optional_param('currentfile', LANG_DEFAULT_FILE, PARAM_FILE); - $uselocal = optional_param('uselocal', -1, PARAM_INT); + $mode = optional_param('mode', '', PARAM_ALPHA); + if ($mode == 'helpfiles') { + // use different PARAM_ options according to mode + $currentfile = optional_param('currentfile', LANG_DEFAULT_HELPFILE, PARAM_PATH); + } else { + $currentfile = optional_param('currentfile', LANG_DEFAULT_FILE, PARAM_FILE); + } + $uselocal = optional_param('uselocal', -1, PARAM_INT); if ($uselocal == -1) { if (isset($SESSION->langtranslateintolocal)) { @@ -70,6 +78,9 @@ $strlangpackmaintaining = get_string('langpackmaintaining', 'admin'); $strnomissingstrings = get_string('nomissingstrings', 'admin'); $streditingnoncorelangfile = get_string('editingnoncorelangfile', 'admin'); + $strlanglocalpackage = get_string('langlocalpackage', 'admin'); + $strlangmasterpackage = get_string('langmasterpackage', 'admin'); + $strlangmasterenglish = get_string('langmasterenglish', 'admin'); $currentlang = current_language(); @@ -82,6 +93,8 @@ case "compare": $title = $streditstrings; break; + case "helpfiles": + $title = $stredithelpdocs; default: $title = $strlanguage; break; @@ -116,14 +129,13 @@ } $secondrow[] = new tabobject('missing', $CFG->wwwroot.'/admin/lang.php?mode=missing', $strmissingstrings ); $secondrow[] = new tabobject('compare', $CFG->wwwroot.'/admin/lang.php?mode=compare', $streditstrings ); - // TODO - // langdoc.php functionality is planned to be merged into lang.php - $secondrow[] = new tabobject('langdoc', $CFG->wwwroot.'/admin/langdoc.php', $stredithelpdocs ); + $secondrow[] = new tabobject('helpfiles', $CFG->wwwroot.'/admin/lang.php?mode=helpfiles', $stredithelpdocs ); $tabs = array($firstrow, $secondrow); print_tabs($tabs, $currenttab, $inactive, $activated); if (!$mode) { + // TODO this is a very nice place to put some translation statistics print_box_start(); $currlang = current_language(); $langs = get_list_of_languages(false, true); @@ -143,17 +155,30 @@ $langdir = "$langbase/$currentlang"; } $locallangdir = "$langbase/{$currentlang}_local"; + $saveto = $uselocal ? $locallangdir : $langdir; - // get the list of all English stringfiles - $stringfiles = lang_standard_locations(); - if (LANG_SEARCH_EXTRA) { - $stringfiles += lang_extra_locations(); - } - if (count($stringfiles) == 0) { - error("Could not find English language pack!"); + if (($mode == 'missing') || ($mode == 'compare')) { + // get the list of all English stringfiles + $stringfiles = lang_standard_locations(); + if (LANG_SEARCH_EXTRA) { + $stringfiles += lang_extra_locations(); + } + if (count($stringfiles) == 0) { + error("Could not find English language pack!"); + } + } elseif ($mode == 'helpfiles') { + $helpfiles = lang_help_standard_locations(); + if (LANG_SEARCH_EXTRA) { + $helpfiles += lang_help_extra_locations(); + } + if (count($helpfiles) == 0) { + error("Could not find help files in the English language pack!"); + } } - if ($mode == "missing") { + + + if ($mode == 'missing') { if (!file_exists($langdir)) { error ('to edit this language pack, you need to put it in '.$CFG->dataroot.'/lang'); } @@ -334,7 +359,7 @@ notice(get_string("languagegood"), "lang.php" ); } - } else if ($mode == "compare") { + } else if ($mode == 'compare') { if (!file_exists($langbase) ){ if (!lang_make_directory($langbase) ){ @@ -436,7 +461,7 @@ } if (lang_save_file($saveinto, $currentfile, $newstrings, $uselocal, $packstring)) { - notify(get_string("changessaved")." ($saveinto/$currentfile)", "green"); + notify(get_string("changessaved")." ($saveinto/$currentfile)", "notifysuccess"); } else { error("Could not save the file '$saveinto/$currentfile'!", "lang.php?mode=compare&currentfile=$currentfile"); } @@ -458,20 +483,16 @@ } $menufiles[$item_key] = $item_label; } + $selectionlabel = ''; + //$selectionlabel .= $strfilestoredin; + $selectionlabel .= $uselocal ? "{$currentlang}_local" : $currentlang; + $selectionlabel .= '/'; popup_form("$CFG->wwwroot/$CFG->admin/lang.php?mode=compare&currentfile=", $menufiles, "choosefile", - $currentfile, $strchoosefiletoedit); - - echo '
'; - echo $strfilestoredin; - echo ''; - echo $uselocal ? "{$currentlang}_local" : $currentlang; - echo ''; + $currentfile, $strchoosefiletoedit, '', '', false, 'self', $selectionlabel); helpbutton('langswitchstorage', $strfilestoredinhelp, 'moodle'); - echo '
'; print_box_end(); - + if ($currentfile <> '') { - $saveto = $uselocal ? $locallangdir : $langdir; error_reporting(0); if (!isset($editable) || $editable) { if (!file_exists("$saveto/$currentfile")) { @@ -669,7 +690,212 @@ // no $currentfile specified // no useful information to display - maybe some help? instructions? } - } + + } elseif ($mode == 'helpfiles') { + + $saveto = $saveto.'/help'; // the edited content will be saved to + $enlangdir = $enlangdir.'/help'; // English master help files localtion + $langdir = $langdir.'/help'; // current language master help files location + $locallangdir = $locallangdir.'/help'; // local modifications of help files location + $altdir = $uselocal ? $langdir : $locallangdir; // alternative to $saveto + + $fileeditorrows = 10; // number of textareas' rows + $fileeditorcols = 100; // dtto cols + $filemissingmark = ' (***)'; // mark to add to non-existing or zero-length files + $fileoldmark = ' (old?)'; // mark to add to filenames in selection form if the English version is newer + $filetemplate = ''; // template for new files, e.g. CVS identification + + if (isset($_POST['currentfile'])) { // Save a file + if (!confirm_sesskey()) { + error(get_string('confirmsesskeybad', 'error')); + } + if (lang_help_save_file($saveto, $currentfile, $_POST['filedata'])) { + notify(get_string("changessaved")." ($saveto/$currentfile)", "notifysuccess"); + } else { + error("Could not save the file '$currentfile'!", "lang.php?mode=helpfiles&currentfile=$currentfile&sesskey=$USER->sesskey"); + } + } + + print_box_start('generalbox editstrings'); + $menufiles = array(); + $menufiles_coregrp = 1; + $origlocation = ''; // the location of the currentfile's English source will be stored here + $origplugin = ''; // dtto plugin + foreach ($helpfiles as $helppath => $helpfile) { + $item_key = $helpfile['filename']; + $item_label = $helpfile['filename']; + if ((!file_exists($saveto.'/'.$helpfile['filename'])) || (filesize($saveto.'/'.$helpfile['filename']) == 0)) { + $item_label .= $filemissingmark; + } else { + if (filemtime($saveto.'/'.$helpfile['filename']) < filemtime($helppath)) { + $item_label .= $fileoldmark; + } + if ($helpfile['location'] != '' && $helpfile['plugin'] != '') { + $item_label .= ' ('.$helpfile['location'].'/'.$helpfile['plugin'].')'; + if ($menufiles_coregrp == 1) { + $menufiles['extra'] = '------------'; + $menufiles_coregrp = 0; + } + } + } + $menufiles[$item_key] = $item_label; + if ($currentfile == $helpfile['filename']) { + $origlocation = $helpfile['location']; + $origplugin = $helpfile['plugin']; + } + } + $selectionlabel = ''; + //$selectionlabel .= $strfilestoredin; + $selectionlabel .= $uselocal ? "{$currentlang}_local" : $currentlang; + $selectionlabel .= '/help/'; + popup_form("$CFG->wwwroot/$CFG->admin/lang.php?mode=helpfiles&currentfile=", $menufiles, "choosefile", + $currentfile, $strchoosefiletoedit, '', '', false, 'self', $selectionlabel); + helpbutton('langswitchstorage', $strfilestoredinhelp, 'moodle'); + print_box_end(); + + if (!empty($currentfile)) { + + if (!file_exists("$saveto/$currentfile")) { + $dbg .= "File does not exist: $saveto/$currentfile\n"; + //check if directory exist + if (!file_exists(dirname("$saveto/$currentfile"))) { + if(!lang_make_directory(dirname("$saveto/$currentfile"))) { + echo ('Cannot create directory: '.dirname("$saveto/$currentfile")); + } + } + // + // file doesn't exist - let's check webserver's permission to create it + // + if (!@touch("$saveto/$currentfile")) { + // + // webserver is unable to create new file + // + notify(get_string('filemissing', '', "$saveto/$currentfile" )); + notify(get_string('makeeditable', '', "$saveto/$currentfile")); + $editable = false; + } else { + // + // webserver can create new file - we can delete it now and let + // it create again if its filesize() > 0 + // + $editable = true; + unlink("$saveto/$currentfile"); + } + } elseif (is_writable("$saveto/$currentfile")) { + $editable = true; + } else { + // + // file exists but it is not writeable by web server process :-( + // + $editable = false; + notify(get_string('makeeditable', '', "$saveto/$currentfile")); + } + + // master en_utf8 in dataroot is not editable + if ((!$uselocal) && ($currentlang == 'en_utf8')) { + $editable = false; + } + + echo '
'; + + if ($uselocal) { + $strsavetotitle = $strlanglocalpackage . helpbutton('langpackages', $strlanglocalpackage, 'moodle', true, false, '', true); + $straltdirtitle = $strlangmasterpackage . helpbutton('langpackages', $strlangmasterpackage, 'moodle', true, false, '', true); + } else { + $straltdirtitle = $strlanglocalpackage . helpbutton('langpackages', $strlanglocalpackage, 'moodle', true, false, '', true); + $strsavetotitle = $strlangmasterpackage . helpbutton('langpackages', $strlangmasterpackage, 'moodle', true, false, '', true); + + } + + if ($editable) { + // generate an editor for the current help file in $saveto + echo '
'.$strsavetotitle.''; + echo "
"; + echo ''; + echo ''; + echo ''; + echo "
\n"; + echo "\n
\n"; + echo '
'; + echo '
'; + $preview_url = lang_help_preview_url($currentfile, !$uselocal); + if ($preview_url) { + link_to_popup_window($preview_url, 'popup', get_string('preview')); + } + echo '
'; + } + + if (is_readable("$altdir/$currentfile")) { + // show the content of the same help file in alternative location + echo '
'.$straltdirtitle.''; + echo "
\n"; + echo "\n
\n"; + $preview_url = lang_help_preview_url($currentfile, $uselocal); + if ($preview_url) { + link_to_popup_window($preview_url, 'popup', get_string('preview')); + } + echo '
'; + } + + // show the content of the original English file either in core space or plugin space + if ($origlocation != '' && $origplugin != '') { + // non-core help file + $ensrc = "$CFG->dirroot/$origlocation/$origplugin/lang/en_utf8/help/$currentfile"; + } else { + // core help file + $ensrc = "$enlangdir/$currentfile"; + } + if (is_readable($ensrc)) { + echo '
'.$strlangmasterenglish; + helpbutton('langpackages', $strlangmasterenglish); + echo ''; + echo "
\n\n
\n"; + $preview_url = lang_help_preview_url($currentfile, true, 'en_utf8'); // do not display en_utf8_local + if ($preview_url) { + link_to_popup_window($preview_url, 'popup', get_string('preview')); + } + echo '
'; + } + + echo '
'; // translator box + error_reporting($CFG->debug); + } + + if (false && $CFG->debugdisplay && debugging('', DEBUG_DEVELOPER) ) { + echo '
'; + print_heading('Debugging info'); + echo '
';
+            print_r($dbg);
+            print_r("\n\$currentfile = $currentfile");
+            print_r("\n\$enlangdir = $enlangdir");
+            print_r("\n\$langdir = $langdir");
+            print_r("\n\$locallangdir = $locallangdir");
+            print_r("\n\$saveto = $saveto");
+            print_r("\n\$altdir = $altdir");
+            print_r("\n\$origlocation = $origlocation");
+            print_r("\n\$origplugin = $origplugin");
+            print_r("\n\$ensrc = $ensrc");
+            print_r("\n\$helpfiles = ");
+            print_r($helpfiles);
+            echo '
'; + } + + } // fi $mode == 'helpfiles' + admin_externalpage_print_footer(); @@ -790,6 +1016,8 @@ function lang_fix_value_before_save($value='') { /** * Try and create a new language directory. * + * Uses PHP>=5.0 syntax of mkdir and tries to create directories recursively. + * * @uses $CFG * @param string $directory full path to the directory under $langbase * @return string|false Returns full path to directory if successful, false if not @@ -798,7 +1026,7 @@ function lang_make_directory($dir, $shownotices=true) { global $CFG; umask(0000); if (! file_exists($dir)) { - if (! @mkdir($dir, $CFG->directorypermissions)) { + if (! @mkdir($dir, $CFG->directorypermissions, true)) { // recursive=true; PHP>=5.0 needed return false; } //@chmod($dir, $CFG->directorypermissions); // Just in case mkdir didn't do it @@ -1002,4 +1230,141 @@ function lang_get_file_info($currentfile, $stringfiles) { } } +/** + * Returns all English help files in the standard lang/en_utf8/help location. + * + * Core help files should always be stored here and not in the module space (MDL-10920). + * The English version of the file may be found in + * $CFG->dirroot/lang/en_utf8/help/filename + * The localised version of the found file should be saved into + * $CFG->dataroot/lang/currentlang[_local]/help/filename + * where "filename" is returned as a part of the file record. + * + * @return array Array of a file information. Compatible format with {@link lang_extra_locations()} + */ +function lang_help_standard_locations() { + global $CFG; + $files = array(); + // Standard location of master English help files. + $places = array($CFG->dirroot.'/lang/en_utf8/help'); + foreach ($places as $place) { + foreach (get_directory_list($place, 'CVS') as $file) { + if ((substr($file, -5) == '.html') || (substr($file, -4) == '.txt' )) { + $fullpath = $place.'/'.$file; + $files[$fullpath] = array( + 'filename' => $file, + 'location' => '', + 'plugin' => '', + 'prefix' => '', + ); + } + } + } + return $files; +} + +/** + * Returns all English help files in non-standard location. + * + * Searches for lang/en_utf8/help/* files in various types of plugins (blocks, database presets, question types, + * 3rd party modules etc.) and returns an array of found files details. + * + * The English version of the file may be found in + * $CFG->dirroot/location/plugin/lang/en_utf8/help/filename + * The localised version of the found file should be saved into + * $CFG->dataroot/lang/currentlang[_local]/help/prefix_plugin/filename (XXX is "prefix" here right?) + * where "location", "plugin", "prefix" and "filename" are returned as a part of the file record. + * + * @return array Array of a file information. Compatible format with {@link lang_standard_locations()} + */ +function lang_help_extra_locations() { + global $CFG; + $files = array(); + $places = places_to_search_for_lang_strings(); + foreach ($places as $prefix => $directories) { + if ($prefix != '__exceptions') { + foreach ($directories as $directory) { + foreach (get_list_of_plugins($directory) as $plugin) { + $enlangdirlocation = $CFG->dirroot.'/'.$directory.'/'.$plugin.'/lang/en_utf8/help'; + foreach (get_directory_list($enlangdirlocation, 'CVS') as $file) { + if ((substr($file, -5) == '.html') || (substr($file, -4) == '.txt' )) { + $fullpath = $enlangdirlocation.'/'.$file; + $files[$fullpath] = array( + 'filename' => $file, + 'location' => $directory, + 'plugin' => $plugin, + 'prefix' => $prefix, + ); + } + } + } + } + } + } + return $files; +} + +/** + * Return a preview URL for help file, if available. + * + * @param string $currentfile The relative path to the help file, e.g. "assignment/types.html" - MDL-12291 + * @param bool $skiplocal Force displaying the helpfile from a master lang pack + * @param string $forcelang Force language of the help, e.g. "en_utf8" + * @return string $url + */ +function lang_help_preview_url($currentfile, $skiplocal=false, $forcelang = '') { + $currentpathexp = explode('/', $currentfile); + if (count($currentpathexp) > 1) { + $url = '/help.php?module='.implode('/',array_slice($currentpathexp,0,count($currentpathexp)-1)).'&file='.end($currentpathexp); + } else { + $url = '/help.php?module=moodle&file='.$currentfile; + } + if ($skiplocal) { + $url .= '&skiplocal=1'; + } + if ($forcelang) { + $url .= '&forcelang='.$forcelang; + } + return $url; +} + + +/** + * Saves (overwrites) translated help file. + * + * @param string $helproot The path to the "help" folder + * @param string $file The relative path to the html help file + * @param string $content HTML data to be saved + * @return bool False if save failed, true otherwise + */ +function lang_help_save_file($helproot, $file, $content) { + global $CFG, $USER; + + $content = str_replace("\r", "",$content); // Remove linefeed characters + $content = preg_replace("/\n{3,}/", "\n\n", $content); // Collapse runs of blank lines + $content = trim($content); // Delete leading/trailing whitespace + if (is_readable("$helproot/$file") && filesize("$helproot/$file") > 0 && $content == '') { + notify(get_string('langrmyourself', 'admin')); + return true; + } + + error_reporting(0); + if (!$f = fopen("$helproot/$file","w")) { + error_reporting($CFG->debug); + return false; + } + error_reporting($CFG->debug); + + fwrite($f, stripslashes($content)); + fclose($f); + + // Remove file if its empty + if (filesize("$helproot/$file") == 0) { + unlink("$helproot/$file"); + } + + return true; +} + + ?>