diff --git a/admin/lang.php b/admin/lang.php
index 30ec8d203d5..f0eb1e97355 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¤tfile=$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¤tfile=", $menufiles, "choosefile",
- $currentfile, $strchoosefiletoedit);
-
- echo '
';
- echo $uselocal ? "{$currentlang}_local" : $currentlang;
- echo '';
+ $currentfile, $strchoosefiletoedit, '', '', false, 'self', $selectionlabel);
helpbutton('langswitchstorage', $strfilestoredinhelp, 'moodle');
- echo '';
+ //$selectionlabel .= $strfilestoredin;
+ $selectionlabel .= $uselocal ? "{$currentlang}_local" : $currentlang;
+ $selectionlabel .= '/help/';
+ popup_form("$CFG->wwwroot/$CFG->admin/lang.php?mode=helpfiles¤tfile=", $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 '';
+ 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;
+}
+
+
?>