Merge branch 'MDL-23514-master' of https://github.com/danielneis/moodle
authorDamyon Wiese <damyon@moodle.com>
Mon, 17 Feb 2014 06:12:16 +0000 (14:12 +0800)
committerDamyon Wiese <damyon@moodle.com>
Mon, 17 Feb 2014 06:12:16 +0000 (14:12 +0800)
Conflicts:
lang/en/admin.php

1  2 
admin/settings/appearance.php
lang/en/admin.php
lib/setuplib.php

@@@ -2,12 -2,7 +2,12 @@@
  
  // This file defines settingpages and externalpages under the "appearance" category
  
 -if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
 +$capabilities = array(
 +    'moodle/my:configsyspages',
 +    'moodle/tag:manage'
 +);
 +
 +if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) { // speedup for non-admins, add all caps used on this page
  
      $ADMIN->add('appearance', new admin_category('themes', new lang_string('themes')));
      // "themesettings" settingpage
@@@ -29,7 -24,7 +29,7 @@@
      $ADMIN->add('themes', new admin_externalpage('themeselector', new lang_string('themeselector','admin'), $CFG->wwwroot . '/theme/index.php'));
  
      // settings for each theme
 -    foreach (get_plugin_list('theme') as $theme => $themedir) {
 +    foreach (core_component::get_plugin_list('theme') as $theme => $themedir) {
          $settings_path = "$themedir/settings.php";
          if (file_exists($settings_path)) {
              $settings = new admin_settingpage('themesetting'.$theme, new lang_string('pluginname', 'theme_'.$theme));
      }
  
  
 -    // calendar
 +    // Calendar settings.
      $temp = new admin_settingpage('calendar', new lang_string('calendarsettings','admin'));
 +
 +    $temp->add(new admin_setting_configselect('calendartype', new lang_string('calendartype', 'admin'),
 +        new lang_string('calendartype_desc', 'admin'), 'gregorian', \core_calendar\type_factory::get_list_of_calendar_types()));
      $temp->add(new admin_setting_special_adminseesall());
      //this is hacky because we do not want to include the stuff from calendar/lib.php
      $temp->add(new admin_setting_configselect('calendar_site_timeformat', new lang_string('pref_timeformat', 'calendar'),
      // "documentation" settingpage
      $temp = new admin_settingpage('documentation', new lang_string('moodledocs'));
      $temp->add(new admin_setting_configtext('docroot', new lang_string('docroot', 'admin'), new lang_string('configdocroot', 'admin'), 'http://docs.moodle.org', PARAM_URL));
+     $ltemp = array('' => get_string('forceno'));
+     $ltemp += get_string_manager()->get_list_of_translations(true);
+     $temp->add(new admin_setting_configselect('doclang', get_string('doclang', 'admin'), get_string('configdoclang', 'admin'), '', $ltemp));
      $temp->add(new admin_setting_configcheckbox('doctonewwindow', new lang_string('doctonewwindow', 'admin'), new lang_string('configdoctonewwindow', 'admin'), 0));
      $ADMIN->add('appearance', $temp);
  
 -    $temp = new admin_externalpage('mypage', new lang_string('mypage', 'admin'), $CFG->wwwroot . '/my/indexsys.php');
 +    $temp = new admin_externalpage('mypage', new lang_string('mypage', 'admin'), $CFG->wwwroot . '/my/indexsys.php',
 +            'moodle/my:configsyspages');
      $ADMIN->add('appearance', $temp);
  
 -    $temp = new admin_externalpage('profilepage', new lang_string('myprofile', 'admin'), $CFG->wwwroot . '/user/profilesys.php');
 +    $temp = new admin_externalpage('profilepage', new lang_string('myprofile', 'admin'), $CFG->wwwroot . '/user/profilesys.php',
 +            'moodle/my:configsyspages');
      $ADMIN->add('appearance', $temp);
  
      // coursecontact is the person responsible for course - usually manages enrolments, receives notification, etc.
      $setting->set_updatedcallback('js_reset_all_caches');
      $temp->add($setting);
      $temp->add(new admin_setting_configcheckbox('modchooserdefault', new lang_string('modchooserdefault', 'admin'), new lang_string('configmodchooserdefault', 'admin'), 1));
 +    $temp->add(new admin_setting_configcheckbox('modeditingmenu', new lang_string('modeditingmenu', 'admin'), new lang_string('modeditingmenu_desc', 'admin'), 1));
 +    $temp->add(new admin_setting_configcheckbox('blockeditingmenu', new lang_string('blockeditingmenu', 'admin'), new lang_string('blockeditingmenu_desc', 'admin'), 1));
      $ADMIN->add('appearance', $temp);
  
      // link to tag management interface
 -    $ADMIN->add('appearance', new admin_externalpage('managetags', new lang_string('managetags', 'tag'), "$CFG->wwwroot/tag/manage.php"));
 +    $ADMIN->add('appearance', new admin_externalpage('managetags', new lang_string('managetags', 'tag'), $CFG->wwwroot.'/tag/manage.php', 'moodle/tag:manage'));
  
      $temp = new admin_settingpage('additionalhtml', new lang_string('additionalhtml', 'admin'));
      $temp->add(new admin_setting_heading('additionalhtml_heading', new lang_string('additionalhtml_heading', 'admin'), new lang_string('additionalhtml_desc', 'admin')));
diff --combined lang/en/admin.php
@@@ -25,7 -25,6 +25,7 @@@
  
  $string['accessdenied'] = 'Access denied';
  $string['accounts'] = 'Accounts';
 +$string['addcategory'] = 'Add a category';
  $string['additionalhtml'] = 'Additional HTML';
  $string['additionalhtml_heading'] = 'Additional HTML to be added to every page.';
  $string['additionalhtml_desc'] = 'These settings allow you to specify HTML that you want added to every page. You can set HTML that will be added within the HEAD tag for the page, immediately after the BODY tag has been opened, or immediately before the body tag is closed.<br />Doing this allows you add custom headers or footers on every page, or add support for services like Google Analytics very easily and independent of your chosen theme.';
@@@ -75,8 -74,6 +75,8 @@@ $string['badwordsconfig'] = 'Enter you
  $string['badwordsdefault'] = 'If the custom list is empty, a default list from the language pack will be used.';
  $string['badwordslist'] = 'Custom bad words list';
  $string['blockediplist'] = 'Blocked IP List';
 +$string['blockeditingmenu'] = 'Block editing menus';
 +$string['blockeditingmenu_desc'] = 'If enabled many of the block editing icons shown when editing is on will be displayed within a drop-down menu. This reduces the content on screen by hiding the icons until they are needed.';
  $string['blockinstances'] = 'Instances';
  $string['blockmultiple'] = 'Multiple';
  $string['blockprotect'] = 'Protect instances';
@@@ -89,13 -86,12 +89,13 @@@ $string['bloglevel'] = 'Blog visibility
  $string['bookmarkadded'] = 'Bookmark added.';
  $string['bookmarkalreadyexists'] = 'You have already bookmarked this page.';
  $string['bookmarkdeleted'] = 'Bookmark deleted.';
 -$string['bookmarkthispage'] = 'bookmark this page';
 +$string['bookmarkthispage'] = 'Bookmark this page';
  $string['cachejs'] = 'Cache Javascript';
  $string['cachejs_help'] = 'Javascript caching and compression greatly improves page loading performance. it is strongly recommended for production sites. Developers will probably want to disable this feature.';
 -$string['cachetext'] = 'Text cache lifetime';
  $string['calendarexportsalt'] = 'Calendar export salt';
  $string['calendarsettings'] = 'Calendar';
 +$string['calendartype'] = 'Calendar type';
 +$string['calendartype_desc'] = 'Choose a default calendar type for the whole site. This setting can be overridden in the course settings or by users in their personal profile.';
  $string['calendar_weekend'] = 'Weekend days';
  $string['cannotdeletemodfilter'] = 'You cannot uninstall the \'{$a->filter}\' because it is part of the \'{$a->module}\' module.';
  $string['cannotuninstall'] = '{$a} can not be uninstalled.';
@@@ -123,7 -119,7 +123,7 @@@ $string['commonfiltersettings'] = 'Comm
  $string['commonsettings'] = 'Common settings';
  $string['componentinstalled'] = 'Component installed';
  $string['computedfromlogs'] = 'Computed from logs since {$a}.';
 -$string['condifmodeditdefaults'] = 'The values you set here define the default values that are used in the activity settings form when you create a new activity. You can also configure which activity settings are considered advanced.';
 +$string['condifmodeditdefaults'] = 'Default values are used in the settings form when creating a new activity or resource.';
  $string['confeditorhidebuttons'] = 'Select the buttons that should be hidden in the HTML editor.';
  $string['configallcountrycodes'] = 'This is the list of countries that may be selected in various places, for example in a user\'s profile. If blank (the default) the list in countries.php in the standard English language pack is used. That is the list from ISO 3166-1. Otherwise, you can specify a comma-separated list of codes, for example \'GB,FR,ES\'. If you add new, non-standard codes here, you will need to add them to countries.php in \'en\' and your language pack.';
  $string['configallowassign'] = 'You can allow people who have the roles on the left side to assign some of the column roles to other people';
@@@ -146,11 -142,13 +146,11 @@@ $string['configauthenticationplugins'] 
  $string['configautolang'] = 'Detect default language from browser setting, if disabled site default is used.';
  $string['configautologinguests'] = 'Should visitors be logged in as guests automatically when entering courses with guest access?';
  $string['configbloglevel'] = 'This setting allows you to restrict the level to which user blogs can be viewed on this site.  Note that they specify the maximum context of the VIEWER not the poster or the types of blog posts.  Blogs can also be disabled completely if you don\'t want them at all.';
 -$string['configcachetext'] = 'For larger sites or sites that use text filters, this setting can really speed things up.  Copies of texts will be retained in their processed form for the time specified here.  Setting this too small may actually slow things down slightly,  but setting it too large may mean texts take too long to refresh (with new links, for example).';
  $string['configcalendarcustomexport'] = 'Enable custom date range export of calendar';
  $string['configcalendarexportsalt'] = 'This random text is used for improving of security of authentication tokens used for exporting of calendars. Please note that all current tokens are invalidated if you change this hash salt.';
  $string['configclamactlikevirus'] = 'Treat files like viruses';
  $string['configclamdonothing'] = 'Treat files as OK';
  $string['configclamfailureonupload'] = 'If you have configured clam to scan uploaded files, but it is configured incorrectly or fails to run for some unknown reason, how should it behave?  If you choose \'Treat files like viruses\', they\'ll be moved into the quarantine area, or deleted. If you choose \'Treat files as OK\', the files will be moved to the destination directory like normal. Either way, admins will be alerted that clam has failed.  If you choose \'Treat files like viruses\' and for some reason clam fails to run (usually because you have entered an invalid pathtoclam), ALL files that are uploaded will be moved to the given quarantine area, or deleted. Be careful with this setting.';
 -$string['configconvertformat'] = 'If <i>latex</i>, <i>dvips</i> and <i>convert</i> are available, the images are created using the specified format. If it is not, mimeTeX will be used and it will create GIF images.';
  $string['configcookiehttponly'] = 'Enables new PHP 5.2.0 feature - browsers are instructed to send cookie with real http requests only, cookies should not be accessible by scripting languages. This is not supported in all browsers and it may not be fully compatible with current code. It helps to prevent some types of XSS attacks.';
  $string['configcookiesecure'] = 'If server is accepting only https connections it is recommended to enable sending of secure cookies. If enabled please make sure that web server is not accepting http:// or set up permanent redirection to https:// address. When <em>wwwroot</em> address does not start with https:// this setting is turned off automatically.';
  $string['configcountry'] = 'If you set a country here, then this country will be selected by default on new user accounts.  To force users to choose a country, just leave this unset.';
@@@ -165,16 -163,19 +165,16 @@@ $string['configcronremotepassword'] = '
      http://site.example.com/admin/cron.php?password=opensesame
  </pre>If this is left empty, no password is required.';
  $string['configcurlcache'] = 'Time-to-live for cURL cache, in seconds.';
 -$string['configcustommenuitems'] = 'You can configure a custom menu here to be shown by themes. Each line consists of some menu text, a link URL (optional) and a tooltip title (optional), separated by pipe characters. You can specify a structure using hyphens. For example:
 +$string['configcustommenuitems'] = 'You can configure a custom menu here to be shown by themes. Each line consists of some menu text, a link URL (optional), a tooltip title (optional) and a language code or comma-separated list of codes (optional, for displaying the line to users of the specified language only), separated by pipe characters. You can specify a structure using hyphens. For example:
  <pre>
 -Moodle community|http://moodle.org
 --Moodle free support|http://moodle.org/support
 --Moodle development|http://moodle.org/development
 ---Moodle Tracker|http://tracker.moodle.org
 ---Moodle Docs|http://docs.moodle.org
 --Moodle News|http://moodle.org/news
 -Moodle company
 --Moodle commercial hosting|http://moodle.com/hosting
 --Moodle commercial support|http://moodle.com/support
 +Moodle community|https://moodle.org
 +-Moodle free support|https://moodle.org/support
 +-Moodle development|https://moodle.org/development
 +--Moodle Docs|http://docs.moodle.org|Moodle Docs
 +--German Moodle Docs|http://docs.moodle.org/de|Documentation in German|de
 +Moodle.com|http://moodle.com/
  </pre>';
 -$string['configdbsessions'] = 'If enabled, this setting will use the database to store information about current sessions.  This is especially useful for large/busy sites or sites built on cluster of servers.  For most sites this should probably be left disabled so that the server disk is used instead.  Note that changing this setting now will log out all current users (including you). If you are using MySQL please make sure that \'max_allowed_packet\' in my.cnf (or my.ini) is at least 4M.';
 +$string['configdbsessions'] = 'If enabled, this setting will use the database to store information about current sessions. Note that changing this setting now will log out all current users (including you). If you are using MySQL please make sure that \'max_allowed_packet\' in my.cnf (or my.ini) is at least 4M. Other session drivers can be configured directly in config.php, see config-dist.php for more information. This option disappears if you specify session driver in config.php file.';
  $string['configdebug'] = 'If you turn this on, then PHP\'s error_reporting will be increased so that more warnings are printed.  This is only useful for developers.';
  $string['configdebugdisplay'] = 'Set to on, the error reporting will go to the HTML page. This is practical, but breaks XHTML, JS, cookies and HTTP headers in general. Set to off, it will send the output to your server logs, allowing better debugging. The PHP setting error_log controls which log this goes to.';
  $string['configdebugpageinfo'] = 'Enable if you want page information printed in page footer.';
@@@ -192,7 -193,8 +192,8 @@@ $string['configenabledevicedetection'] 
  $string['configdisableuserimages'] = 'Disable the ability for users to change user profile images.';
  $string['configdisplayloginfailures'] = 'This will display information to selected users about previous failed logins.';
  $string['configdndallowtextandlinks'] = 'Enable or disable the dragging and dropping of text and links onto a course page, alongside the dragging and dropping of files. Note that the dragging of text into Firefox or between different browsers is unreliable and may result in no data being uploaded, or corrupted text being uploaded.';
 -$string['configdocroot'] = 'Defines the path to the Moodle Docs. You can change this if you wish to have your own custom online documentation. However, if you do that make sure that the paths in your documentation follow the same format as http://docs.moodle.org.';
+ $string['configdoclang'] = 'This language will be used in links for the documentation pages.';
 +$string['configdocroot'] = 'Defines the path to the Moodle Docs for providing context-specific documentation via \'Moodle Docs for this page\' links in the footer of each page. If the field is left blank, links will not be displayed.';
  $string['configdoctonewwindow'] = 'If you enable this, then links to Moodle Docs will be shown in a new window.';
  $string['configeditordictionary'] = 'This value will be used if aspell doesn\'t have dictionary for users own language.';
  $string['configeditorfontlist'] = 'Select the fonts that should appear in the editor\'s drop-down list.';
@@@ -226,10 -228,8 +227,10 @@@ $string['configfrontpage'] = 'The item
  $string['configfrontpagecourselimit'] = 'Maximum number of courses';
  $string['configfrontpagecourselimithelp'] = 'Maximum number of courses to be displayed on the site\'s front page in course listings.';
  $string['configfrontpageloggedin'] = 'The items selected above will be displayed on the site\'s front page when a user is logged in.';
 -$string['configfullnamedisplay'] = 'This defines how names are shown when they are displayed in full. For most mono-lingual sites the most efficient setting is "First name + Surname", but you may choose to hide surnames altogether, or to leave it up to the current language pack to decide (some languages have different conventions).';
 -$string['configgeoipfile'] = 'Location of GeoIP City binary data file. This file is not part of Moodle distribution and must be obtained separately from <a href="http://www.maxmind.com/">MaxMind</a>. You can either buy a commercial version or use the free version.<br />Simply download <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz" >http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a> and extract it into "{$a}" directory on your server.';
 +$string['configfullnamedisplay'] = 'This defines how names are shown when they are displayed in full. The default value, "language", leaves it to the string "fullnamedisplay" in the current language pack to decide. Some languages have different name display conventions.
 +
 +For most mono-lingual sites the most efficient setting is "firstname lastname", but you may choose to hide surnames altogether. Placeholders that can be used are: firstname, lastname, firstnamephonetic, lastnamephonetic, middlename, and alternatename.';
 +$string['configgeoipfile'] = 'Location of GeoIP City binary data file. This file is not part of Moodle distribution and must be obtained separately from <a href="http://www.maxmind.com/">MaxMind</a>. You can either buy a commercial version or use the free version. Simply download <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz" >http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a> and extract it into "{$a}" directory on your server.';
  $string['configgetremoteaddrconf'] = 'If your server is behind a reverse proxy, you can use this setting to specify which HTTP headers can be trusted to contain the remote IP address. The headers are read in order, using the first one that is available.';
  $string['configgradebookroles'] = 'This setting allows you to control who appears on the gradebook.  Users need to have at least one of these roles in a course to be shown in the gradebook for that course.';
  $string['configgradeexport'] = 'Choose which gradebook export formats are your primary methods for exporting grades.  Chosen plugins will then set and use a "last exported" field for every grade.  For example, this might result in exported records being identified as being "new" or "updated".  If you are not sure about this then leave everything unchecked.';
@@@ -276,7 -276,6 +277,7 @@@ $string['confignotloggedinroleid'] = 'U
  $string['configopentogoogle'] = 'If you enable this setting, then Google will be allowed to enter your site as a Guest.  In addition, people coming in to your site via a Google search will automatically be logged in as a Guest.  Note that this only provides transparent access to courses that already allow guest access.';
  $string['configoverride'] = 'Defined in config.php';
  $string['configpasswordpolicy'] = 'Turning this on will make Moodle check user passwords against a valid password policy. Use the settings below to specify your policy (they will be ignored if you set this to \'No\').';
 +$string['configpasswordresettime'] = 'This specifies the amount of time people have to validate a password reset request before it expires. Usually 30 minutes is a good value.';
  $string['configpathtoclam'] = 'Path to clam AV.  Probably something like /usr/bin/clamscan or /usr/bin/clamdscan. You need this in order for clam AV to run.';
  $string['configpathtodu'] = 'Path to du. Probably something like /usr/bin/du. If you enter this, pages that display directory contents will run much faster for directories with a lot of files.';
  $string['configperfdebug'] = 'If you turn this on, performance info will be printed in the footer of the standard theme';
@@@ -354,6 -353,7 +355,6 @@@ $string['configyuicomboloading'] = 'Thi
  $string['confirmation'] = 'Confirmation';
  $string['confirmdeletecomments'] = 'You are about to delete comments, are you sure?';
  $string['confirmed'] = 'Confirmed';
 -$string['convertformat'] = '<i>convert</i> output format';
  $string['cookiehttponly'] = 'Only http cookies';
  $string['cookiesecure'] = 'Secure cookies only';
  $string['country'] = 'Default country';
@@@ -361,7 -361,7 +362,7 @@@ $string['coursecontact'] = 'Course cont
  $string['coursecontact_desc'] = 'This setting allows you to control who appears on the course description. Users need to have at least one of these roles in a course to be shown on the course description for that course.';
  $string['courselistshortnames'] = 'Display extended course names';
  $string['courselistshortnames_desc'] = 'If enabled, course short names will be displayed in addition to full names in course lists. If required, extended course names may be customised by editing the \'courseextendednamedisplay\' language string using the language customisation feature.';
 -$string['coursemgmt'] = 'Add/edit courses';
 +$string['coursemgmt'] = 'Manage courses and categories';
  $string['courseoverview'] = 'Course overview';
  $string['courserequestnotify'] = 'Course request notification';
  $string['courserequestnotifyemail'] = 'User {$a->user} requested a new course at {$a->link}';
@@@ -380,8 -380,10 +381,8 @@@ $string['cronerrorclionly'] = 'Sorry, i
  $string['cronerrorpassword'] = 'Sorry, you have not provided a valid password to access this page';
  $string['cronremotepassword'] = 'Cron password for remote access';
  $string['cronwarning'] = 'The <a href="cron.php">cron.php maintenance script</a> has not been run for at least 24 hours.';
 -$string['ctyperecommended'] = 'Installing the optional ctype PHP extension is highly recommended in order to improve site performance, particularly if your site is supporting non-latin languages.';
  $string['ctyperequired'] = 'The ctype PHP extension is now required by Moodle, in order to improve site performance and to offer multilingual compatibility.';
  $string['curlcache'] = 'cURL cache TTL';
 -$string['curlrecommended'] = 'Installing the optional cURL library is highly recommended in order to enable Moodle Networking functionality.';
  $string['curlrequired'] = 'The cURL PHP extension is now required by Moodle, in order to communicate with Moodle repositories.';
  $string['curltimeoutkbitrate'] = 'Bitrate to use when calculating cURL timeouts (Kbps)';
  $string['curltimeoutkbitrate_help'] = 'This setting is used to calculate an appropriate timeout during large cURL requests. As part of this calculation an HTTP HEAD request is made to determine the size of the content. Setting this to 0 disables this request from being made.';
@@@ -392,6 -394,14 +393,6 @@@ $string['custommenuitems'] = 'Custom me
  $string['datarootsecurityerror'] = '<p><strong>SECURITY WARNING!</strong></p><p>Your dataroot directory is in the wrong location and is exposed to the web. This means that all your private files are available to anyone in the world, and some of them could be used by a cracker to obtain unauthorised administrative access to your site!</p>
  <p>You <em>must</em> move dataroot directory ({$a}) to a new location that is not within your public web directory, and update the <code>$CFG->dataroot</code> setting in your config.php accordingly.</p>';
  $string['datarootsecuritywarning'] = 'Your site configuration might not be secure. Please make sure that your dataroot directory ({$a}) is not directly accessible via web.';
 -$string['dbmigrate'] = 'Moodle database migration';
 -$string['dbmigrateconnecerror'] = 'Could not connect to the database specified.';
 -$string['dbmigrateencodingerror'] = 'The database specified has encoding {$a} rather than required UNICODE/UTF8.<br />Please specify another.';
 -$string['dbmigratepostgres'] = 'It seems that you are using PostgreSQL as the database server. To continue the migration process you need to manually create a new database with encoding "UNICODE"(PostgreSQL 7) or "UTF8" (PostgreSQL 8) to store the migrated data. Please enter your new database connection settings below to continue:';
 -$string['dbmigratewarning'] = 'Please make sure that you have backed up your Moodle database before commencing this procedure. If you are unsure of how to do that, please contact your system admin. Your Moodle site will be put under maintenance mode after you start the migration process';
 -$string['dbmigratewarning2'] = '<b>Warning: You are about to start the database migration process. Please be very sure that your entire Moodle database is backed up.</b>';
 -$string['dbmigrationdeprecateddb'] = '<font color="#ff0000">This database is migrated to a new UTF8 database and deprecated. Please edit your config.php and use the new database for this moodle.</font>';
 -$string['dbmigrationdupfailed'] = 'Database duplication failed with possible error:<font color="#ff0000"><pre>{$a}</pre></font>';
  $string['dbsessions'] = 'Use database for session information';
  $string['debug'] = 'Debug messages';
  $string['debugall'] = 'ALL: Show all reasonable PHP debug messages';
@@@ -413,9 -423,13 +414,9 @@@ $string['defaulthomepage'] = 'Default h
  $string['defaultrequestcategory'] = 'Default category for course requests';
  $string['defaultsettinginfo'] = 'Default: {$a}';
  $string['defaultuserroleid'] = 'Default role for all users';
 -$string['deletefilterareyousure'] = 'Are you sure you want to delete the filter \'{$a}\'';
 -$string['deletefilterareyousuremessage'] = 'You are about to completely delete the filter \'{$a}\'. Are you sure you want to uninstall it?';
 -$string['deletefilterfiles'] = 'All data associated with the filter \'{$a->filter}\' has been deleted from the database. To complete the deletion (and to prevent the filter from re-installing itself), you should now delete this directory from your server: {$a->directory}';
  $string['deleteincompleteusers'] = 'Delete incomplete users after';
  $string['deleteunconfirmed'] = 'Delete not fully setup users after';
  $string['deleteuser'] = 'Delete user';
 -$string['deletingfilter'] = 'Deleting filter \'{$a}\'';
  $string['density'] = 'Density';
  $string['denyemailaddresses'] = 'Denied email domains';
  $string['development'] = 'Development';
@@@ -429,6 -443,7 +430,7 @@@ $string['disableuserimages'] = 'Disabl
  $string['displayerrorswarning'] = 'Enabling the PHP setting <em>display_errors</em> is not recommended on production sites because some error messages may reveal sensitive information about your server.';
  $string['displayloginfailures'] = 'Display login failures to';
  $string['dndallowtextandlinks'] = 'Drag and drop upload of text/links';
+ $string['doclang'] = 'Language for docs';
  $string['docroot'] = 'Moodle Docs document root';
  $string['doctonewwindow'] = 'Open in new window';
  $string['download'] = 'Download';
@@@ -476,8 -491,6 +478,8 @@@ $string['enablerecordcache'] = 'Enable 
  $string['enablerssfeeds'] = 'Enable RSS feeds';
  $string['enablesafebrowserintegration'] = 'Enable Safe Exam Browser integration';
  $string['enablestats'] = 'Enable statistics';
 +$string['enabletgzbackups'] = 'Enable new backup format';
 +$string['enabletgzbackups_desc'] = 'If enabled, future backups will be created in a new compression format for .mbz files (internally stored as a .tar.gz file). This removes the 4GB backup size restriction and may improve performance. Restore supports both formats and the difference should be transparent to users.';
  $string['enabletrusttext'] = 'Enable trusted content';
  $string['enablewebservices'] = 'Enable web services';
  $string['enablewsdocumentation'] = 'Web services documentation';
@@@ -508,6 -521,7 +510,6 @@@ $string['experimental'] = 'Experimental
  $string['experimentalsettings'] = 'Experimental settings';
  $string['extendedusernamechars'] = 'Allow extended characters in usernames';
  $string['extramemorylimit'] = 'Extra PHP memory limit';
 -$string['fatalmagicquotesruntime'] = '<p>Serious configuration error detected, please notify server administrator.</p><p> To operate properly, Moodle requires that administrator changes PHP settings.</p><p><code>magic_quotes_runtime</code> must be set to <code>off</code>.</p><p>This setting is controlled by editing <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file on the server.</p>';
  $string['fatalsessionautostart'] = '<p>Serious configuration error detected, please notify server administrator.</p><p> To operate properly, Moodle requires that administrator changes PHP settings.</p><p><code>session.auto_start</code> must be set to <code>off</code>.</p><p>This setting is controlled by editing <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file on the server.</p>';
  $string['filecreated'] = 'New file created';
  $string['filestoredin'] = 'Save file into folder :';
@@@ -519,12 -533,14 +521,12 @@@ $string['filters'] = 'Filters'
  $string['filtersettings'] = 'Manage filters';
  $string['filtersettingsgeneral'] = 'General filter settings';
  $string['filteruploadedfiles'] = 'Filter uploaded files';
 -$string['forcelogin'] = 'Force users to login';
 -$string['forceloginforprofileimage'] = 'Force users to login to view user pictures';
 +$string['forcelogin'] = 'Force users to log in';
 +$string['forceloginforprofileimage'] = 'Force users to log in to view user pictures';
  $string['forceloginforprofileimage_help'] = 'If enabled, users must login in order to view user profile pictures and the default user picture will be used in all notification emails.';
 -$string['forceloginforprofiles'] = 'Force users to login for profiles';
 -$string['forcetimezone'] = 'Force default timezone';
 +$string['forceloginforprofiles'] = 'Force users to log in for profiles';
 +$string['forcetimezone'] = 'Force timezone';
  $string['formatuninstallwithcourses'] = 'There are {$a->count} courses using {$a->format}. Their format will be changed to {$a->defaultformat} (default format for this site). Some format-specific data may be lost. Are you sure you want to proceed?';
 -$string['formatuninstallconfirm'] = '{$a} will be uninstalled. No courses currently use it. Continue?';
 -$string['formatuninstalled'] = 'All data associated with the format plugin \'{$a->plugin}\' has been deleted from the database.  To complete the deletion (and prevent the plugin re-installing itself), you should now delete this directory from your server: {$a->directory}';
  $string['frontpage'] = 'Front page';
  $string['frontpagebackup'] = 'Front page backup';
  $string['frontpagedefaultrole'] = 'Default frontpage role';
@@@ -536,11 -552,13 +538,11 @@@ $string['frontpagerestore'] = 'Front pa
  $string['frontpageroles'] = 'Front page roles';
  $string['frontpagesettings'] = 'Front page settings';
  $string['fullnamedisplay'] = 'Full name format';
 -$string['gdrecommended'] = 'GD extension is used for conversion of images, some features such as user profile images will not be available if missing.';
 +$string['fullnamedisplayprivate'] = 'Full name format - private';
  $string['gdrequired'] = 'The GD extension is now required by Moodle for image conversion.';
  $string['generalsettings'] = 'General settings';
  $string['geoipfile'] = 'GeoIP city data file';
  $string['getremoteaddrconf'] = 'Logged IP address source';
 -$string['globalsquoteswarning'] = '<p><strong>Security Warning</strong>: to operate properly, Moodle requires <br />that you make certain changes to your current PHP settings.<p/><p>You <em>must</em> set <code>register_globals=off</code> and/or <code>magic_quotes_gpc=on</code>. <br />If possible, you should set <code>register_globals=off</code> to improve general <br /> server security, setting <code>magic_quotes_gpc=on</code> is also recommended.<p/><p>These settings are controlled by editing your <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file.</p>';
 -$string['globalswarning'] = '<p><strong>SECURITY WARNING!</strong></p><p> To operate properly, Moodle requires <br />that you make certain changes to your current PHP settings.</p><p>You <em>must</em> set <code>register_globals=off</code>.</p><p>This setting is controlled by editing your <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file.</p>';
  $string['groupenrolmentkeypolicy'] = 'Group enrolment key policy';
  $string['groupenrolmentkeypolicy_desc'] = 'Turning this on will make Moodle check group enrolment keys against a valid password policy.';
  $string['googlemapkey3'] = 'Google Maps API V3 key';
@@@ -554,6 -572,7 +556,6 @@@ $string['gradeexport'] = 'Primary grad
  $string['guestroleid'] = 'Role for guest';
  $string['guestroleid_help'] = 'This role is automatically assigned to the guest user. It is also temporarily assigned to not enrolled users that enter the course via guest enrolment plugin.';
  $string['helpadminseesall'] = 'Do admins see all calendar events or just those that apply to themselves?';
 -$string['helpcalendarsettings'] = 'Configure various calendar and date/time-related aspects of Moodle';
  $string['helpcalendarcustomexport'] = 'Enable custom date range export option in calendar exports. Calendar exports must be enabled before this is effective.';
  $string['helpexportlookahead'] = 'How many days in the future does the calendar look for events during export for the custom export option?';
  $string['helpexportlookback'] = 'How many days in the past does the calendar look for events during export for the custom export option?';
@@@ -578,6 -597,7 +580,6 @@@ $string['change'] = 'change'
  $string['checkboxno'] = 'No';
  $string['checkboxyes'] = 'Yes';
  $string['choosefiletoedit'] = 'Choose file to edit';
 -$string['iconvrecommended'] = 'Installing the optional ICONV library is highly recommended in order to improve site performance, particularly if your site is supporting non-Latin languages.';
  $string['iconvrequired'] = 'Installing ICONV extension is required.';
  $string['ignore'] = 'Ignore';
  $string['includemoduleuserdata'] = 'Include module user data';
@@@ -605,11 -625,11 +607,11 @@@ $string['langmenu'] = 'Display languag
  $string['langpackwillbeupdated'] = 'NOTE: Moodle will try to download updates for your language packs during the upgrade.';
  $string['langstringcache'] = 'Cache all language strings';
  $string['languagesettings'] = 'Language settings';
 -$string['latexpreamble'] = 'LaTeX preamble';
 -$string['latexsettings'] = 'LaTeX renderer Settings';
  $string['latinexcelexport'] = 'Excel encoding';
 +$string['legacyfilesaddallowed'] = 'Allow adding to legacy course files';
 +$string['legacyfilesaddallowed_help'] = 'If a course has legacy course files, allow new files and folders to be added to it.';
  $string['legacyfilesinnewcourses'] = 'Legacy course files in new courses';
 -$string['legacyfilesinnewcourses_help'] = 'By default legacy course files areas are available only in upgraded courses. Please note some features like single activity backup/restore are not compatible with this settings.';
 +$string['legacyfilesinnewcourses_help'] = 'By default, legacy course files areas are available in upgraded courses only. Please note that some features such as activity backup and restore are not compatible with this setting.';
  $string['licensesettings'] = 'Licence settings';
  $string['linkadmincategories'] = 'Link admin categories';
  $string['linkadmincategories_help'] = 'If enabled admin setting categories will be displayed as links in the navigation and will lead to the admin category pages.';
@@@ -652,7 -672,7 +654,7 @@@ $string['loginpasswordautocomplete_help
  $string['loglifetime'] = 'Keep logs for';
  $string['longtimewarning'] = '<b>Please note that this process can take a long time.</b>';
  $string['maintenancemode'] = 'In maintenance mode';
 -$string['maintenancemodeisscheduled'] = 'Site is switching to maintenance mode in {$a} minutes';
 +$string['maintenancemodeisscheduled'] = 'This site will be switched to maintenance mode in {$a->min} mins {$a->sec} secs';
  $string['maintfileopenerror'] = 'Error opening maintenance files!';
  $string['maintinprogress'] = 'Maintenance is in progress...';
  $string['manageformats'] = 'Manage course formats';
@@@ -712,8 -732,6 +714,8 @@@ $string['mobile'] = 'Mobile'
  $string['mobilecssurl'] = 'CSS';
  $string['modchooserdefault'] = 'Activity chooser default';
  $string['modeditdefaults'] = 'Default values for activity settings';
 +$string['modeditingmenu'] = 'Activity editing menus';
 +$string['modeditingmenu_desc'] = 'If enabled many of the activity editing icons shown when viewing a course with editing on will be displayed within a drop-down menu. This reduces the content on screen when editing a course by hiding the icons until they are needed.';
  $string['modsettings'] = 'Manage activities';
  $string['modulesecurity'] = 'Module security';
  $string['multilangforceold'] = 'Force old multilang syntax: &lt;span&gt; without the class="multilang" and &lt;lang&gt;';
@@@ -725,6 -743,8 +727,6 @@@ $string['mymoodleredirect'] = 'Force us
  $string['mypage'] = 'Default My home page';
  $string['myprofile'] = 'Default profile page';
  $string['mypagelocked'] = 'Lock default page';
 -$string['mysql416bypassed'] = 'However, if your site is using iso-8859-1 (latin) languages ONLY, you may continue using your currently installed MySQL 4.1.12 (or higher).';
 -$string['mysql416required'] = 'MySQL 4.1.16 is the minimum version required for Moodle 1.6 in order to guarantee that all data can be converted to UTF-8 in the future.';
  $string['navadduserpostslinks'] = 'Add links to view user posts';
  $string['navadduserpostslinks_help'] = 'If enabled two links will be added to each user in the navigation to view discussions the user has started and posts the user has made in forums throughout the site or in specific courses.';
  $string['navigationupgrade'] = 'This upgrade introduces two new navigation blocks that will replace these blocks: Administration, Courses, Activities and Participants.  If you had set any special permissions on those blocks you should check to make sure everything is behaving as you want it.';
@@@ -738,7 -758,7 +740,7 @@@ $string['navshowcategories'] = 'Show co
  $string['navshowmycoursecategories'] = 'Show my course categories';
  $string['navshowmycoursecategories_help'] = 'If enabled courses in the users my courses branch will be shown in categories.';
  $string['navsortmycoursessort'] = 'Sort my courses';
 -$string['navsortmycoursessort_help'] = 'This determines whether courses are listed under My courses according to the sort order (i.e. the order set in Settings > Site Administration > Courses > Add/edit courses) or alphabetically by course setting.';
 +$string['navsortmycoursessort_help'] = 'This determines whether courses are listed under My courses according to the sort order (i.e. the order set in Site administration > Courses > Manage courses and categories) or alphabetically by course setting.';
  $string['neverdeleteruns'] = 'Never delete runs';
  $string['nobookmarksforuser'] = 'You do not have any bookmarks.';
  $string['nodatabase'] = 'No database';
@@@ -746,8 -766,6 +748,8 @@@ $string['nohttpsformobilewarning'] = 'I
  $string['nomissingstrings'] = 'No missing strings';
  $string['nonewsettings'] = 'No new settings were added during this upgrade.';
  $string['nonexistentbookmark'] = 'The bookmark you requested does not exist.';
 +$string['maxtimelimit'] = 'Maximum time limit';
 +$string['maxtimelimit_desc'] = 'To restrict the maximum PHP execution time that Moodle will allow without any output being displayed, enter a value in seconds here. 0 means that Moodle default restrictions are used. If you have a front-end server with its own time limit, set this value lower to receive PHP errors in logs. Does not apply to CLI scripts.';
  $string['noresults'] = 'No results found.';
  $string['noroles'] = 'No roles';
  $string['notifications'] = 'Notifications';
@@@ -756,7 -774,6 +758,7 @@@ $string['notifyloginthreshold'] = 'Thre
  $string['notloggedinroleid'] = 'Role for visitors';
  $string['numberofmissingstrings'] = 'Number of missing strings: {$a}';
  $string['numberofstrings'] = 'Total number of strings: {$a->strings}<br />Missing: {$a->missing} ({$a->missingpercent}&nbsp;%)';
 +$string['opcacherecommended'] = 'PHP opcode caching improves performance and lowers memory requirements, OPcache extension is recommended and fully supported.';
  $string['opensslrecommended'] = 'Installing the optional OpenSSL library is highly recommended -- it enables Moodle Networking functionality.';
  $string['opentogoogle'] = 'Open to Google';
  $string['optionalmaintenancemessage'] = 'Optional maintenance message';
@@@ -765,7 -782,9 +767,7 @@@ $string['order2'] = 'Second'
  $string['order3'] = 'Third';
  $string['order4'] = 'Fourth';
  $string['passwordpolicy'] = 'Password policy';
 -$string['pathconvert'] = 'Path of <i>convert</i> binary';
 -$string['pathdvips'] = 'Path of <i>dvips</i> binary';
 -$string['pathlatex'] = 'Path of <i>latex</i> binary';
 +$string['passwordresettime'] = 'Maximum time to validate password reset request';
  $string['pathtoclam'] = 'clam AV path';
  $string['pathtodot'] = 'Path to dot';
  $string['pathtodot_help'] = 'Path to dot. Probably something like /usr/bin/dot. To be able to generate graphics from DOT files, you must have installed the dot executable and point to it here. Note that, for now, this only used by the profiling features (Development->Profiling) built into Moodle.';
@@@ -781,7 -800,9 +783,7 @@@ $string['perfdebug'] = 'Performance inf
  $string['performance'] = 'Performance';
  $string['pgcluster'] = 'PostgreSQL Cluster';
  $string['pgclusterdescription'] = 'PostgreSQL version/cluster parameter for command line operations. If you only have one postgresql on your system or you are not sure what this is, leave this blank.';
 -$string['php533warning'] = 'PHP 5.3.3 and upwards is recommended';
  $string['phpfloatproblem'] = 'Detected unexpected problem in handling of PHP float numbers - {$a}';
 -$string['php50restricted'] = 'PHP 5.0.x has a number of known problems, please upgrade to 5.1.x or downgrade to 4.3.x or 4.4.x';
  $string['pleaserefreshregistration'] = 'Your site has been registered with moodle.org, please consider updating the registration if significant changes happened since your last update, on {$a}';
  $string['pleaseregister'] = 'Please register your site to remove this button';
  $string['plugin'] = 'Plugin';
@@@ -855,8 -876,6 +857,8 @@@ $string['profilingenabled'] = 'Enable p
  $string['profilingenabled_help'] = 'If you enable this setting, then profiling will be available in this site and you will be able to define its behavior by configuring the next options.';
  $string['profilingexcluded'] = 'Exclude profiling';
  $string['profilingexcluded_help'] = 'List of (comma separated, absolute skipping wwwroot, callable) URLs that will be excluded from being profiled from the ones defined by \'Profile these\' setting.';
 +$string['profilingimportprefix'] = 'Profiling import prefix';
 +$string['profilingimportprefix_desc'] = 'For easier detection, all the imported profiling runs will be prefixed with the value specified here.';
  $string['profilingincluded'] = 'Profile these';
  $string['profilingincluded_help'] = 'List of (comma separated, absolute skipping wwwroot, callable) URLs that will be automatically profiled. Examples: /index.php, /course/view.php. Also accepts the * wildchar at any position. Examples: /mod/forum/*, /mod/*/view.php.';
  $string['profilinglifetime'] = 'Keep profiling runs';
@@@ -868,6 -887,8 +870,6 @@@ $string['proxypassword'] = 'Proxy passw
  $string['proxyport'] = 'Proxy port';
  $string['proxytype'] = 'Proxy type';
  $string['proxyuser'] = 'Proxy username';
 -$string['qtyperqpwillberemoved'] = 'During the upgrade, the RQP question type will be removed. You were not using this question type, so you should not experience any problems.';
 -$string['qtyperqpwillberemovedanyway'] = 'During the upgrade, the RQP question type will be removed. You have some RQP questions in your database, and these will stop working unless you reinstall the code from http://moodle.org/mod/data/view.php?d=13&amp;rid=797 before continuing with the upgrade.';
  $string['quarantinedir'] = 'Quarantine directory';
  $string['question'] = 'Question';
  $string['questionbehaviours'] = 'Question behaviours';
@@@ -890,6 -911,7 +892,6 @@@ $string['releasenoteslink'] = 'For info
  $string['rememberusername'] = 'Remember username';
  $string['rememberusername_desc'] = 'Enable if you want to store permanent cookies with usernames during user login. Permanent cookies may be considered a privacy issue if used without consent.';
  $string['reportsmanage'] = 'Manage reports';
 -$string['reportsdeleteconfirm'] = 'You are about to completely delete the report \'{$a}\'. This will completely delete everything in the database associated with this plugin. Are you SURE you want to continue?';
  $string['requiredentrieschanged'] = '<strong>IMPORTANT - PLEASE READ<br/>(This warning message will only be displayed during this upgrade)</strong><br/>Due to a bug fix, the behaviour of database activities using the \'Required entries\' and \'Required entries before viewing settings\' settings will change. A more detailed explanation of the changes can be read on <a href="http://moodle.org/mod/forum/discuss.php?d=110928" target="_blank">the database module forum</a>. The expected behavior of these settings can also be read on <a href="http://docs.moodle.org/en/Adding/editing_a_database#Required_entries" target="_blank">Moodle Docs</a>.
  <br/><br/>This change affects the following databases in your system: (Please save this list now, and after the upgrade, check that these activities still work the way that the teacher intends.)<br/><strong>{$a->text}</strong><br/>';
  $string['requiremodintro'] = 'Require activity description';
@@@ -898,7 -920,6 +900,7 @@@ $string['purgecaches']= 'Purge all cach
  $string['purgecachesconfirm']= 'Moodle can cache themes, javascript, language strings, filtered text, rss feeds and many other pieces of calculated data.  Purging these caches will delete that data from the server and force browsers to refetch data, so that you can be sure you are seeing the most up-to-date values produced by the current code.  There is no danger in purging caches, but your site may appear slower for a while until the server and clients calculate new information and cache it.';
  $string['purgecachesfinished']= 'All caches were purged.';
  $string['requestcategoryselection'] = 'Enable category selection';
 +$string['restorecourse'] = 'Restore course';
  $string['restorernewroleid'] = 'Restorers\' role in courses';
  $string['restorernewroleid_help'] = 'If the user does not already have the permission to manage the newly restored course, the user is automatically assigned this role and enrolled if necessary. Select "None" if you do not want restorers to be able to manage every restored course.';
  $string['reverseproxy'] = 'Reverse proxy';
@@@ -992,7 -1013,6 +994,7 @@@ $string['tablenosave'] = 'Changes in ta
  $string['tablesnosave'] = 'Changes in tables above are saved automatically.';
  $string['tabselectedtofront'] = 'On tables with tabs, should the row with the currently selected tab be placed at the front';
  $string['tabselectedtofronttext'] = 'Bring selected tab row to front';
 +$string['testsiteupgradewarning'] = 'You are currently using the {$a} test site, to upgrade it properly use the command line interface tool';
  $string['themedesignermode'] = 'Theme designer mode';
  $string['themelist'] = 'Theme list';
  $string['themenoselected'] = 'No theme selected';
@@@ -1001,18 -1021,17 +1003,18 @@@ $string['themeselect'] = 'Change theme'
  $string['themeselector'] = 'Theme selector';
  $string['themesettings'] = 'Theme settings';
  $string['therewereerrors'] = 'There were errors in your data';
 +$string['thirdpartylibrary'] = 'Library';
 +$string['thirdpartylibrarylocation'] = 'Location';
 +$string['thirdpartylibs'] = 'Third party libraries';
  $string['timezone'] = 'Default timezone';
  $string['timezoneforced'] = 'This is forced by the site administrator';
  $string['timezoneisforcedto'] = 'Force all users to use';
  $string['timezonenotforced'] = 'Users can choose their own timezone';
  $string['tokenizerrecommended'] = 'Installing the optional PHP Tokenizer extension is recommended -- it improves Moodle Networking functionality.';
  $string['tools'] = 'Admin tools';
 -$string['toolsdeleteconfirm'] = 'You are about to completely delete the admin tool \'{$a}\'. This will completely delete everything in the database associated with this plugin. Are you SURE you want to continue?';
  $string['toolsmanage'] = 'Manage admin tools';
  $string['unattendedoperation'] = 'Unattended operation';
  $string['unbookmarkthispage'] = 'Unbookmark this page';
 -$string['unicoderecommended'] = 'Storing all your data in Unicode (UTF-8) is recommended. New installations should be performed into databases that have their default character set as Unicode.  If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
  $string['unicoderequired'] = 'It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode.  If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
  $string['uninstallplugin'] = 'Uninstall';
  $string['unlockaccount'] = 'Unlock account';
@@@ -1070,17 -1089,23 +1072,17 @@@ This warning is often caused by unzippi
  This warning can also be caused by an incomplete checkout or update operation from the Git repository, in which case you may just have to wait for the operation to complete, or perhaps run the appropriate clean-up command and retry the operation.
  
  You can find more information in upgrade documentation at <a href="{$a}">{$a}</a>.';
 -$string['upgradesure'] = 'Your Moodle files have been changed, and you are about to automatically upgrade your server to this version: <br /><br />
 -<strong>{$a}</strong> <br /><br />
 -Once you do this you can not go back again. <br /><br />
 -Please note that this process can take a long time. <br /><br />
 -Are you sure you want to upgrade this server to this version?';
 +$string['upgradesure'] = '<p>Your Moodle files have been changed, and you are about to automatically upgrade your server to this version:</p>
 +<p><strong>{$a}</strong></p>
 +<p>Once you do this you can not go back again. Please note that this process can take a long time.</p>
 +<p>Are you sure you want to upgrade this server to this version?</p>';
  $string['upgradetimedout'] = 'Upgrade timed out, please restart the upgrade.';
 -$string['upgrade197notice'] = '<p>Moodle 1.9.7 contains a number of security fixes to user passwords and backups to protect the user data on your site. As a result some of your settings and permissions relating to backups may have changed.<br />
 -See the <a href="http://docs.moodle.org/dev/Moodle_1.9.7_release_notes" target="_blank">Moodle 1.9.7 release notes</a> for full details.</p>';
 -$string['upgrade197noticesubject'] = 'Moodle 1.9.7 upgrade security notices';
 -$string['upgrade197salt'] = 'To reduce the risk of password theft, you are strongly recommended to set a password salt.<br />See the <a href="{$a}" target="_blank">password salting documentation</a> for details.';
  $string['upgradingdata'] = 'Upgrading data';
  $string['upgradinglogs'] = 'Upgrading logs';
  $string['upgradingversion'] = 'Upgrading to new version';
  $string['upwards'] = 'upwards';
  $string['useblogassociations'] = 'Enable associations';
  $string['useexternalyui'] = 'Use online YUI libraries';
 -$string['usehtmleditor'] = 'Use HTML editor';
  $string['user'] = 'User';
  $string['userbulk'] = 'Bulk user actions';
  $string['userlist'] = 'Browse list of users';
diff --combined lib/setuplib.php
@@@ -51,6 -51,19 +51,6 @@@ define('MEMORY_EXTRA', -3)
  /** Extremely large memory limit - not recommended for standard scripts */
  define('MEMORY_HUGE', -4);
  
 -/**
 - * Software maturity levels used by the core and plugins
 - */
 -define('MATURITY_ALPHA',    50);    // internals can be tested using white box techniques
 -define('MATURITY_BETA',     100);   // feature complete, ready for preview and testing
 -define('MATURITY_RC',       150);   // tested, will be released unless there are fatal bugs
 -define('MATURITY_STABLE',   200);   // ready for production deployment
 -
 -/**
 - * Special value that can be used in $plugin->dependencies in version.php files.
 - */
 -define('ANY_VERSION', 'any');
 -
  
  /**
   * Simple class. It is usually used instead of stdClass because it looks
@@@ -202,10 -215,10 +202,10 @@@ class required_capability_exception ext
          $capabilityname = get_capability_string($capability);
          if ($context->contextlevel == CONTEXT_MODULE and preg_match('/:view$/', $capability)) {
              // we can not go to mod/xx/view.php because we most probably do not have cap to view it, let's go to course instead
 -            $paranetcontext = context::instance_by_id(get_parent_contextid($context));
 -            $link = get_context_url($paranetcontext);
 +            $parentcontext = $context->get_parent_context();
 +            $link = $parentcontext->get_url();
          } else {
 -            $link = get_context_url($context);
 +            $link = $context->get_url();
          }
          parent::__construct($errormessage, $stringfile, $link, $capabilityname);
      }
@@@ -516,7 -529,8 +516,7 @@@ function get_exception_info($ex) 
      // Remove some absolute paths from message and debugging info.
      $searches = array();
      $replaces = array();
 -    $cfgnames = array('tempdir', 'cachedir', 'themedir',
 -        'langmenucachefile', 'langcacheroot', 'dataroot', 'dirroot');
 +    $cfgnames = array('tempdir', 'cachedir', 'localcachedir', 'themedir', 'dataroot', 'dirroot');
      foreach ($cfgnames as $cfgname) {
          if (property_exists($CFG, $cfgname)) {
              $searches[] = $CFG->$cfgname;
@@@ -629,10 -643,16 +629,16 @@@ function get_docs_url($path = null) 
          // that will ensure people end up at the latest version of the docs.
          $branch = '.';
      }
-     if (!empty($CFG->docroot)) {
-         return $CFG->docroot . '/' . $branch . '/' . current_language() . '/' . $path;
+     if (empty($CFG->doclang)) {
+         $lang = current_language();
      } else {
-         return 'http://docs.moodle.org/'. $branch . '/' . current_language() . '/' . $path;
+         $lang = $CFG->doclang;
+     }
+     $end = '/' . $branch . '/' . $lang . '/' . $path;
+     if (empty($CFG->docroot)) {
+         return 'http://docs.moodle.org'. $end;
+     } else {
+         return $CFG->docroot . $end ;
      }
  }
  
@@@ -651,7 -671,7 +657,7 @@@ function format_backtrace($callers, $pl
          return '';
      }
  
 -    $from = $plaintext ? '' : '<ul style="text-align: left">';
 +    $from = $plaintext ? '' : '<ul style="text-align: left" data-rel="backtrace">';
      foreach ($callers as $caller) {
          if (!isset($caller['line'])) {
              $caller['line'] = '?'; // probably call_user_func()
@@@ -704,34 -724,37 +710,34 @@@ function ini_get_bool($ini_get_arg) 
  function setup_validate_php_configuration() {
     // this must be very fast - no slow checks here!!!
  
 -   if (ini_get_bool('register_globals')) {
 -       print_error('globalswarning', 'admin');
 -   }
     if (ini_get_bool('session.auto_start')) {
         print_error('sessionautostartwarning', 'admin');
     }
 -   if (ini_get_bool('magic_quotes_runtime')) {
 -       print_error('fatalmagicquotesruntime', 'admin');
 -   }
  }
  
  /**
 - * Initialise global $CFG variable
 - * @return void
 + * Initialise global $CFG variable.
 + * @private to be used only from lib/setup.php
   */
  function initialise_cfg() {
      global $CFG, $DB;
  
 +    if (!$DB) {
 +        // This should not happen.
 +        return;
 +    }
 +
      try {
 -        if ($DB) {
 -            $localcfg = get_config('core');
 -            foreach ($localcfg as $name => $value) {
 -                if (property_exists($CFG, $name)) {
 -                    // config.php settings always take precedence
 -                    continue;
 -                }
 -                $CFG->{$name} = $value;
 -            }
 -        }
 +        $localcfg = get_config('core');
      } catch (dml_exception $e) {
 -        // most probably empty db, going to install soon
 +        // Most probably empty db, going to install soon.
 +        return;
 +    }
 +
 +    foreach ($localcfg as $name => $value) {
 +        // Note that get_config() keeps forced settings
 +        // and normalises values to string if possible.
 +        $CFG->{$name} = $value;
      }
  }
  
@@@ -764,10 -787,7 +770,10 @@@ function initialise_fullme() 
          // Do not abuse this to try to solve lan/wan access problems!!!!!
  
      } else {
 -        if (($rurl['host'] !== $wwwroot['host']) or (!empty($wwwroot['port']) and $rurl['port'] != $wwwroot['port'])) {
 +        if (($rurl['host'] !== $wwwroot['host']) or
 +                (!empty($wwwroot['port']) and $rurl['port'] != $wwwroot['port']) or
 +                (strpos($rurl['path'], $wwwroot['path']) !== 0)) {
 +
              // Explain the problem and redirect them to the right URL
              if (!defined('NO_MOODLE_COOKIES')) {
                  define('NO_MOODLE_COOKIES', true);
@@@ -930,103 -950,6 +936,103 @@@ function setup_get_remote_url() 
      return $rurl;
  }
  
 +/**
 + * Try to work around the 'max_input_vars' restriction if necessary.
 + */
 +function workaround_max_input_vars() {
 +    // Make sure this gets executed only once from lib/setup.php!
 +    static $executed = false;
 +    if ($executed) {
 +        debugging('workaround_max_input_vars() must be called only once!');
 +        return;
 +    }
 +    $executed = true;
 +
 +    if (!isset($_SERVER["CONTENT_TYPE"]) or strpos($_SERVER["CONTENT_TYPE"], 'multipart/form-data') !== false) {
 +        // Not a post or 'multipart/form-data' which is not compatible with "php://input" reading.
 +        return;
 +    }
 +
 +    if (!isloggedin() or isguestuser()) {
 +        // Only real users post huge forms.
 +        return;
 +    }
 +
 +    $max = (int)ini_get('max_input_vars');
 +
 +    if ($max <= 0) {
 +        // Most probably PHP < 5.3.9 that does not implement this limit.
 +        return;
 +    }
 +
 +    if ($max >= 200000) {
 +        // This value should be ok for all our forms, by setting it in php.ini
 +        // admins may prevent any unexpected regressions caused by this hack.
 +
 +        // Note there is no need to worry about DDoS caused by making this limit very high
 +        // because there are very many easier ways to DDoS any Moodle server.
 +        return;
 +    }
 +
 +    if (count($_POST, COUNT_RECURSIVE) < $max) {
 +        return;
 +    }
 +
 +    // Large POST request with enctype supported by php://input.
 +    // Parse php://input in chunks to bypass max_input_vars limit, which also applies to parse_str().
 +    $str = file_get_contents("php://input");
 +    if ($str === false or $str === '') {
 +        // Some weird error.
 +        return;
 +    }
 +
 +    $delim = '&';
 +    $fun = create_function('$p', 'return implode("'.$delim.'", $p);');
 +    $chunks = array_map($fun, array_chunk(explode($delim, $str), $max));
 +
 +    foreach ($chunks as $chunk) {
 +        $values = array();
 +        parse_str($chunk, $values);
 +
 +        merge_query_params($_POST, $values);
 +        merge_query_params($_REQUEST, $values);
 +    }
 +}
 +
 +/**
 + * Merge parsed POST chunks.
 + *
 + * NOTE: this is not perfect, but it should work in most cases hopefully.
 + *
 + * @param array $target
 + * @param array $values
 + */
 +function merge_query_params(array &$target, array $values) {
 +    if (isset($values[0]) and isset($target[0])) {
 +        // This looks like a split [] array, lets verify the keys are continuous starting with 0.
 +        $keys1 = array_keys($values);
 +        $keys2 = array_keys($target);
 +        if ($keys1 === array_keys($keys1) and $keys2 === array_keys($keys2)) {
 +            foreach ($values as $v) {
 +                $target[] = $v;
 +            }
 +            return;
 +        }
 +    }
 +    foreach ($values as $k => $v) {
 +        if (!isset($target[$k])) {
 +            $target[$k] = $v;
 +            continue;
 +        }
 +        if (is_array($target[$k]) and is_array($v)) {
 +            merge_query_params($target[$k], $v);
 +            continue;
 +        }
 +        // We should not get here unless there are duplicates in params.
 +        $target[$k] = $v;
 +    }
 +}
 +
  /**
   * Initializes our performance info early.
   *
@@@ -1109,14 -1032,7 +1115,14 @@@ function raise_memory_limit($newlimit) 
          }
  
      } else if ($newlimit == MEMORY_HUGE) {
 +        // MEMORY_HUGE uses 2G or MEMORY_EXTRA, whichever is bigger.
          $newlimit = get_real_size('2G');
 +        if (!empty($CFG->extramemorylimit)) {
 +            $extra = get_real_size($CFG->extramemorylimit);
 +            if ($extra > $newlimit) {
 +                $newlimit = $extra;
 +            }
 +        }
  
      } else {
          $newlimit = get_real_size($newlimit);
@@@ -1255,11 -1171,11 +1261,11 @@@ function disable_output_buffering() 
   */
  function redirect_if_major_upgrade_required() {
      global $CFG;
 -    $lastmajordbchanges = 2013041800.00;
 +    $lastmajordbchanges = 2014012400.00;
      if (empty($CFG->version) or (float)$CFG->version < $lastmajordbchanges or
              during_initial_install() or !empty($CFG->adminsetuppending)) {
          try {
 -            @session_get_instance()->terminate_current();
 +            @\core\session\manager::terminate_current();
          } catch (Exception $e) {
              // Ignore any errors, redirect to upgrade anyway.
          }
@@@ -1314,7 -1230,7 +1320,7 @@@ function upgrade_ensure_not_running($wa
  function check_dir_exists($dir, $create = true, $recursive = true) {
      global $CFG;
  
 -    umask(0000); // just in case some evil code changed it
 +    umask($CFG->umaskpermissions);
  
      if (is_dir($dir)) {
          return true;
@@@ -1346,19 -1262,14 +1352,19 @@@ function make_writable_directory($dir, 
          }
      }
  
 -    umask(0000); // just in case some evil code changed it
 +    umask($CFG->umaskpermissions);
  
      if (!file_exists($dir)) {
          if (!mkdir($dir, $CFG->directorypermissions, true)) {
 -            if ($exceptiononerror) {
 -                throw new invalid_dataroot_permissions($dir.' can not be created, check permissions.');
 -            } else {
 -                return false;
 +            clearstatcache();
 +            // There might be a race condition when creating directory.
 +            if (!is_dir($dir)) {
 +                if ($exceptiononerror) {
 +                    throw new invalid_dataroot_permissions($dir.' can not be created, check permissions.');
 +                } else {
 +                    debugging('Can not create directory: '.$dir, DEBUG_DEVELOPER);
 +                    return false;
 +                }
              }
          }
      }
   * @param string $dir  the full path of the directory to be protected
   */
  function protect_directory($dir) {
 +    global $CFG;
      // Make sure a .htaccess file is here, JUST IN CASE the files area is in the open and .htaccess is supported
      if (!file_exists("$dir/.htaccess")) {
          if ($handle = fopen("$dir/.htaccess", 'w')) {   // For safety
              @fwrite($handle, "deny from all\r\nAllowOverride None\r\nNote: this file is broken intentionally, we do not want anybody to undo it in subdirectory!\r\n");
              @fclose($handle);
 +            @chmod("$dir/.htaccess", $CFG->filepermissions);
          }
      }
  }
@@@ -1408,10 -1317,7 +1414,10 @@@ function make_upload_directory($directo
          debugging('Use make_temp_directory() for creation of temporary directory and $CFG->tempdir to get the location.');
  
      } else if (strpos($directory, 'cache/') === 0 or $directory === 'cache') {
 -        debugging('Use make_cache_directory() for creation of chache directory and $CFG->cachedir to get the location.');
 +        debugging('Use make_cache_directory() for creation of cache directory and $CFG->cachedir to get the location.');
 +
 +    } else if (strpos($directory, 'localcache/') === 0 or $directory === 'localcache') {
 +        debugging('Use make_localcache_directory() for creation of local cache directory and $CFG->localcachedir to get the location.');
      }
  
      protect_directory($CFG->dataroot);
@@@ -1440,8 -1346,6 +1446,8 @@@ function make_temp_directory($directory
  /**
   * Create a directory under cachedir and make sure it is writable.
   *
 + * Note: this cache directory is shared by all cluster nodes.
 + *
   * @param string $directory  the full path of the directory to be created under $CFG->cachedir
   * @param bool $exceptiononerror throw exception if error encountered
   * @return string|false Returns full path to directory if successful, false if not; may throw exception
@@@ -1457,58 -1361,6 +1463,58 @@@ function make_cache_directory($director
      return make_writable_directory("$CFG->cachedir/$directory", $exceptiononerror);
  }
  
 +/**
 + * Create a directory under localcachedir and make sure it is writable.
 + * The files in this directory MUST NOT change, use revisions or content hashes to
 + * work around this limitation - this means you can only add new files here.
 + *
 + * The content of this directory gets purged automatically on all cluster nodes
 + * after calling purge_all_caches() before new data is written to this directory.
 + *
 + * Note: this local cache directory does not need to be shared by cluster nodes.
 + *
 + * @param string $directory the relative path of the directory to be created under $CFG->localcachedir
 + * @param bool $exceptiononerror throw exception if error encountered
 + * @return string|false Returns full path to directory if successful, false if not; may throw exception
 + */
 +function make_localcache_directory($directory, $exceptiononerror = true) {
 +    global $CFG;
 +
 +    make_writable_directory($CFG->localcachedir, $exceptiononerror);
 +
 +    if ($CFG->localcachedir !== "$CFG->dataroot/localcache") {
 +        protect_directory($CFG->localcachedir);
 +    } else {
 +        protect_directory($CFG->dataroot);
 +    }
 +
 +    if (!isset($CFG->localcachedirpurged)) {
 +        $CFG->localcachedirpurged = 0;
 +    }
 +    $timestampfile = "$CFG->localcachedir/.lastpurged";
 +
 +    if (!file_exists($timestampfile)) {
 +        touch($timestampfile);
 +        @chmod($timestampfile, $CFG->filepermissions);
 +
 +    } else if (filemtime($timestampfile) <  $CFG->localcachedirpurged) {
 +        // This means our local cached dir was not purged yet.
 +        remove_dir($CFG->localcachedir, true);
 +        if ($CFG->localcachedir !== "$CFG->dataroot/localcache") {
 +            protect_directory($CFG->localcachedir);
 +        }
 +        touch($timestampfile);
 +        @chmod($timestampfile, $CFG->filepermissions);
 +        clearstatcache();
 +    }
 +
 +    if ($directory === '') {
 +        return $CFG->localcachedir;
 +    }
 +
 +    return make_writable_directory("$CFG->localcachedir/$directory", $exceptiononerror);
 +}
 +
  /**
   * Checks if current user is a web crawler.
   *
@@@ -1803,18 -1655,12 +1809,18 @@@ width: 80%; -moz-border-radius: 20px; p
              $htmllang = '';
          }
  
 +        $footer = '';
 +        if (MDL_PERF_TEST) {
 +            $perfinfo = get_performance_info();
 +            $footer = '<footer>' . $perfinfo['html'] . '</footer>';
 +        }
 +
          return '<!DOCTYPE html>
  <html ' . $htmllang . '>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  '.$meta.'
  <title>' . $title . '</title>
 -</head><body>' . $content . '</body></html>';
 +</head><body>' . $content . $footer . '</body></html>';
      }
  }