Index: trunk/phase3/RELEASE-NOTES =================================================================== --- trunk/phase3/RELEASE-NOTES (revision 15100) +++ trunk/phase3/RELEASE-NOTES (revision 15101) @@ -1,646 +1,654 @@ = MediaWiki release notes = Security reminder: MediaWiki does not require PHP's register_globals setting since version 1.2.0. If you have it on, turn it *off* if you can. == MediaWiki 1.7 == THIS IS NOT A RELEASE YET. MediaWiki is now using a "continuous integration" development model with quarterly snapshot releases. The latest development code is always kept "ready to run", and in fact runs our own sites on Wikipedia. Release branches will continue to receive security updates for about a year from first release, but nonessential bugfixes and feature development happen will be made on the development trunk and appear in the next quarterly release. Those wishing to use the latest code instead of a branch release can obtain it from source control: http://www.mediawiki.org/wiki/Download_from_SVN == Configuration changes == Some default configuration options have changed: * $wgAllowExternalImages now defaults to off for increased security. == Major new features == * Deleted files can now be archived and undeleted, if you set up an appropriate non-web-accessible directory. Set $wgSaveDeletedFiles on and an appropriate directory path in $wgFileStore['deleted']['directory'] == Changes since 1.6 == * (bug 5458) Fix double-URL encoding in block log link in contribs and contribs link in block log * (bug 5462) Bogus missing patch warning in updater * (bug 5461) Use of deprecated "showhideminor" in Special:Recentchangeslinked * PHP warning when allow_call_time_pass_reference is off * Update to Finnish localization * (bug 5467) Link to page histories in watchlist edit mode * Further additions to Hebrew localisation * (bug 5476) Invalid xhtml in German localization * (bug 5479) Id translation for preferences tabs caption * (bug 5493) Id translation for special pages * Added skinname and style path parameters to CBT version of MonoBook * Include subversion revision number in Special:Version if available * (bug 5344) Fix regression that broke slashes in extension tag parameters * Improve Special:Log performance on big log sets * (bug 5507) Changed mediawiki:logouttext from plain to wikitext * (bug 4760) Prevent creation of entries in protection log when protection levels haven't changed * (bug 861) Show page protection/unprotection events in histories * (bug 5499) Don't clear the tag strip state when asked not to clear state. Fixes regression with use of in a template breaking etc. * Minor improvements to English language files * Display the anon talk page info message on anon talk pages again (moved outside the parser cache) * Optional {{DISPLAYTITLE|title with markup}} magic word Deactivated by default, set "$wgAllowDisplayTitle = true" in LocalSettings.php to activate * Cleaned SpecialContributions a bit * Added a table to track interlanguage links * (bug 5544) Fix redirect arrow in Special:Listredirects for right-to-left languages * Replace "doubleredirectsarrow" with a content language check that picks the appropriate arrow * (bug 5537) Add stub language file for Samogitian (bat-smg); inherits Lithuanian (lt) * Don't force edit summaries when a user is editing their own user/talk page * (bug 5510) Warning produced when using {{SUBPAGENAME}} in some namespaces * (bug 385) Installer support for PostgreSQL, fixes for PG compatibility * PersistentObject removed; it doesn't do anything and was broken besides. All extensions using it have been corrected. * Propagate ISBN number for Booksources in LanguageNo.php * (bug 5548) Improvements to Indonesian localisation [patch: Ivan Lanin] * Add TALKSPACE, SUBJECTSPACE, TALKPAGENAME, SUBJECTPAGENAME (and encoded forms for all) magic words * (bug 5403) Fix Special:Newpages RSS/Atom feeds * Reject malformed addresses in X-Forwarded-For entries * (bug 3359) Add hooks on completion of file upload * (bug 5559) Improve detection of ImageMagick [patch: Greg Turnquist] * (bug 5475) New pages feeds ignore "limit" argument * (bug 5184) CSS misapplied to elements in Special:Allmessages due to conflicting anchor identifiers * (bug 5519) Allow sidebar cache to be disabled; disable it by default. * Maintenance script to import the contents of a text file into a wiki page * Add $wgReservedUsernames configuration directive to block account creation/use * (bug 5576) Remove debugging hack in session check * (bug 5426) Lowercase treatment of titles in rights log leads to broken links on Special:Log * Minor improvements to French localisation files * (bug 5181) Update "nogomatch" for Slovak * (bug 5594) Id translation up to # Login and logout pages section * (bug 5536) Use content language for editing help link * Improvements to German localisation files * (bug 5570) Problems using /parameter link form for long titles * (bug 3884) Add $user parameter to AddNewUser hook, call it for by-email registrations as well as self-registrations. * (bug 4327) Report age of cached data sets in query pages * (bug 4662) Fix Safari check in wikibits.js * (bug 4663) Edit toolbar enabled in compatible versions of Safari * (bug 5572) Edit toolbar enabled in compatible versions of Konqueror (3.5+) * (bug 5235) Edit toolbar tooltips no longer show JavaScript junk in Opera * Edit toolbar now works in pure XHTML mode (application/xhtml+xml) * Add watchlist clear function to allow quick purging of all items * (bug 5625) Additional namespace translations for Welsh * Add meta tag and JavaScript variables to cached special pages which provides the timestamp of the last update, in YYYYMMDDHHMMSS format. * (bug 5628) More translations for MessagesHr.php * (bug 5595) Localisation for Bosnian language (bs) * (bug 2910) Default view preferences for watchlists * Add "hide bot edits from the watchlist" user preference * (bug 5250) Introduce Special:Unusedtemplates * Add user preference setting for an extended watchlist, showing all recent edits up to a certain edit, and not just the latest edit.. * Made MessageRo.php more general * (bug 5640) Indonesian localisation improvements * (bug 5592) Actions are logged with the default language for the wiki, not the language of the user performing the operation. * (bug 5644) Error in LanguageBs.php file * (bug 5646) Compare for identical types in wfElement() * (bug 5472) Language::userAdjust()->minDiff not initialized on else condition * (bug 5386) LanguageMk.php: updated namespaces translations * (bug 5422) Stub for Romani (rmy) language which extends ro * Fix linktrail for LanguageSr * (bug 5664) Fix Bosnian linktrail * (bug 3825) Namespace filtering on Special:Newpages * (bug 1922) When Special:Wantedpages is cached, mark links to pages which have since been created * (bug 5659) Change grammar hacks for Bosnian Wikimedia namespaces. This sort of special casing should be removed and fixed properly. * Remove useless whitespace from Special:Brokenredirects header * Treat "allmessagesnotsupporteddb" as wikitext when echoing; change default text * (bug 5497) Regression in HTML normalization in 1.6 (unclosed
  • ,
    ,
    ) * (bug 5709) Allow customisation of separator for categories * (bug 5684) Introduce Special:Randomredirect * (bug 5611) Add a name attribute to the text box containing source text in read-only pages * Indicate when a protected page is an interface message ("protectedinterface") * (bug 4259) Indicate when a protected page being edited is an interface message ("editinginterface") * (bug 4834) Fix XHTML output when using $wgMaxTocLevel * Pass login link to "whitelistedittext" containing 'returnto' parameter * (bug 5728): mVersion missing from User::__sleep() leading to constant cache miss * Updated maintenance/transstat.php so it can show duplicate messages * Improvements to update scripts; print out the version, check for superuser credentials before attempting a connection, and produce a friendlier error if the connection fails * (bug 5005) Fix XHTML output. * (bug 5315) "Expires: -1" HTTP header made strictly valid (using 1970 date). * (bug 4825) note in DefaultSettings.php about 'profiling' table creation * Remove unneeded extra whitespace at top of Special:Categories * (bug 5679) time units are now using local numerals * (bug 5751) Updates to Portuguese localisation files * (bug 5741) Introduce {{NUMBEROFUSERS}} magic word * (bug 93) tags and tildes in templates * The returnto parameter is now actually used by SpecialUserlogin.php * Parser can now know that it is parsing an interface message * (bug 4737) MediaWiki:Viewcount supports {{PLURAL}} now * Fix bug in wfMsgExt under PHP 5.1.2 * (bug 5761) Project talk namespace broken in Xal, Os, Udm and Cv * Rewrite reassignEdits script to be more efficient; support optional updates to recent changes table; add reporting and silent modes * Cleaned up formatNum usage in langfiles * (bug 5716) Warn when a user tries to upload a file which was previously deleted * (bug 5565) Add a class attribute to the table on Special:Allpages * "lang=xx" option for parser test cases to set content language * (bug 5764) Friulian translation updated * (bug 5757) Fix premature cutoff in LanguageConverter with extra end markers * (bug 5516) Show appropriate "return to" link on blocked page * (bug 5377) Do not auto-login when creating an account as another user * (bug 5284) Special redirect pages should remember parameters * Suppress 7za output on dumpBackup * (bug 5338) Reject extra initial colons in title * (bug 5487) Escape self-closed HTML pair tags * Add "raw suffix" magic word for some magic words, e.g. {{NUMBEROFUSERS|R}} will produce a count minus formatting * Fix Parser::cleanSig() to use Parser::startExternalParse() and choose an appropriate output format given the scope of the clean * (bug 5593) Change "bureaucrat log" to "rights log" * Show a boilerplate "(none)" in place of a blank within the log action text for user rights * (bug 137) Commented out translations for copyrightwarning which mention GNU FDL * (bug 5723) Don't count pages linked to from the MediaWiki namespace as "wanted" * (bug 5696) Add a third parameter, $3, to "rcnote", passing the current time formatted according to the current user's settings * (bug 5780) Thousands and decimal separators for Norwegian * Updated initStats maintenance script * (bug 5767) Fix date formats in Vietnamese locale * (bug 361) URL in URL, they were almost fixed. Now they are. * (bug 4876) Add __NEWSECTIONLINK__ magic word to force the "new section" link/tab to show up on specific pages on demand * Bidi-aid on list pages * (bug 5782) Allow entries in the bad image list to use canonical namespace names * (bug 5789) Treat "loginreqpagetext" as wikitext * Sanitizer: now handles nested
  • in
      or
        * (bug 5796) We require MySQL >=4.0.14 * Add 'EmailConfirmed' hook * New findhooks.php script to find undocumented hooks. * Silently ignore errors on profiling table update. * (bug 5801) Correct handling of underscores in Special:Listusers * Clean up Special:Listusers; add an "(all)" label to the group selection box * (bug 5812) Use appropriate link colour in Special:Mostlinked * (bug 5802) {{CURRENTMONTHNAME}} variable broken in Vietnamese locale * (bug 5817) Appropriate handling for Special:Recentchangeslinked where the target page doesn't exist * Special:Randompage now additionally accepts English namespace name as parameter * (bug 2981) Really fixed linktrail for Tamil (ta) * Disallow substituting Special pages when included into a page * (bug 5587) Clean up the languages from references to the Groups special page * Added new group-X and group-X-member messages * Rewritten removeUnusedAccounts to be more efficient, print names of inactive accounts * Redirect Special:Userlist to Special:Listusers * Introduce $wgAllowTitlesInSVG, which allows the attribute in uploaded files bearing the image/svg MIME type. Disabled by default due to the vast majority of web servers being hideously misconfigured. See DefaultSettings.php for more details. * Changed default LocalSettings.php to append the previous include path when setting it * (bug 5837) Use "members" for the value descriptor in Special:Categories, Special:Wantedcategories and Special:Mostlinkedcategories. * (bug 3309) Allow comments when undeleting pages * Clean up Special:Undelete a bit * (bug 5805) messages nbytes, ncategories can now use {{plural:}} * Clean up Special:Imagelist a bit * (bug 5838) Namespace names for Nds-NL * (bug 5749) Added Tyvan language files * (bug 5791) Fix SQL syntax in Special:BrokenRedirects, was causing incorrect data to show * (bug 5839) Prevent access to Special:Confirmemail for logged-out users * (bug 5853) Update for Portuguese messages (pt) * (bug 5851) Use Cyrillic for Kirghiz language name * (bug 5841) Allow the 'EditFilter' hook to return a non-fatal error message * (bug 5846) Link to individual group description pages in Special:Listusers * (bug 5857) Update for German localisation (de) * (bug 5858) Update for Russian language (ru) * (bug 5860) Update for Indonesian language (id) * (bug 1120) Update for Czech language (Cs) * Added many missing formatNum calls * Added grammar function to Belarusian (be) * (bug 5819) Add 'PersonalUrls' hook * (bug 5862) Update of Belarusian language (be) * (bug 5886) Update for Portuguese messages (pt) * (bug 5586) <gallery> treated text as links * (bug 5878) Update for Indonesian language (id) * (bug 5697) Update for Malay language (ms) * (bug 5890) Update for German language (de) * (bug 5889) Name for Sindhi language should appear as سنڌي * --force-normal parameter on dump scripts to force check for ICU extension * (bug 5895) Update for Dutch language (nl) * (bug 5891) Linktrail for Polish language (pl) * User::isBureaucrat , User::isDeveloper , User::isSysop deprecated in v1.6 now die with a backtrace. They will be removed in v1.8 * dumpTextPass now skips goes to database for entries that were blank in the previous dump, as this may indicate a broken dump. * dumpTextPass progress includes percentage of items prefetched * dumpTextPass can now use 7zip files for prefetch * (bug 5915) Update to Indonesian localisation (id) * (bug 5913) Update for German localisation (de) * (bug 5905) Plural support for Bosnian localisation (bs) * Groups which won't hit the rate limiter now configurable with $wgRateLimitsExcludedGroups * (bug 5806) {{plural:}} support instead of "twin" MediaWiki messages * (bug 5931) Update for Polish language (pl) * Ignore the user and user talk namespaces on Special:Wantedpages * Introduce NUMBEROFPAGES magic word * (bug 5833) Introduce CURRENTVERSION magic word * (bug 5370) Allow throttling of password reminder requests with the rate limiter * (bug 5683) Respect parser output marked as uncacheable when saving * (bug 5918) Links autonumbering now work for all defined protocols * (bug 5935) Improvement to German localisation (de) * (bug 5937) Register links from gallery captions with the parent parser output object so that link tables receive those updates too * (bug 5845) Introduce BASEPAGENAME and BASEPAGENAMEE magic words * (bug 5941) Use content language when getting the administrator page title for Special:Statistics * (bug 5949) Update to Indonesian localisation (id) * (bug 5862) Update of Belarusian translation (be) * (bug 5950) Improvements to French localisation * (bug 5805) {{plural:}} support for counters in some special pages * (bug 5952) Improvement to German localisation (de) * Rename conflicting metadata help message to "metadata_help" (was "metadata") and treat it as wiki text * Improve preferences input filtering * Maintenance script to import multiple files into the wiki * (bug 5957) Update for Hebrew language (he) * (bug 5962) Update for Italian language (it) * (bug 5961) Update for Portuguese localisation (pt) * (bug 5849) Remove some hard-coded references to "Wikipedia" in messages * (bug 5967) Improvement to German localisation (de) * (bug 5962) Update for Italian language (it) * Suppress images in galleries which appear on the bad image list (when rendering for a wiki page; galleries in special pages and categories are unaffected) * Maintenance script to remove orphaned revisions from the database * (bug 5991) Update for Russian language (ru) * (bug 6001) PAGENAMEE and FULLPAGENAMEE don't work in FULLURL and LOCALURL magic words * (bug 5958) Switch Uzbek language name to use latin script * (bug 839) Add URLENCODE magic word * (bug 6004) Update for Polish language (pl) * (bug 5971) Improvement to German localisation (de) * (bug 4873) Don't overwrite the subtitle navigation when viewing a redirect page that isn't current * (bug 2203) Namespace updates for Thai * Fix breakage in parser test suite which caused incorrect reporting of the failure of {{NUMBEROFFILES}}. Now initialises the site_stats table with some dumb data. Updated the expected output for {{NUMBEROFARTICLES}} to reflect this. * (bug 6009) Use {{ns:project}} in messages where appropriate * (bug 6012) Update to Indonesian localisation (id) * (bug 6017) Update list of bookstores in German localisation files * (bug 5187) Allow programmatically bypassing username validation, for scripts * (bug 6025) SpecialImport: wrong message when no file selected * (bug 6015) EditPage: add spacing in the boxes "edit is minor" and "watch this" * (bug 6018) Userrights: new message when no user specified ('nouserspecified') * (bug 2015) Add "\sim" to ~ conversion for HTML rendering * (bug 6029) Improvement to German localisation (de) * (bug 5015) Update be: magic words * (bug 3974) Add parameter for site URL to "passwordremindertext" * (bug 6039) Update for Portuguese localisation (pt) * (bug 764) Add CREATE TEMPORARY TABLES to default database permissions * Big update to Swedish localisation (sv) * Use appropriate HTML functions to create the tool links on image pages, so they don't look garbled when tidy isn't on * (bug 5511) Fix URL-encoding of usernames in links on Special:Ipblocklist * (bug 6046) Update to Indonesian localisation (id) #15 * (bug 5523) $wgNoFollowNsExceptions to allow disabling rel="nofollow" in specially-selected namespaces. * (bug 6055) Fix for HTML/JS injection bug in variable handler (found by Nick Jenkins) * Reordered wiki table handling and __TOC__ extraction in the parser to better handle some overlapping tag cases. * Only the first __TOC__ is now turned into a TOC * (bug 4610) Indicate patrolled status on watchlists and allow users to mark changes as patrolled using the diff links there * Add 'DiffViewHeader' hook called before diff page output * (bug 6051) Improvement to German localisation (de) * (bug 6054) Update to Indonesian localisation (id) #16 * Add {{CURRENTTIMESTAMP}} magic word * (bug 6061) Improper escaping in some html forms * (bug 6065) Remove underscore when using NAMESPACE and TALKSPACE magics. * (bug 6074) Correct squid purging of offsite upload URLs * To simplify the lives of extension developers, the logging type arrays can now be appended to directly by an extension setup function. It is no longer necessary to write four separate functions just to add a custom log type. * (bug 6057) Count "licenses" as a message (and show it in Special:Allmessages) * Added $wgGrammarForms global * Fixed hardcoded 'done.' when removing watchlist entries. * (bug 5962) Update for Italian language (it) * (bug 6086) Remove vestigial attempt to call Article::validate() * wfHostname() function for consistent server hostname use in debug messages * Send thumbnailing error messages to 'thumbnail' log group * wfShellexec() now accepts an optional parameter to receive the exit code * Failed, but not zero-length, thumbnail renderings are now removed. Should help clean up when rsvg fails in weird ways. * (bug 6081) Change description for Turkmen language * Increase robustness of parser placeholders; fixes some glitches when adjacent to identifier-ish constructs such as URLs. * Shut up the parser test whining about files in a temp directory. * (bug 6098) Add Aragonese language support (an) * (bug 6101) Update for Russian language (ru) * Add $wgIgnoreImageErrors to suppress error messages for thumbnail rendering problems. If errors are transitory, this should reduce annoying messages making it into cached display. * (bug 6103) Wrap self-links in a CSS class ("selflink") * (bug 6102) For consistency with other markup, normalize all HTML-encoded character entities in URLs, not just ampersands. This allows use of eg = when making URLs for template parameters. * Markup anality: escape </ as <\/ in toolbar javascript for pure correctness under HTML-compatible browsers. * (bug 5077) Added hook 'BeforePageDisplay' to SkinTemplate::outputPage * Replace fatally changed 'uploadnewversion' with 'uploadnewversion-linktext' * (bug 472) Syndication feeds for the last few edits of page history * Format edit comments in Recent Changes feed * Switch incorrectly ordered column headers on Recent Changes feed diffs * (bug 6117) Use message for history feed description, add German localization * (bug 1017) fixed thumbnails of animated gifs. * Add APC as object caching option * Update to Albanian localization (sq) * (bug 6099) Introduce {{DIRECTIONMARK}} magic word (with {{DIRMARK}} as an alias) * Use optimized php5-only microtime() * Add possibility to store local message cache as PHP executable script * Fix profiling table definition * (bug 6040) Run pre-save transform before calculating the diff. when doing a "show changes" operation in the editor * (bug 4033) Respect $wgStyleDirectory when checking available skins * Remove hideous backslashes from MessagesBr.php * Fix APC object cache issues, add functionality to installer * (bug 6133) Update strip state as we work. This mostly fixes extensions used in Cite.php <ref> tags when Tidy is on. * (bug 6139) Workaround for transclusion oddities in Vietnamese upload text * (bug 6136) Update to Catalan language (ca) * Update to Japanese localization (ja) * Add /usr/local/bin to the diff3 search paths in the installer * (bug 6106) Update to Indonesian localisation (id) #17 * (bug 6125) Add links to edit old versions to diff views * (bug 5127) Auto edit summary when creating/editing redirect page * (bug 3926) Introduce {{#language:}} magic word * Fix section links from edit comments for [[:Image:Bla.jpg]] in section titles * (bug 6126) Allow fallback to customized primary language when user language message contains '-'; fixes licenses selector on Commons configuration after recent addition of the message to Messages.php * (bug 5527) Batch up job queue insertions for, hopefully, better survivability of lock contention etc. Duplicates are now removed at pop time instead of at insert time. * When showing the "blah has been undeleted" page, make sure it's a blue link * parserTests.php accepts a --file parameter to run an alternate test sutie * parser tests can now test extensions using !!hooks sections * Fix oddity with open tag parameters getting stuck on </li> * (bug 5384) Fix <!-- comments --> in <ref> extension * Nesting of different tag extensions and comments should now work more consistently and more safely. A cleaner, one-pass tag strip lets the 'outer' tag either take source (<nowiki>-style) or pass it down to further parsing (<ref>-style). There should no longer be surprise expansion of foreign extensions inside HTML output, or differences in behavior based on the order tags are loaded. * (bug 885) Pre-save transform no longer silently appends close tags * Pre-save transform no longer changes the case of close tags * (bug 6164) Fix regression with <gallery> resetting <ref> state * Hackaround for IE 7 wrapping bug in MonoBook footer * New message sp-newimages-showfrom replaces rclistfrom on special:newimages * Improve handling of ;: definition list construct with overlapping or nested HTML tags * (bug 6171) Fix sanitizing of HTML-elements with an optional closing tag. The sanitizer still needs to learn how to make well-formed XML in this case. * Fix fatal error when specifying illegal name for manual thumbnail * (bug 6184) Use shinier Linker::userLink() to make user links in Special:Undelete * (bug 6170) Update for Kashubian translation (csb) * (bug 6191) Update to Indonesian translation (id) #18 * (bug 6114) Update to Walloon localization (wa) * Added $wgNamespaceRobotPolicies to allow customisation of robot policies on a per-namespace basis. * Add <ol> to the list of block elements for doBlockLevels; avoids <p>s being interspersed into your ordered lists. * (bug 5021) Transcluding the same special page twice now works * Add 'SiteNoticeBefore' and 'SiteNoticeAfter' hooks * (bug 6182) Date passed in "sp-newimages-showfrom" not adjusted to user time preferences * (bug 2587) Fix for section editing with comment prefix * (bug 2607) Fix for section editing with mix of wiki and HTML headings * (bug 3342) Fix for section editing with headings wrapped in <noinclude> * (bug 3476) Fix for section editing with faux headings in extensions * (bug 5272) Fix for section editing with HTML-heading subsections * Fix for bogus wiki headings improperly detected with following text * Fix for HTML headings improperly not detected with preceding/following text * Section extraction and replacement functions merged into one implementation on the Parser object, so they can't get out of sync with each other. * Edit security precautions in raw HTML mode, etc * (bug 6197) Update to Indonesian translation (id) #19 * (bug 6175) Improvement to German translation (de) * Redirect Special:Logs to Special:Log * (bug 6206) Linktrail for Swedish localization (se) * (bug 3202) Attributes now allowed on <pre> tags * Sanitizer::validateTagAttributes now available to discard illegal/unsafe attribute values from an array. * (bug 3837) Leave <center> as is instead of doing an unsafe text replacement to <div class="center">. <center> is perfectly valid in the target doctype (XHTML 1.0 Transitional), while the replacement didn't catch all cases and could even result in invalid output from valid input. * (bug 4280) Use 'noindex,nofollow' instead of 'noindex,follow' for default meta robots tag on diff view and special pages. Should reduce impact of robots on scrolling special pages, diffs etc on sites where robots.txt doesn't forbid access. * Regression fix: suppress warning about session failure when clicking to edit with 'preview on first edit' enabled. * (bug 6230) Regression fix: <nowiki> in [URL link text] * Added AutoLoader.php, which loads classes without need of require_once() * (bug 5981) Add plural function Slovenian (sl) * (bug 5945) Introduce {{CONTENTLANGUAGE}} magic word * {{PLURAL}} can now take up to five forms * (bug 6243) Fix email for usernames containing dots when using PEAR::Mail * Remove a number of needless {{ns:project}}-type transforms from messages files. These usages already have separate label text. Such transforms are wasteful on each page view. * Update to Yiddish localization (yi) * (bug 6254) Update to Indonesian translation (id) #20 * (bug 6255) Fix transclusions starting with "#" or "*" in HTML attributes * Whitespace now normalized more or less properly in HTML attributes * Fix regression(?) in behavior of initial-whitespace-pre in <center> * (bug 6260) Update to Interlingua localization (ia) * Update to Vlax Romany localization (rmy) * Update to Latin translation (la) * Update to Dutch translation (nl) * Avoid some notices in page history with bad input * Use double quoted consistently on attributes in linker output; preparing for new normalization code when tidy not in use * Replace "nogomatch" with "noexactmatch" and place the magic colon in the messages themselves. Some minor tweaks to the actual message content. * Introduce $wgContentNamespaces which allows for articles to exist in namespaces other than the main namespace, and still be counted as valid content in the site statistics. * (bug 5932) Introduce {{PAGESINNAMESPACE}} magic word * Disable $wgAllowExternalImages by default. * (bug 2700) Nice things like link completion and signatures now work in <gallery> tags. * Cancel output buffering in StreamFile; when used inside gzip buffering this could cause funny timeout behavior as the Content-Length was wrong. * Return correct content-type header with 304 responses for StreamFile; it confuses Safari if you let it return "text/html". * (bug 6280) Correct GRAMMAR for Slovenian localisation (sl) * (bug 6162) Change date format for Dutch Low Saxon (nds-nl) * (bug 6296) Update to Indonesian localisation (id) #21 * Introduce EditFormPreloadText hook, see docs/hooks.txt for more information * (bug 4054) Add "boteditletter" to recent changes flags * Update to Catalan localization (ca) * (bug 2099) Deleted image files can now be archived and undeleted. Set $wgSaveDeletedFiles on and an appropriate directory path in $wgFileStore['deleted']['directory'] * (bug 6324) Fix regression in enhanced RC alignment * Introduce {{NUMBEROFADMINS}} magic word * Update to Slovak translation (sk) * Update to Alemannic localization (gsw) * (bug 6300) Bug fixes for sr: variants * namespaceDupes.php can now accept an arbitrary prefix, for checking rogue interwikis and such. Not yet fully automated. * (bug 6344) Add Special:Uncategorizedimages page * (bug 6357) Update to Russian translation (ru) * Workaround possible bug in Firefox nightlies by properly removing the Content-Encoding header instead of sending explicit 'identity' value in StreamFile * (bug 6304) Show timestamp for current revision in diff pages * Vertically align current version with old version header in diff display * (bug 6174) Remove redundant "emailforlost" message * (bug 6189) Show an error to an unprivilleged user trying to create account * (bug 6365) Show user information in the "old revision" navigation links * Introduce 'FetchChangesList' hook; see docs/hooks.txt for more information * (bug 6345) Update to Indonesian localisation (id) #22 * (bug 6279) Add genitive month names to Slovenian localisation * (bug 6351) Update to German translation (de) * Respect language directionality when displaying arrow in Special:Brokenredirects * Remove unused "validation" table definitions from the schema files * (bug 6398) Work around apparent PCRE bug breaking section editing when massively-indented preformatted text immediately followed a header * (bug 6392) Fix misbehaving <br /> in preferences form * Add translated magic words to Hebrew localization * (bug 6396) Change name for Chuvash language * Introduce optional (off by default) language selector bar for user login and registration. Customisable via the "loginlanguagelinks" message, the links will preserve "returnto" values. If the user creates an account while using such a link, then the language in use will be saved as their language preference. * Make sure '~~~' '~~~~' '~~~~~' are removed in Nickname preference. * Rename "ipusuccess" to "unblocked", change the format (now wiki text) * (bug 2316) Add "caption" attribute to <gallery> tag * Allow setting the skin object that ImageGallery will use; needed during parse operations (the skin must come from the ParserOptions, not $wgUser) * Fix notice in MacBinary detection debug data for files of certain lengths * (bug 6131) Add type detection for DjVu files, allowing them to be uploaded with validity checking and size detection. No inline thumbnailing yet, but could be added in the future. * (bug 6423) Don't update newtalk flag if page content didn't change (null edits were causing the newtalk flag to trigger inappropriately) * Parser functions are now set using magic words. * (bug 6428) Incorrect form action URL on Special:Newimages with hidebots = 0 set * (bug 4990) Show page source to blocked users on edits, or their modified version if blocked during an edit * (bug 5903) When requesting the raw source of a non-existent message page, return blank content (as opposed to the message key) * Improve default blank content of MediaWiki:Common.css and MediaWiki:Monobook.css * (bug 6434) Allow customisation of submit button text on Special:Export * (bug 6314) Add user tool links on page histories * Fix display of file-type icons in galleries when $wgIgnoreImageErrors is off * (bug 6438) Update to Indonesian translation (id) #23 * Adding the language code parameter to the hook "LanguageGetMagic", to allow localizble extensions magic words. * Update to Romanian translation (ro) * Update to Esperanto translation (eo) * Check for preg_match() existence when installing and die out whining about PCRE if it's not there, instead of throwing a fatal error * (bug 672) Add MathAfterTexvc hook * Update to Piedmontese localization (pms) * dumpBackup can optionally compress via dbzip2 * (bug 2483) Run link updates on change via XML import * (bug 2481) List imported pages during Special:Import * (bug 2482) Log and RC entries for Special:Import events +* Allow fetching all revisions from transwiki Special:Import +* Allow fetching all revisions from Special:Export GET request +* Disable output buffering on Special:Export; should help with streaming + large numbers of history items. +* Allow setting a maximum number of revisions for history Special:Export; + pages with more than $wgExportMaxHistory revisions are excluded from + export when history is requested. +* Fix transwiki import of pages with space in name == Compatibility == MediaWiki 1.7 requires PHP 5 (5.1 recommended). PHP 4 is no longer supported. MySQL 3.23.x is no longer supported; some older hosts may need to upgrade. At this time we still recommend 4.0, but 4.1/5.0 will work fine in most cases. == Upgrading == Several changes to the database have been made from 1.6: * A new "langlinks" table tracks interlanguage links * A new "filearchive" table stores information on deleted files * A new "querycache_info" table stores information on query page updates To ensure that these tables are filled with data, run refreshLinks.php after the upgrade. If you are upgrading from MediaWiki 1.4.x or earlier, some major database changes are made, and there is a slightly higher chance that things could break. Don't forget to always back up your database before upgrading! See the file UPGRADE for more detailed upgrade instructions. === Caveats === Some output, particularly involving user-supplied inline HTML, may not produce 100% valid or well-formed XHTML output. Testers are welcome to set $wgMimeType = "application/xhtml+xml"; to test for remaining problem cases, but this is not recommended on live sites. (This must be set for MathML to display properly in Mozilla.) For notes on 1.5.x and older releases, see HISTORY. === Online documentation === Documentation for both end-users and site administrators is currently being built up on Meta-Wikipedia, and is covered under the GNU Free Documentation License: http://www.mediawiki.org/wiki/Documentation === Mailing list === A MediaWiki-l mailing list has been set up distinct from the Wikipedia wikitech-l list: http://mail.wikimedia.org/mailman/listinfo/mediawiki-l A low-traffic announcements-only list is also available: http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce It's highly recommended that you sign up for one of these lists if you're going to run a public MediaWiki, so you can be notified of security fixes. === IRC help === There's usually someone online in #mediawiki on irc.freenode.net Index: trunk/phase3/includes/DefaultSettings.php =================================================================== --- trunk/phase3/includes/DefaultSettings.php (revision 15100) +++ trunk/phase3/includes/DefaultSettings.php (revision 15101) @@ -1,2156 +1,2164 @@ <?php /** * * NEVER EDIT THIS FILE * * * To customize your installation, edit "LocalSettings.php". If you make * changes here, they will be lost on next upgrade of MediaWiki! * * Note that since all these string interpolations are expanded * before LocalSettings is included, if you localize something * like $wgScriptPath, you must also localize everything that * depends on it. * * Documentation is in the source and on: * http://www.mediawiki.org/wiki/Help:Configuration_settings * * @package MediaWiki */ # This is not a valid entry point, perform no further processing unless MEDIAWIKI is defined if( !defined( 'MEDIAWIKI' ) ) { echo "This file is part of MediaWiki and is not a valid entry point\n"; die( 1 ); } /** * Create a site configuration object * Not used for much in a default install */ require_once( 'includes/SiteConfiguration.php' ); $wgConf = new SiteConfiguration; /** MediaWiki version number */ $wgVersion = '1.7alpha'; /** Name of the site. It must be changed in LocalSettings.php */ $wgSitename = 'MediaWiki'; /** Will be same as you set @see $wgSitename */ $wgMetaNamespace = FALSE; /** URL of the server. It will be automatically built including https mode */ $wgServer = ''; if( isset( $_SERVER['SERVER_NAME'] ) ) { $wgServerName = $_SERVER['SERVER_NAME']; } elseif( isset( $_SERVER['HOSTNAME'] ) ) { $wgServerName = $_SERVER['HOSTNAME']; } elseif( isset( $_SERVER['HTTP_HOST'] ) ) { $wgServerName = $_SERVER['HTTP_HOST']; } elseif( isset( $_SERVER['SERVER_ADDR'] ) ) { $wgServerName = $_SERVER['SERVER_ADDR']; } else { $wgServerName = 'localhost'; } # check if server use https: $wgProto = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; $wgServer = $wgProto.'://' . $wgServerName; # If the port is a non-standard one, add it to the URL if( isset( $_SERVER['SERVER_PORT'] ) && !strpos( $wgServerName, ':' ) && ( ( $wgProto == 'http' && $_SERVER['SERVER_PORT'] != 80 ) || ( $wgProto == 'https' && $_SERVER['SERVER_PORT'] != 443 ) ) ) { $wgServer .= ":" . $_SERVER['SERVER_PORT']; } /** * The path we should point to. * It might be a virtual path in case with use apache mod_rewrite for example */ $wgScriptPath = '/wiki'; /** * Whether to support URLs like index.php/Page_title * @global bool $wgUsePathInfo */ $wgUsePathInfo = ( strpos( php_sapi_name(), 'cgi' ) === false ); /**#@+ * Script users will request to get articles * ATTN: Old installations used wiki.phtml and redirect.phtml - * make sure that LocalSettings.php is correctly set! * @deprecated */ /** * @global string $wgScript */ $wgScript = "{$wgScriptPath}/index.php"; /** * @global string $wgRedirectScript */ $wgRedirectScript = "{$wgScriptPath}/redirect.php"; /**#@-*/ /**#@+ * @global string */ /** * style path as seen by users * @global string $wgStylePath */ $wgStylePath = "{$wgScriptPath}/skins"; /** * filesystem stylesheets directory * @global string $wgStyleDirectory */ $wgStyleDirectory = "{$IP}/skins"; $wgStyleSheetPath = &$wgStylePath; $wgArticlePath = "{$wgScript}?title=$1"; $wgUploadPath = "{$wgScriptPath}/upload"; $wgUploadDirectory = "{$IP}/upload"; $wgHashedUploadDirectory = true; $wgLogo = "{$wgUploadPath}/wiki.png"; $wgFavicon = '/favicon.ico'; $wgMathPath = "{$wgUploadPath}/math"; $wgMathDirectory = "{$wgUploadDirectory}/math"; $wgTmpDirectory = "{$wgUploadDirectory}/tmp"; $wgUploadBaseUrl = ""; /**#@-*/ /** * By default deleted files are simply discarded; to save them and * make it possible to undelete images, create a directory which * is writable to the web server but is not exposed to the internet. * * Set $wgSaveDeletedFiles to true and set up the save path in * $wgFileStore['deleted']['directory']. */ $wgSaveDeletedFiles = false; /** * New file storage paths; currently used only for deleted files. * Set it like this: * * $wgFileStore['deleted']['directory'] = '/var/wiki/private/deleted'; * */ $wgFileStore = array(); $wgFileStore['deleted']['directory'] = null; // Don't forget to set this. $wgFileStore['deleted']['url'] = null; // Private $wgFileStore['deleted']['hash'] = 3; // 3-level subdirectory split /** * Allowed title characters -- regex character class * Don't change this unless you know what you're doing * * Problematic punctuation: * []{}|# Are needed for link syntax, never enable these * % Enabled by default, minor problems with path to query rewrite rules, see below * + Doesn't work with path to query rewrite rules, corrupted by apache * ? Enabled by default, but doesn't work with path to PATH_INFO rewrites * * All three of these punctuation problems can be avoided by using an alias, instead of a * rewrite rule of either variety. * * The problem with % is that when using a path to query rewrite rule, URLs are * double-unescaped: once by Apache's path conversion code, and again by PHP. So * %253F, for example, becomes "?". Our code does not double-escape to compensate * for this, indeed double escaping would break if the double-escaped title was * passed in the query string rather than the path. This is a minor security issue * because articles can be created such that they are hard to view or edit. * * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but * this breaks interlanguage links */ $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF"; /** * The external URL protocols */ $wgUrlProtocols = array( 'http://', 'https://', 'ftp://', 'irc://', 'gopher://', 'telnet://', // Well if we're going to support the above.. -ævar 'nntp://', // @bug 3808 RFC 1738 'worldwind://', 'mailto:', 'news:' ); /** internal name of virus scanner. This servers as a key to the $wgAntivirusSetup array. * Set this to NULL to disable virus scanning. If not null, every file uploaded will be scanned for viruses. * @global string $wgAntivirus */ $wgAntivirus= NULL; /** Configuration for different virus scanners. This an associative array of associative arrays: * it contains on setup array per known scanner type. The entry is selected by $wgAntivirus, i.e. * valid values for $wgAntivirus are the keys defined in this array. * * The configuration array for each scanner contains the following keys: "command", "codemap", "messagepattern"; * * "command" is the full command to call the virus scanner - %f will be replaced with the name of the * file to scan. If not present, the filename will be appended to the command. Note that this must be * overwritten if the scanner is not in the system path; in that case, plase set * $wgAntivirusSetup[$wgAntivirus]['command'] to the desired command with full path. * * "codemap" is a mapping of exit code to return codes of the detectVirus function in SpecialUpload. * An exit code mapped to AV_SCAN_FAILED causes the function to consider the scan to be failed. This will pass * the file if $wgAntivirusRequired is not set. * An exit code mapped to AV_SCAN_ABORTED causes the function to consider the file to have an usupported format, * which is probably imune to virusses. This causes the file to pass. * An exit code mapped to AV_NO_VIRUS will cause the file to pass, meaning no virus was found. * All other codes (like AV_VIRUS_FOUND) will cause the function to report a virus. * You may use "*" as a key in the array to catch all exit codes not mapped otherwise. * * "messagepattern" is a perl regular expression to extract the meaningful part of the scanners * output. The relevant part should be matched as group one (\1). * If not defined or the pattern does not match, the full message is shown to the user. * * @global array $wgAntivirusSetup */ $wgAntivirusSetup= array( #setup for clamav 'clamav' => array ( 'command' => "clamscan --no-summary ", 'codemap'=> array ( "0"=> AV_NO_VIRUS, #no virus "1"=> AV_VIRUS_FOUND, #virus found "52"=> AV_SCAN_ABORTED, #unsupported file format (probably imune) "*"=> AV_SCAN_FAILED, #else scan failed ), 'messagepattern'=> '/.*?:(.*)/sim', ), #setup for f-prot 'f-prot' => array ( 'command' => "f-prot ", 'codemap'=> array ( "0"=> AV_NO_VIRUS, #no virus "3"=> AV_VIRUS_FOUND, #virus found "6"=> AV_VIRUS_FOUND, #virus found "*"=> AV_SCAN_FAILED, #else scan failed ), 'messagepattern'=> '/.*?Infection:(.*)$/m', ), ); /** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. * @global boolean $wgAntivirusRequired */ $wgAntivirusRequired= true; /** Determines if the mime type of uploaded files should be checked * @global boolean $wgVerifyMimeType */ $wgVerifyMimeType= true; /** Sets the mime type definition file to use by MimeMagic.php. * @global string $wgMimeTypeFile */ #$wgMimeTypeFile= "/etc/mime.types"; $wgMimeTypeFile= "includes/mime.types"; #$wgMimeTypeFile= NULL; #use built-in defaults only. /** Sets the mime type info file to use by MimeMagic.php. * @global string $wgMimeInfoFile */ $wgMimeInfoFile= "includes/mime.info"; #$wgMimeInfoFile= NULL; #use built-in defaults only. /** Switch for loading the FileInfo extension by PECL at runtime. * This should be used only if fileinfo is installed as a shared object / dynamic libary * @global string $wgLoadFileinfoExtension */ $wgLoadFileinfoExtension= false; /** Sets an external mime detector program. The command must print only the mime type to standard output. * the name of the file to process will be appended to the command given here. * If not set or NULL, mime_content_type will be used if available. */ $wgMimeDetectorCommand= NULL; # use internal mime_content_type function, available since php 4.3.0 #$wgMimeDetectorCommand= "file -bi"; #use external mime detector (Linux) /** Switch for trivial mime detection. Used by thumb.php to disable all fance things, * because only a few types of images are needed and file extensions can be trusted. */ $wgTrivialMimeDetection= false; /** * To set 'pretty' URL paths for actions other than * plain page views, add to this array. For instance: * 'edit' => "$wgScriptPath/edit/$1" * * There must be an appropriate script or rewrite rule * in place to handle these URLs. */ $wgActionPaths = array(); /** * If you operate multiple wikis, you can define a shared upload path here. * Uploads to this wiki will NOT be put there - they will be put into * $wgUploadDirectory. * If $wgUseSharedUploads is set, the wiki will look in the shared repository if * no file of the given name is found in the local repository (for [[Image:..]], * [[Media:..]] links). Thumbnails will also be looked for and generated in this * directory. */ $wgUseSharedUploads = false; /** Full path on the web server where shared uploads can be found */ $wgSharedUploadPath = "http://commons.wikimedia.org/shared/images"; /** Fetch commons image description pages and display them on the local wiki? */ $wgFetchCommonsDescriptions = false; /** Path on the file system where shared uploads can be found. */ $wgSharedUploadDirectory = "/var/www/wiki3/images"; /** DB name with metadata about shared directory. Set this to false if the uploads do not come from a wiki. */ $wgSharedUploadDBname = false; /** Optional table prefix used in database. */ $wgSharedUploadDBprefix = ''; /** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */ $wgCacheSharedUploads = true; /** * Point the upload navigation link to an external URL * Useful if you want to use a shared repository by default * without disabling local uploads (use $wgEnableUploads = false for that) * e.g. $wgUploadNavigationUrl = 'http://commons.wikimedia.org/wiki/Special:Upload'; */ $wgUploadNavigationUrl = false; /** * Give a path here to use thumb.php for thumbnail generation on client request, instead of * generating them on render and outputting a static URL. This is necessary if some of your * apache servers don't have read/write access to the thumbnail path. * * Example: * $wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php"; */ $wgThumbnailScriptPath = false; $wgSharedThumbnailScriptPath = false; /** * Set the following to false especially if you have a set of files that need to * be accessible by all wikis, and you do not want to use the hash (path/a/aa/) * directory layout. */ $wgHashedSharedUploadDirectory = true; /** * Base URL for a repository wiki. Leave this blank if uploads are just stored * in a shared directory and not meant to be accessible through a separate wiki. * Otherwise the image description pages on the local wiki will link to the * image description page on this wiki. * * Please specify the namespace, as in the example below. */ $wgRepositoryBaseUrl="http://commons.wikimedia.org/wiki/Image:"; # # Email settings # /** * Site admin email address * Default to wikiadmin@SERVER_NAME * @global string $wgEmergencyContact */ $wgEmergencyContact = 'wikiadmin@' . $wgServerName; /** * Password reminder email address * The address we should use as sender when a user is requesting his password * Default to apache@SERVER_NAME * @global string $wgPasswordSender */ $wgPasswordSender = 'MediaWiki Mail <apache@' . $wgServerName . '>'; /** * dummy address which should be accepted during mail send action * It might be necessay to adapt the address or to set it equal * to the $wgEmergencyContact address */ #$wgNoReplyAddress = $wgEmergencyContact; $wgNoReplyAddress = 'reply@not.possible'; /** * Set to true to enable the e-mail basic features: * Password reminders, etc. If sending e-mail on your * server doesn't work, you might want to disable this. * @global bool $wgEnableEmail */ $wgEnableEmail = true; /** * Set to true to enable user-to-user e-mail. * This can potentially be abused, as it's hard to track. * @global bool $wgEnableUserEmail */ $wgEnableUserEmail = true; /** * SMTP Mode * For using a direct (authenticated) SMTP server connection. * Default to false or fill an array : * <code> * "host" => 'SMTP domain', * "IDHost" => 'domain for MessageID', * "port" => "25", * "auth" => true/false, * "username" => user, * "password" => password * </code> * * @global mixed $wgSMTP */ $wgSMTP = false; /**#@+ * Database settings */ /** database host name or ip address */ $wgDBserver = 'localhost'; /** name of the database */ $wgDBname = 'wikidb'; /** */ $wgDBconnection = ''; /** Database username */ $wgDBuser = 'wikiuser'; /** Database type * "mysql" for working code and "PostgreSQL" for development/broken code */ $wgDBtype = "mysql"; /** Search type * Leave as null to select the default search engine for the * selected database type (eg SearchMySQL4), or set to a class * name to override to a custom search engine. */ $wgSearchType = null; /** Table name prefix */ $wgDBprefix = ''; /** Database schema * on some databases this allows separate * logical namespace for application data */ $wgDBschema = 'mediawiki'; /**#@-*/ /** Live high performance sites should disable this - some checks acquire giant mysql locks */ $wgCheckDBSchema = true; /** * Shared database for multiple wikis. Presently used for storing a user table * for single sign-on. The server for this database must be the same as for the * main database. * EXPERIMENTAL */ $wgSharedDB = null; # Database load balancer # This is a two-dimensional array, an array of server info structures # Fields are: # host: Host name # dbname: Default database name # user: DB user # password: DB password # type: "mysql" or "pgsql" # load: ratio of DB_SLAVE load, must be >=0, the sum of all loads must be >0 # groupLoads: array of load ratios, the key is the query group name. A query may belong # to several groups, the most specific group defined here is used. # # flags: bit field # DBO_DEFAULT -- turns on DBO_TRX only if !$wgCommandLineMode (recommended) # DBO_DEBUG -- equivalent of $wgDebugDumpSql # DBO_TRX -- wrap entire request in a transaction # DBO_IGNORE -- ignore errors (not useful in LocalSettings.php) # DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php) # # max lag: (optional) Maximum replication lag before a slave will taken out of rotation # max threads: (optional) Maximum number of running threads # # These and any other user-defined properties will be assigned to the mLBInfo member # variable of the Database object. # # Leave at false to use the single-server variables above $wgDBservers = false; /** How long to wait for a slave to catch up to the master */ $wgMasterWaitTimeout = 10; /** File to log MySQL errors to */ $wgDBerrorLog = false; /** When to give an error message */ $wgDBClusterTimeout = 10; /** * wgDBminWordLen : * MySQL 3.x : used to discard words that MySQL will not return any results for * shorter values configure mysql directly. * MySQL 4.x : ignore it and configure mySQL * See: http://dev.mysql.com/doc/mysql/en/Fulltext_Fine-tuning.html */ $wgDBminWordLen = 4; /** Set to true if using InnoDB tables */ $wgDBtransactions = false; /** Set to true for compatibility with extensions that might be checking. * MySQL 3.23.x is no longer supported. */ $wgDBmysql4 = true; /** * Set to true to engage MySQL 4.1/5.0 charset-related features; * for now will just cause sending of 'SET NAMES=utf8' on connect. * * WARNING: THIS IS EXPERIMENTAL! * * May break if you're not using the table defs from mysql5/tables.sql. * May break if you're upgrading an existing wiki if set differently. * Broken symptoms likely to include incorrect behavior with page titles, * usernames, comments etc containing non-ASCII characters. * Might also cause failures on the object cache and other things. * * Even correct usage may cause failures with Unicode supplementary * characters (those not in the Basic Multilingual Plane) unless MySQL * has enhanced their Unicode support. */ $wgDBmysql5 = false; /** * Other wikis on this site, can be administered from a single developer * account. * Array numeric key => database name */ $wgLocalDatabases = array(); /** * Object cache settings * See Defines.php for types */ $wgMainCacheType = CACHE_NONE; $wgMessageCacheType = CACHE_ANYTHING; $wgParserCacheType = CACHE_ANYTHING; $wgParserCacheExpireTime = 86400; $wgSessionsInMemcached = false; $wgLinkCacheMemcached = false; # Not fully tested /** * Memcached-specific settings * See docs/memcached.txt */ $wgUseMemCached = false; $wgMemCachedDebug = false; # Will be set to false in Setup.php, if the server isn't working $wgMemCachedServers = array( '127.0.0.1:11000' ); $wgMemCachedDebug = false; $wgMemCachedPersistent = false; /** * Directory for local copy of message cache, for use in addition to memcached */ $wgLocalMessageCache = false; /** * Defines format of local cache * true - Serialized object * false - PHP source file (Warning - security risk) */ $wgLocalMessageCacheSerialized = true; /** * Directory for compiled constant message array databases * WARNING: turning anything on will just break things, aaaaaah!!!! */ $wgCachedMessageArrays = false; # Language settings # /** Site language code, should be one of ./languages/Language(.*).php */ $wgLanguageCode = 'en'; /** * Some languages need different word forms, usually for different cases. * Used in Language::convertGrammar(). */ $wgGrammarForms = array(); #$wgGrammarForms['en']['genitive']['car'] = 'car\'s'; /** Treat language links as magic connectors, not inline links */ $wgInterwikiMagic = true; /** Hide interlanguage links from the sidebar */ $wgHideInterlanguageLinks = false; /** We speak UTF-8 all the time now, unless some oddities happen */ $wgInputEncoding = 'UTF-8'; $wgOutputEncoding = 'UTF-8'; $wgEditEncoding = ''; # Set this to eg 'ISO-8859-1' to perform character set # conversion when loading old revisions not marked with # "utf-8" flag. Use this when converting wiki to UTF-8 # without the burdensome mass conversion of old text data. # # NOTE! This DOES NOT touch any fields other than old_text. # Titles, comments, user names, etc still must be converted # en masse in the database before continuing as a UTF-8 wiki. $wgLegacyEncoding = false; /** * If set to true, the MediaWiki 1.4 to 1.5 schema conversion will * create stub reference rows in the text table instead of copying * the full text of all current entries from 'cur' to 'text'. * * This will speed up the conversion step for large sites, but * requires that the cur table be kept around for those revisions * to remain viewable. * * maintenance/migrateCurStubs.php can be used to complete the * migration in the background once the wiki is back online. * * This option affects the updaters *only*. Any present cur stub * revisions will be readable at runtime regardless of this setting. */ $wgLegacySchemaConversion = false; $wgMimeType = 'text/html'; $wgJsMimeType = 'text/javascript'; $wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN'; $wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'; /** Enable to allow rewriting dates in page text. * DOES NOT FORMAT CORRECTLY FOR MOST LANGUAGES */ $wgUseDynamicDates = false; /** Enable dates like 'May 12' instead of '12 May', this only takes effect if * the interface is set to English */ $wgAmericanDates = false; /** * For Hindi and Arabic use local numerals instead of Western style (0-9) * numerals in interface. */ $wgTranslateNumerals = true; # Translation using MediaWiki: namespace # This will increase load times by 25-60% unless memcached is installed # Interface messages will be loaded from the database. $wgUseDatabaseMessages = true; $wgMsgCacheExpiry = 86400; # Whether to enable language variant conversion. $wgDisableLangConversion = false; /** * Show a bar of language selection links in the user login and user * registration forms; edit the "loginlanguagelinks" message to * customise these */ $wgLoginLanguageSelector = false; # Whether to use zhdaemon to perform Chinese text processing # zhdaemon is under developement, so normally you don't want to # use it unless for testing $wgUseZhdaemon = false; $wgZhdaemonHost="localhost"; $wgZhdaemonPort=2004; /** Normally you can ignore this and it will be something like $wgMetaNamespace . "_talk". In some languages, you may want to set this manually for grammatical reasons. It is currently only respected by those languages where it might be relevant and where no automatic grammar converter exists. */ $wgMetaNamespaceTalk = false; # Miscellaneous configuration settings # $wgLocalInterwiki = 'w'; $wgInterwikiExpiry = 10800; # Expiry time for cache of interwiki table /** Interwiki caching settings. $wgInterwikiCache specifies path to constant database file This cdb database is generated by dumpInterwiki from maintenance and has such key formats: dbname:key - a simple key (e.g. enwiki:meta) _sitename:key - site-scope key (e.g. wiktionary:meta) __global:key - global-scope key (e.g. __global:meta) __sites:dbname - site mapping (e.g. __sites:enwiki) Sites mapping just specifies site name, other keys provide "local url" data layout. $wgInterwikiScopes specify number of domains to check for messages: 1 - Just wiki(db)-level 2 - wiki and global levels 3 - site levels $wgInterwikiFallbackSite - if unable to resolve from cache */ $wgInterwikiCache = false; $wgInterwikiScopes = 3; $wgInterwikiFallbackSite = 'wiki'; /** * If local interwikis are set up which allow redirects, * set this regexp to restrict URLs which will be displayed * as 'redirected from' links. * * It might look something like this: * $wgRedirectSources = '!^https?://[a-z-]+\.wikipedia\.org/!'; * * Leave at false to avoid displaying any incoming redirect markers. * This does not affect intra-wiki redirects, which don't change * the URL. */ $wgRedirectSources = false; $wgShowIPinHeader = true; # For non-logged in users $wgMaxNameChars = 255; # Maximum number of bytes in username $wgMaxArticleSize = 2048; # Maximum article size in kilobytes $wgExtraSubtitle = ''; $wgSiteSupportPage = ''; # A page where you users can receive donations $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR"; /** * The debug log file should be not be publicly accessible if it is used, as it * may contain private data. */ $wgDebugLogFile = ''; /**#@+ * @global bool */ $wgDebugRedirects = false; $wgDebugRawPage = false; # Avoid overlapping debug entries by leaving out CSS $wgDebugComments = false; $wgReadOnly = null; $wgLogQueries = false; /** * Write SQL queries to the debug log */ $wgDebugDumpSql = false; /** * Set to an array of log group keys to filenames. * If set, wfDebugLog() output for that group will go to that file instead * of the regular $wgDebugLogFile. Useful for enabling selective logging * in production. */ $wgDebugLogGroups = array(); /** * Whether to show "we're sorry, but there has been a database error" pages. * Displaying errors aids in debugging, but may display information useful * to an attacker. */ $wgShowSQLErrors = false; /** * If true, some error messages will be colorized when running scripts on the * command line; this can aid picking important things out when debugging. * Ignored when running on Windows or when output is redirected to a file. */ $wgColorErrors = true; /** * disable experimental dmoz-like category browsing. Output things like: * Encyclopedia > Music > Style of Music > Jazz */ $wgUseCategoryBrowser = false; /** * Keep parsed pages in a cache (objectcache table, turck, or memcached) * to speed up output of the same page viewed by another user with the * same options. * * This can provide a significant speedup for medium to large pages, * so you probably want to keep it on. */ $wgEnableParserCache = true; /** * If on, the sidebar navigation links are cached for users with the * current language set. This can save a touch of load on a busy site * by shaving off extra message lookups. * * However it is also fragile: changing the site configuration, or * having a variable $wgArticlePath, can produce broken links that * don't update as expected. */ $wgEnableSidebarCache = false; /** * Under which condition should a page in the main namespace be counted * as a valid article? If $wgUseCommaCount is set to true, it will be * counted if it contains at least one comma. If it is set to false * (default), it will only be counted if it contains at least one [[wiki * link]]. See http://meta.wikimedia.org/wiki/Help:Article_count * * Retroactively changing this variable will not affect * the existing count (cf. maintenance/recount.sql). */ $wgUseCommaCount = false; /**#@-*/ /** * wgHitcounterUpdateFreq sets how often page counters should be updated, higher * values are easier on the database. A value of 1 causes the counters to be * updated on every hit, any higher value n cause them to update *on average* * every n hits. Should be set to either 1 or something largish, eg 1000, for * maximum efficiency. */ $wgHitcounterUpdateFreq = 1; # Basic user rights and block settings $wgSysopUserBans = true; # Allow sysops to ban logged-in users $wgSysopRangeBans = true; # Allow sysops to ban IP ranges $wgAutoblockExpiry = 86400; # Number of seconds before autoblock entries expire $wgBlockAllowsUTEdit = false; # Blocks allow users to edit their own user talk page # Pages anonymous user may see as an array, e.g.: # array ( "Main Page", "Special:Userlogin", "Wikipedia:Help"); # NOTE: This will only work if $wgGroupPermissions['*']['read'] # is false -- see below. Otherwise, ALL pages are accessible, # regardless of this setting. # Also note that this will only protect _pages in the wiki_. # Uploaded files will remain readable. Make your upload # directory name unguessable, or use .htaccess to protect it. $wgWhitelistRead = false; /** * Should editors be required to have a validated e-mail * address before being allowed to edit? */ $wgEmailConfirmToEdit=false; /** * Permission keys given to users in each group. * All users are implicitly in the '*' group including anonymous visitors; * logged-in users are all implicitly in the 'user' group. These will be * combined with the permissions of all groups that a given user is listed * in in the user_groups table. * * Functionality to make pages inaccessible has not been extensively tested * for security. Use at your own risk! * * This replaces wgWhitelistAccount and wgWhitelistEdit */ $wgGroupPermissions = array(); // Implicit group for all visitors $wgGroupPermissions['*' ]['createaccount'] = true; $wgGroupPermissions['*' ]['read'] = true; $wgGroupPermissions['*' ]['edit'] = true; $wgGroupPermissions['*' ]['createpage'] = true; $wgGroupPermissions['*' ]['createtalk'] = true; // Implicit group for all logged-in accounts $wgGroupPermissions['user' ]['move'] = true; $wgGroupPermissions['user' ]['read'] = true; $wgGroupPermissions['user' ]['edit'] = true; $wgGroupPermissions['user' ]['createpage'] = true; $wgGroupPermissions['user' ]['createtalk'] = true; $wgGroupPermissions['user' ]['upload'] = true; $wgGroupPermissions['user' ]['reupload'] = true; $wgGroupPermissions['user' ]['reupload-shared'] = true; $wgGroupPermissions['user' ]['minoredit'] = true; // Implicit group for accounts that pass $wgAutoConfirmAge $wgGroupPermissions['autoconfirmed']['autoconfirmed'] = true; // Users with bot privilege can have their edits hidden // from various log pages by default $wgGroupPermissions['bot' ]['bot'] = true; $wgGroupPermissions['bot' ]['autoconfirmed'] = true; // Most extra permission abilities go to this group $wgGroupPermissions['sysop']['block'] = true; $wgGroupPermissions['sysop']['createaccount'] = true; $wgGroupPermissions['sysop']['delete'] = true; $wgGroupPermissions['sysop']['deletedhistory'] = true; // can view deleted history entries, but not see or restore the text $wgGroupPermissions['sysop']['editinterface'] = true; $wgGroupPermissions['sysop']['import'] = true; $wgGroupPermissions['sysop']['importupload'] = true; $wgGroupPermissions['sysop']['move'] = true; $wgGroupPermissions['sysop']['patrol'] = true; $wgGroupPermissions['sysop']['protect'] = true; $wgGroupPermissions['sysop']['proxyunbannable'] = true; $wgGroupPermissions['sysop']['rollback'] = true; $wgGroupPermissions['sysop']['trackback'] = true; $wgGroupPermissions['sysop']['upload'] = true; $wgGroupPermissions['sysop']['reupload'] = true; $wgGroupPermissions['sysop']['reupload-shared'] = true; $wgGroupPermissions['sysop']['unwatchedpages'] = true; $wgGroupPermissions['sysop']['autoconfirmed'] = true; // Permission to change users' group assignments $wgGroupPermissions['bureaucrat']['userrights'] = true; // Experimental permissions, not ready for production use //$wgGroupPermissions['sysop']['deleterevision'] = true; //$wgGroupPermissions['bureaucrat']['hiderevision'] = true; /** * The developer group is deprecated, but can be activated if need be * to use the 'lockdb' and 'unlockdb' special pages. Those require * that a lock file be defined and creatable/removable by the web * server. */ # $wgGroupPermissions['developer']['siteadmin'] = true; /** * Set of available actions that can be restricted via Special:Protect * You probably shouldn't change this. * Translated trough restriction-* messages. */ $wgRestrictionTypes = array( 'edit', 'move' ); /** * Set of permission keys that can be selected via Special:Protect. * 'autoconfirm' allows all registerd users if $wgAutoConfirmAge is 0. */ $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ); /** * Number of seconds an account is required to age before * it's given the implicit 'autoconfirm' group membership. * This can be used to limit privileges of new accounts. * * Accounts created by earlier versions of the software * may not have a recorded creation date, and will always * be considered to pass the age test. * * When left at 0, all registered accounts will pass. */ $wgAutoConfirmAge = 0; //$wgAutoConfirmAge = 600; // ten minutes //$wgAutoConfirmAge = 3600*24; // one day # Proxy scanner settings # /** * If you enable this, every editor's IP address will be scanned for open HTTP * proxies. * * Don't enable this. Many sysops will report "hostile TCP port scans" to your * ISP and ask for your server to be shut down. * * You have been warned. */ $wgBlockOpenProxies = false; /** Port we want to scan for a proxy */ $wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 ); /** Script used to scan */ $wgProxyScriptPath = "$IP/proxy_check.php"; /** */ $wgProxyMemcExpiry = 86400; /** This should always be customised in LocalSettings.php */ $wgSecretKey = false; /** big list of banned IP addresses, in the keys not the values */ $wgProxyList = array(); /** deprecated */ $wgProxyKey = false; /** Number of accounts each IP address may create, 0 to disable. * Requires memcached */ $wgAccountCreationThrottle = 0; # Client-side caching: /** Allow client-side caching of pages */ $wgCachePages = true; /** * Set this to current time to invalidate all prior cached pages. Affects both * client- and server-side caching. * You can get the current date on your server by using the command: * date +%Y%m%d%H%M%S */ $wgCacheEpoch = '20030516000000'; # Server-side caching: /** * This will cache static pages for non-logged-in users to reduce * database traffic on public sites. * Must set $wgShowIPinHeader = false */ $wgUseFileCache = false; /** Directory where the cached page will be saved */ $wgFileCacheDirectory = "{$wgUploadDirectory}/cache"; /** * When using the file cache, we can store the cached HTML gzipped to save disk * space. Pages will then also be served compressed to clients that support it. * THIS IS NOT COMPATIBLE with ob_gzhandler which is now enabled if supported in * the default LocalSettings.php! If you enable this, remove that setting first. * * Requires zlib support enabled in PHP. */ $wgUseGzip = false; # Email notification settings # /** For email notification on page changes */ $wgPasswordSender = $wgEmergencyContact; # true: from page editor if s/he opted-in # false: Enotif mails appear to come from $wgEmergencyContact $wgEnotifFromEditor = false; // TODO move UPO to preferences probably ? # If set to true, users get a corresponding option in their preferences and can choose to enable or disable at their discretion # If set to false, the corresponding input form on the user preference page is suppressed # It call this to be a "user-preferences-option (UPO)" $wgEmailAuthentication = true; # UPO (if this is set to false, texts referring to authentication are suppressed) $wgEnotifWatchlist = false; # UPO $wgEnotifUserTalk = false; # UPO $wgEnotifRevealEditorAddress = false; # UPO; reply-to address may be filled with page editor's address (if user allowed this in the preferences) $wgEnotifMinorEdits = true; # UPO; false: "minor edits" on pages do not trigger notification mails. # # Attention: _every_ change on a user_talk page trigger a notification mail (if the user is not yet notified) /** Show watching users in recent changes, watchlist and page history views */ $wgRCShowWatchingUsers = false; # UPO /** Show watching users in Page views */ $wgPageShowWatchingUsers = false; /** * Show "Updated (since my last visit)" marker in RC view, watchlist and history * view for watched pages with new changes */ $wgShowUpdatedMarker = true; $wgCookieExpiration = 2592000; /** Clock skew or the one-second resolution of time() can occasionally cause cache * problems when the user requests two pages within a short period of time. This * variable adds a given number of seconds to vulnerable timestamps, thereby giving * a grace period. */ $wgClockSkewFudge = 5; # Squid-related settings # /** Enable/disable Squid */ $wgUseSquid = false; /** If you run Squid3 with ESI support, enable this (default:false): */ $wgUseESI = false; /** Internal server name as known to Squid, if different */ # $wgInternalServer = 'http://yourinternal.tld:8000'; $wgInternalServer = $wgServer; /** * Cache timeout for the squid, will be sent as s-maxage (without ESI) or * Surrogate-Control (with ESI). Without ESI, you should strip out s-maxage in * the Squid config. 18000 seconds = 5 hours, more cache hits with 2678400 = 31 * days */ $wgSquidMaxage = 18000; /** * A list of proxy servers (ips if possible) to purge on changes don't specify * ports here (80 is default) */ # $wgSquidServers = array('127.0.0.1'); $wgSquidServers = array(); $wgSquidServersNoPurge = array(); /** Maximum number of titles to purge in any one client operation */ $wgMaxSquidPurgeTitles = 400; /** HTCP multicast purging */ $wgHTCPPort = 4827; $wgHTCPMulticastTTL = 1; # $wgHTCPMulticastAddress = "224.0.0.85"; # Cookie settings: # /** * Set to set an explicit domain on the login cookies eg, "justthis.domain. org" * or ".any.subdomain.net" */ $wgCookieDomain = ''; $wgCookiePath = '/'; $wgCookieSecure = ($wgProto == 'https'); $wgDisableCookieCheck = false; /** Whether to allow inline image pointing to other websites */ $wgAllowExternalImages = false; /** If the above is false, you can specify an exception here. Image URLs * that start with this string are then rendered, while all others are not. * You can use this to set up a trusted, simple repository of images. * * Example: * $wgAllowExternalImagesFrom = 'http://127.0.0.1/'; */ $wgAllowExternalImagesFrom = ''; /** Disable database-intensive features */ $wgMiserMode = false; /** Disable all query pages if miser mode is on, not just some */ $wgDisableQueryPages = false; /** Generate a watchlist once every hour or so */ $wgUseWatchlistCache = false; /** The hour or so mentioned above */ $wgWLCacheTimeout = 3600; /** Number of links to a page required before it is deemed "wanted" */ $wgWantedPagesThreshold = 1; /** * To use inline TeX, you need to compile 'texvc' (in the 'math' subdirectory of * the MediaWiki package and have latex, dvips, gs (ghostscript), andconvert * (ImageMagick) installed and available in the PATH. * Please see math/README for more information. */ $wgUseTeX = false; /** Location of the texvc binary */ $wgTexvc = './math/texvc'; # # Profiling / debugging # # You have to create a 'profiling' table in your database before using # profiling see maintenance/archives/patch-profiling.sql . /** Enable for more detailed by-function times in debug log */ $wgProfiling = false; /** Only record profiling info for pages that took longer than this */ $wgProfileLimit = 0.0; /** Don't put non-profiling info into log file */ $wgProfileOnly = false; /** Log sums from profiling into "profiling" table in db. */ $wgProfileToDatabase = false; /** Only profile every n requests when profiling is turned on */ $wgProfileSampleRate = 1; /** If true, print a raw call tree instead of per-function report */ $wgProfileCallTree = false; /** If not empty, specifies profiler type to load */ $wgProfilerType = ''; /** Should application server host be put into profiling table */ $wgProfilePerHost = false; /** Settings for UDP profiler */ $wgUDPProfilerHost = '127.0.0.1'; $wgUDPProfilerPort = '3811'; /** Detects non-matching wfProfileIn/wfProfileOut calls */ $wgDebugProfiling = false; /** Output debug message on every wfProfileIn/wfProfileOut */ $wgDebugFunctionEntry = 0; /** Lots of debugging output from SquidUpdate.php */ $wgDebugSquid = false; $wgDisableCounters = false; $wgDisableTextSearch = false; $wgDisableSearchContext = false; /** * If you've disabled search semi-permanently, this also disables updates to the * table. If you ever re-enable, be sure to rebuild the search table. */ $wgDisableSearchUpdate = false; /** Uploads have to be specially set up to be secure */ $wgEnableUploads = false; /** * Show EXIF data, on by default if available. * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php */ $wgShowEXIF = function_exists( 'exif_read_data' ); /** * Set to true to enable the upload _link_ while local uploads are disabled. * Assumes that the special page link will be bounced to another server where * uploads do work. */ $wgRemoteUploads = false; $wgDisableAnonTalk = false; /** * Do DELETE/INSERT for link updates instead of incremental */ $wgUseDumbLinkUpdate = false; /** * Anti-lock flags - bitfield * ALF_PRELOAD_LINKS * Preload links during link update for save * ALF_PRELOAD_EXISTENCE * Preload cur_id during replaceLinkHolders * ALF_NO_LINK_LOCK * Don't use locking reads when updating the link table. This is * necessary for wikis with a high edit rate for performance * reasons, but may cause link table inconsistency * ALF_NO_BLOCK_LOCK * As for ALF_LINK_LOCK, this flag is a necessity for high-traffic * wikis. */ $wgAntiLockFlags = 0; /** * Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will * fall back to the old behaviour (no merging). */ $wgDiff3 = '/usr/bin/diff3'; /** * We can also compress text in the old revisions table. If this is set on, old * revisions will be compressed on page save if zlib support is available. Any * compressed revisions will be decompressed on load regardless of this setting * *but will not be readable at all* if zlib support is not available. */ $wgCompressRevisions = false; /** * This is the list of preferred extensions for uploading files. Uploading files * with extensions not in this list will trigger a warning. */ $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' ); /** Files with these extensions will never be allowed as uploads. */ $wgFileBlacklist = array( # HTML may contain cookie-stealing JavaScript and web bugs 'html', 'htm', 'js', 'jsb', # PHP scripts may execute arbitrary code on the server 'php', 'phtml', 'php3', 'php4', 'phps', # Other types that may be interpreted by some servers 'shtml', 'jhtml', 'pl', 'py', 'cgi', # May contain harmful executables for Windows victims 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' ); /** Files with these mime types will never be allowed as uploads * if $wgVerifyMimeType is enabled. */ $wgMimeTypeBlacklist= array( # HTML may contain cookie-stealing JavaScript and web bugs 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript', # PHP scripts may execute arbitrary code on the server 'application/x-php', 'text/x-php', # Other types that may be interpreted by some servers 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh', # Windows metafile, client-side vulnerability on some systems 'application/x-msmetafile' ); /** This is a flag to determine whether or not to check file extensions on upload. */ $wgCheckFileExtensions = true; /** * If this is turned off, users may override the warning for files not covered * by $wgFileExtensions. */ $wgStrictFileExtensions = true; /** Warn if uploaded files are larger than this */ $wgUploadSizeWarning = 150 * 1024; /** For compatibility with old installations set to false */ $wgPasswordSalt = true; /** Which namespaces should support subpages? * See Language.php for a list of namespaces. */ $wgNamespacesWithSubpages = array( NS_TALK => true, NS_USER => true, NS_USER_TALK => true, NS_PROJECT_TALK => true, NS_IMAGE_TALK => true, NS_MEDIAWIKI_TALK => true, NS_TEMPLATE_TALK => true, NS_HELP_TALK => true, NS_CATEGORY_TALK => true ); $wgNamespacesToBeSearchedDefault = array( NS_MAIN => true, ); /** If set, a bold ugly notice will show up at the top of every page. */ $wgSiteNotice = ''; # # Images settings # /** dynamic server side image resizing ("Thumbnails") */ $wgUseImageResize = false; /** * Resizing can be done using PHP's internal image libraries or using * ImageMagick or another third-party converter, e.g. GraphicMagick. * These support more file formats than PHP, which only supports PNG, * GIF, JPG, XBM and WBMP. * * Use Image Magick instead of PHP builtin functions. */ $wgUseImageMagick = false; /** The convert command shipped with ImageMagick */ $wgImageMagickConvertCommand = '/usr/bin/convert'; /** * Use another resizing converter, e.g. GraphicMagick * %s will be replaced with the source path, %d with the destination * %w and %h will be replaced with the width and height * * An example is provided for GraphicMagick * Leave as false to skip this */ #$wgCustomConvertCommand = "gm convert %s -resize %wx%h %d" $wgCustomConvertCommand = false; # Scalable Vector Graphics (SVG) may be uploaded as images. # Since SVG support is not yet standard in browsers, it is # necessary to rasterize SVGs to PNG as a fallback format. # # An external program is required to perform this conversion: $wgSVGConverters = array( 'ImageMagick' => '$path/convert -background white -geometry $width $input $output', 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output', 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output', 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input', 'rsvg' => '$path/rsvg -w$width -h$height $input $output', ); /** Pick one of the above */ $wgSVGConverter = 'ImageMagick'; /** If not in the executable PATH, specify */ $wgSVGConverterPath = ''; /** Don't scale a SVG larger than this */ $wgSVGMaxSize = 1024; /** * Don't thumbnail an image if it will use too much working memory * Default is 50 MB if decompressed to RGBA form, which corresponds to * 12.5 million pixels or 3500x3500 */ $wgMaxImageArea = 1.25e7; /** * If rendered thumbnail files are older than this timestamp, they * will be rerendered on demand as if the file didn't already exist. * Update if there is some need to force thumbs and SVG rasterizations * to rerender, such as fixes to rendering bugs. */ $wgThumbnailEpoch = '20030516000000'; /** * If set, inline scaled images will still produce <img> tags ready for * output instead of showing an error message. * * This may be useful if errors are transitory, especially if the site * is configured to automatically render thumbnails on request. * * On the other hand, it may obscure error conditions from debugging. * Enable the debug log or the 'thumbnail' log group to make sure errors * are logged to a file for review. */ $wgIgnoreImageErrors = false; /** Set $wgCommandLineMode if it's not set already, to avoid notices */ if( !isset( $wgCommandLineMode ) ) { $wgCommandLineMode = false; } # # Recent changes settings # /** Log IP addresses in the recentchanges table */ $wgPutIPinRC = true; /** * Recentchanges items are periodically purged; entries older than this many * seconds will go. * For one week : 7 * 24 * 3600 */ $wgRCMaxAge = 7 * 24 * 3600; # Send RC updates via UDP $wgRC2UDPAddress = false; $wgRC2UDPPort = false; $wgRC2UDPPrefix = ''; # # Copyright and credits settings # /** RDF metadata toggles */ $wgEnableDublinCoreRdf = false; $wgEnableCreativeCommonsRdf = false; /** Override for copyright metadata. * TODO: these options need documentation */ $wgRightsPage = NULL; $wgRightsUrl = NULL; $wgRightsText = NULL; $wgRightsIcon = NULL; /** Set this to some HTML to override the rights icon with an arbitrary logo */ $wgCopyrightIcon = NULL; /** Set this to true if you want detailed copyright information forms on Upload. */ $wgUseCopyrightUpload = false; /** Set this to false if you want to disable checking that detailed copyright * information values are not empty. */ $wgCheckCopyrightUpload = true; /** * Set this to the number of authors that you want to be credited below an * article text. Set it to zero to hide the attribution block, and a negative * number (like -1) to show all authors. Note that this will require 2-3 extra * database hits, which can have a not insignificant impact on performance for * large wikis. */ $wgMaxCredits = 0; /** If there are more than $wgMaxCredits authors, show $wgMaxCredits of them. * Otherwise, link to a separate credits page. */ $wgShowCreditsIfMax = true; /** * Set this to false to avoid forcing the first letter of links to capitals. * WARNING: may break links! This makes links COMPLETELY case-sensitive. Links * appearing with a capital at the beginning of a sentence will *not* go to the * same place as links in the middle of a sentence using a lowercase initial. */ $wgCapitalLinks = true; /** * List of interwiki prefixes for wikis we'll accept as sources for * Special:Import (for sysops). Since complete page history can be imported, * these should be 'trusted'. * * If a user has the 'import' permission but not the 'importupload' permission, * they will only be able to run imports through this transwiki interface. */ $wgImportSources = array(); /** * If set to false, disables the full-history option on Special:Export. * This is currently poorly optimized for long edit histories, so is * disabled on Wikimedia's sites. */ $wgExportAllowHistory = true; + +/** + * If set nonzero, Special:Export requests for history of pages with + * more revisions than this will be rejected. On some big sites things + * could get bogged down by very very long pages. + */ +$wgExportMaxHistory = 0; + $wgExportAllowListContributors = false ; /** Text matching this regular expression will be recognised as spam * See http://en.wikipedia.org/wiki/Regular_expression */ $wgSpamRegex = false; /** Similarly if this function returns true */ $wgFilterCallback = false; /** Go button goes straight to the edit screen if the article doesn't exist. */ $wgGoToEdit = false; /** Allow limited user-specified HTML in wiki pages? * It will be run through a whitelist for security. Set this to false if you * want wiki pages to consist only of wiki markup. Note that replacements do not * yet exist for all HTML constructs.*/ $wgUserHtml = true; /** Allow raw, unchecked HTML in <html>...</html> sections. * THIS IS VERY DANGEROUS on a publically editable site, so USE wgGroupPermissions * TO RESTRICT EDITING to only those that you trust */ $wgRawHtml = false; /** * $wgUseTidy: use tidy to make sure HTML output is sane. * This should only be enabled if $wgUserHtml is true. * tidy is a free tool that fixes broken HTML. * See http://www.w3.org/People/Raggett/tidy/ * $wgTidyBin should be set to the path of the binary and * $wgTidyConf to the path of the configuration file. * $wgTidyOpts can include any number of parameters. * * $wgTidyInternal controls the use of the PECL extension to use an in- * process tidy library instead of spawning a separate program. * Normally you shouldn't need to override the setting except for * debugging. To install, use 'pear install tidy' and add a line * 'extension=tidy.so' to php.ini. */ $wgUseTidy = false; $wgAlwaysUseTidy = false; $wgTidyBin = 'tidy'; $wgTidyConf = $IP.'/extensions/tidy/tidy.conf'; $wgTidyOpts = ''; $wgTidyInternal = function_exists( 'tidy_load_config' ); /** See list of skins and their symbolic names in languages/Language.php */ $wgDefaultSkin = 'monobook'; /** * Settings added to this array will override the language globals for the user * preferences used by anonymous visitors and newly created accounts. (See names * and sample values in languages/Language.php) * For instance, to disable section editing links: * $wgDefaultUserOptions ['editsection'] = 0; * */ $wgDefaultUserOptions = array(); /** Whether or not to allow and use real name fields. Defaults to true. */ $wgAllowRealName = true; /** Use XML parser? */ $wgUseXMLparser = false ; /***************************************************************************** * Extensions */ /** * A list of callback functions which are called once MediaWiki is fully initialised */ $wgExtensionFunctions = array(); /** * Extension functions for initialisation of skins. This is called somewhat earlier * than $wgExtensionFunctions. */ $wgSkinExtensionFunctions = array(); /** * Special page list. * See the top of SpecialPage.php for documentation. */ $wgSpecialPages = array(); /** * Array mapping class names to filenames, for autoloading. */ $wgAutoloadClasses = array(); /** * An array of extension types and inside that their names, versions, authors * and urls, note that the version and url key can be omitted. * * <code> * $wgExtensionCredits[$type][] = array( * 'name' => 'Example extension', * 'version' => 1.9, * 'author' => 'Foo Barstein', * 'url' => 'http://wwww.example.com/Example%20Extension/', * ); * </code> * * Where $type is 'specialpage', 'parserhook', or 'other'. */ $wgExtensionCredits = array(); /* * end extensions ******************************************************************************/ /** * Allow user Javascript page? * This enables a lot of neat customizations, but may * increase security risk to users and server load. */ $wgAllowUserJs = false; /** * Allow user Cascading Style Sheets (CSS)? * This enables a lot of neat customizations, but may * increase security risk to users and server load. */ $wgAllowUserCss = false; /** Use the site's Javascript page? */ $wgUseSiteJs = true; /** Use the site's Cascading Style Sheets (CSS)? */ $wgUseSiteCss = true; /** Filter for Special:Randompage. Part of a WHERE clause */ $wgExtraRandompageSQL = false; /** Allow the "info" action, very inefficient at the moment */ $wgAllowPageInfo = false; /** Maximum indent level of toc. */ $wgMaxTocLevel = 999; /** Name of the external diff engine to use */ $wgExternalDiffEngine = false; /** Use RC Patrolling to check for vandalism */ $wgUseRCPatrol = true; /** Set maximum number of results to return in syndication feeds (RSS, Atom) for * eg Recentchanges, Newpages. */ $wgFeedLimit = 50; /** _Minimum_ timeout for cached Recentchanges feed, in seconds. * A cached version will continue to be served out even if changes * are made, until this many seconds runs out since the last render. * * If set to 0, feed caching is disabled. Use this for debugging only; * feed generation can be pretty slow with diffs. */ $wgFeedCacheTimeout = 60; /** When generating Recentchanges RSS/Atom feed, diffs will not be generated for * pages larger than this size. */ $wgFeedDiffCutoff = 32768; /** * Additional namespaces. If the namespaces defined in Language.php and * Namespace.php are insufficient, you can create new ones here, for example, * to import Help files in other languages. * PLEASE NOTE: Once you delete a namespace, the pages in that namespace will * no longer be accessible. If you rename it, then you can access them through * the new namespace name. * * Custom namespaces should start at 100 to avoid conflicting with standard * namespaces, and should always follow the even/odd main/talk pattern. */ #$wgExtraNamespaces = # array(100 => "Hilfe", # 101 => "Hilfe_Diskussion", # 102 => "Aide", # 103 => "Discussion_Aide" # ); $wgExtraNamespaces = NULL; /** * Limit images on image description pages to a user-selectable limit. In order * to reduce disk usage, limits can only be selected from a list. This is the * list of settings the user can choose from: */ $wgImageLimits = array ( array(320,240), array(640,480), array(800,600), array(1024,768), array(1280,1024), array(10000,10000) ); /** * Adjust thumbnails on image pages according to a user setting. In order to * reduce disk usage, the values can only be selected from a list. This is the * list of settings the user can choose from: */ $wgThumbLimits = array( 120, 150, 180, 200, 250, 300 ); /** * On category pages, show thumbnail gallery for images belonging to that * category instead of listing them as articles. */ $wgCategoryMagicGallery = true; /** * Paging limit for categories */ $wgCategoryPagingLimit = 200; /** * Browser Blacklist for unicode non compliant browsers * Contains a list of regexps : "/regexp/" matching problematic browsers */ $wgBrowserBlackList = array( /** * Netscape 2-4 detection * The minor version may contain strings such as "Gold" or "SGoldC-SGI" * Lots of non-netscape user agents have "compatible", so it's useful to check for that * with a negative assertion. The [UIN] identifier specifies the level of security * in a Netscape/Mozilla browser, checking for it rules out a number of fakers. * The language string is unreliable, it is missing on NS4 Mac. * * Reference: http://www.psychedelix.com/agents/index.shtml */ '/^Mozilla\/2\.[^ ]+ .*?\((?!compatible).*; [UIN]/', '/^Mozilla\/3\.[^ ]+ .*?\((?!compatible).*; [UIN]/', '/^Mozilla\/4\.[^ ]+ .*?\((?!compatible).*; [UIN]/', /** * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>, Þ to <THORN> and Ð to <ETH> * * Known useragents: * - Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC) * - Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC) * - Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC) * - [...] * * @link http://en.wikipedia.org/w/index.php?title=User%3A%C6var_Arnfj%F6r%F0_Bjarmason%2Ftestme&diff=12356041&oldid=12355864 * @link http://en.wikipedia.org/wiki/Template%3AOS9 */ '/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/' ); /** * Fake out the timezone that the server thinks it's in. This will be used for * date display and not for what's stored in the DB. Leave to null to retain * your server's OS-based timezone value. This is the same as the timezone. * * This variable is currently used ONLY for signature formatting, not for * anything else. */ # $wgLocaltimezone = 'GMT'; # $wgLocaltimezone = 'PST8PDT'; # $wgLocaltimezone = 'Europe/Sweden'; # $wgLocaltimezone = 'CET'; $wgLocaltimezone = null; /** * Set an offset from UTC in minutes to use for the default timezone setting * for anonymous users and new user accounts. * * This setting is used for most date/time displays in the software, and is * overrideable in user preferences. It is *not* used for signature timestamps. * * You can set it to match the configured server timezone like this: * $wgLocalTZoffset = date("Z") / 60; * * If your server is not configured for the timezone you want, you can set * this in conjunction with the signature timezone and override the TZ * environment variable like so: * $wgLocaltimezone="Europe/Berlin"; * putenv("TZ=$wgLocaltimezone"); * $wgLocalTZoffset = date("Z") / 60; * * Leave at NULL to show times in universal time (UTC/GMT). */ $wgLocalTZoffset = null; /** * When translating messages with wfMsg(), it is not always clear what should be * considered UI messages and what shoud be content messages. * * For example, for regular wikipedia site like en, there should be only one * 'mainpage', therefore when getting the link of 'mainpage', we should treate * it as content of the site and call wfMsgForContent(), while for rendering the * text of the link, we call wfMsg(). The code in default behaves this way. * However, sites like common do offer different versions of 'mainpage' and the * like for different languages. This array provides a way to override the * default behavior. For example, to allow language specific mainpage and * community portal, set * * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' ); */ $wgForceUIMsgAsContentMsg = array(); /** * Authentication plugin. */ $wgAuth = null; /** * Global list of hooks. * Add a hook by doing: * $wgHooks['event_name'][] = $function; * or: * $wgHooks['event_name'][] = array($function, $data); * or: * $wgHooks['event_name'][] = array($object, 'method'); */ $wgHooks = array(); /** * The logging system has two levels: an event type, which describes the * general category and can be viewed as a named subset of all logs; and * an action, which is a specific kind of event that can exist in that * log type. */ $wgLogTypes = array( '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'import' ); /** * Lists the message key string for each log type. The localized messages * will be listed in the user interface. * * Extensions with custom log types may add to this array. */ $wgLogNames = array( '' => 'log', 'block' => 'blocklogpage', 'protect' => 'protectlogpage', 'rights' => 'rightslog', 'delete' => 'dellogpage', 'upload' => 'uploadlogpage', 'move' => 'movelogpage', 'import' => 'importlogpage' ); /** * Lists the message key string for descriptive text to be shown at the * top of each log type. * * Extensions with custom log types may add to this array. */ $wgLogHeaders = array( '' => 'alllogstext', 'block' => 'blocklogtext', 'protect' => 'protectlogtext', 'rights' => 'rightslogtext', 'delete' => 'dellogpagetext', 'upload' => 'uploadlogpagetext', 'move' => 'movelogpagetext', 'import' => 'importlogpagetext', ); /** * Lists the message key string for formatting individual events of each * type and action when listed in the logs. * * Extensions with custom log types may add to this array. */ $wgLogActions = array( 'block/block' => 'blocklogentry', 'block/unblock' => 'unblocklogentry', 'protect/protect' => 'protectedarticle', 'protect/unprotect' => 'unprotectedarticle', 'rights/rights' => 'rightslogentry', 'delete/delete' => 'deletedarticle', 'delete/restore' => 'undeletedarticle', 'delete/revision' => 'revdelete-logentry', 'upload/upload' => 'uploadedimage', 'upload/revert' => 'uploadedimage', 'move/move' => '1movedto2', 'move/move_redir' => '1movedto2_redir', 'import/upload' => 'import-logentry-upload', 'import/interwiki' => 'import-logentry-interwiki' ); /** * Experimental preview feature to fetch rendered text * over an XMLHttpRequest from JavaScript instead of * forcing a submit and reload of the whole page. * Leave disabled unless you're testing it. */ $wgLivePreview = false; /** * Disable the internal MySQL-based search, to allow it to be * implemented by an extension instead. */ $wgDisableInternalSearch = false; /** * Set this to a URL to forward search requests to some external location. * If the URL includes '$1', this will be replaced with the URL-encoded * search term. * * For example, to forward to Google you'd have something like: * $wgSearchForwardUrl = 'http://www.google.com/search?q=$1' . * '&domains=http://example.com' . * '&sitesearch=http://example.com' . * '&ie=utf-8&oe=utf-8'; */ $wgSearchForwardUrl = null; /** * If true, external URL links in wiki text will be given the * rel="nofollow" attribute as a hint to search engines that * they should not be followed for ranking purposes as they * are user-supplied and thus subject to spamming. */ $wgNoFollowLinks = true; /** * Namespaces in which $wgNoFollowLinks doesn't apply. * See Language.php for a list of namespaces. */ $wgNoFollowNsExceptions = array(); /** * Robot policies for namespaces * e.g. $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' ); */ $wgNamespaceRobotPolicies = array(); /** * Specifies the minimal length of a user password. If set to * 0, empty passwords are allowed. */ $wgMinimalPasswordLength = 0; /** * Activate external editor interface for files and pages * See http://meta.wikimedia.org/wiki/Help:External_editors */ $wgUseExternalEditor = true; /** Whether or not to sort special pages in Special:Specialpages */ $wgSortSpecialPages = true; /** * Specify the name of a skin that should not be presented in the * list of available skins. * Use for blacklisting a skin which you do not want to remove * from the .../skins/ directory */ $wgSkipSkin = ''; $wgSkipSkins = array(); # More of the same /** * Array of disabled article actions, e.g. view, edit, dublincore, delete, etc. */ $wgDisabledActions = array(); /** * Disable redirects to special pages and interwiki redirects, which use a 302 and have no "redirected from" link */ $wgDisableHardRedirects = false; /** * Use http.dnsbl.sorbs.net to check for open proxies */ $wgEnableSorbs = false; /** * Proxy whitelist, list of addresses that are assumed to be non-proxy despite what the other * methods might say */ $wgProxyWhitelist = array(); /** * Simple rate limiter options to brake edit floods. * Maximum number actions allowed in the given number of seconds; * after that the violating client receives HTTP 500 error pages * until the period elapses. * * array( 4, 60 ) for a maximum of 4 hits in 60 seconds. * * This option set is experimental and likely to change. * Requires memcached. */ $wgRateLimits = array( 'edit' => array( 'anon' => null, // for any and all anonymous edits (aggregate) 'user' => null, // for each logged-in user 'newbie' => null, // for each recent account; overrides 'user' 'ip' => null, // for each anon and recent account 'subnet' => null, // ... with final octet removed ), 'move' => array( 'user' => null, 'newbie' => null, 'ip' => null, 'subnet' => null, ), 'mailpassword' => array( 'anon' => NULL, ), ); /** * Set to a filename to log rate limiter hits. */ $wgRateLimitLog = null; /** * Array of groups which should never trigger the rate limiter */ $wgRateLimitsExcludedGroups = array( 'sysop', 'bureaucrat' ); /** * On Special:Unusedimages, consider images "used", if they are put * into a category. Default (false) is not to count those as used. */ $wgCountCategorizedImagesAsUsed = false; /** * External stores allow including content * from non database sources following URL links * * Short names of ExternalStore classes may be specified in an array here: * $wgExternalStores = array("http","file","custom")... * * CAUTION: Access to database might lead to code execution */ $wgExternalStores = false; /** * An array of external mysql servers, e.g. * $wgExternalServers = array( 'cluster1' => array( 'srv28', 'srv29', 'srv30' ) ); */ $wgExternalServers = array(); /** * The place to put new revisions, false to put them in the local text table. * Part of a URL, e.g. DB://cluster1 * * Can be an array instead of a single string, to enable data distribution. Keys * must be consecutive integers, starting at zero. Example: * * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' ); * */ $wgDefaultExternalStore = false; /** * list of trusted media-types and mime types. * Use the MEDIATYPE_xxx constants to represent media types. * This list is used by Image::isSafeFile * * Types not listed here will have a warning about unsafe content * displayed on the images description page. It would also be possible * to use this for further restrictions, like disabling direct * [[media:...]] links for non-trusted formats. */ $wgTrustedMediaFormats= array( MEDIATYPE_BITMAP, //all bitmap formats MEDIATYPE_AUDIO, //all audio formats MEDIATYPE_VIDEO, //all plain video formats "image/svg", //svg (only needed if inline rendering of svg is not supported) "application/pdf", //PDF files #"application/x-shockwafe-flash", //flash/shockwave movie ); /** * Allow special page inclusions such as {{Special:Allpages}} */ $wgAllowSpecialInclusion = true; /** * Timeout for HTTP requests done via CURL */ $wgHTTPTimeout = 3; /** * Proxy to use for CURL requests. */ $wgHTTPProxy = false; /** * Enable interwiki transcluding. Only when iw_trans=1. */ $wgEnableScaryTranscluding = false; /** * Expiry time for interwiki transclusion */ $wgTranscludeCacheExpiry = 3600; /** * Support blog-style "trackbacks" for articles. See * http://www.sixapart.com/pronet/docs/trackback_spec for details. */ $wgUseTrackbacks = false; /** * Enable filtering of categories in Recentchanges */ $wgAllowCategorizedRecentChanges = false ; /** * Number of jobs to perform per request. May be less than one in which case * jobs are performed probabalistically. If this is zero, jobs will not be done * during ordinary apache requests. In this case, maintenance/runJobs.php should * be run periodically. */ $wgJobRunRate = 1; /** * Log file for job execution */ $wgJobLogFile = false; /** * Number of rows to update per job */ $wgUpdateRowsPerJob = 500; /** * Number of rows to update per query */ $wgUpdateRowsPerQuery = 10; /** * Enable use of AJAX features, currently auto suggestion for the search bar */ $wgUseAjax = false; /** * List of Ajax-callable functions */ $wgAjaxExportList = array( 'wfSajaxSearch' ); /** * Allow DISPLAYTITLE to change title display */ $wgAllowDisplayTitle = false ; /** * Array of usernames which may not be registered or logged in from * Maintenance scripts can still use these */ $wgReservedUsernames = array( 'MediaWiki default', 'Conversion script' ); /** * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't * perform basic stuff like MIME detection and which are vulnerable to further idiots uploading * crap files as images. When this directive is on, <title> will be allowed in files with * an "image/svg" MIME type. You should leave this disabled if your web server is misconfigured * and doesn't send appropriate MIME types for SVG images. */ $wgAllowTitlesInSVG = false; /** * Array of namespaces which can be deemed to contain valid "content", as far * as the site statistics are concerned. Useful if additional namespaces also * contain "content" which should be considered when generating a count of the * number of articles in the wiki. */ $wgContentNamespaces = array( NS_MAIN ); /** * Maximum amount of virtual memory available to shell processes under linux, in KB. */ $wgMaxShellMemory = 102400; ?> Index: trunk/phase3/includes/Revision.php =================================================================== --- trunk/phase3/includes/Revision.php (revision 15100) +++ trunk/phase3/includes/Revision.php (revision 15101) @@ -1,782 +1,799 @@ <?php /** * @package MediaWiki * @todo document */ /** */ require_once( 'Database.php' ); /** * @package MediaWiki * @todo document */ class Revision { const DELETED_TEXT = 1; const DELETED_COMMENT = 2; const DELETED_USER = 4; const DELETED_RESTRICTED = 8; /** * Load a page revision from a given revision ID number. * Returns null if no such revision can be found. * * @param int $id * @static * @access public */ function newFromId( $id ) { return Revision::newFromConds( array( 'page_id=rev_page', 'rev_id' => intval( $id ) ) ); } /** * Load either the current, or a specified, revision * that's attached to a given title. If not attached * to that title, will return null. * * @param Title $title * @param int $id * @return Revision * @access public * @static */ function newFromTitle( &$title, $id = 0 ) { if( $id ) { $matchId = intval( $id ); } else { $matchId = 'page_latest'; } return Revision::newFromConds( array( "rev_id=$matchId", 'page_id=rev_page', 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDbkey() ) ); } /** * Load either the current, or a specified, revision * that's attached to a given page. If not attached * to that page, will return null. * * @param Database $db * @param int $pageid * @param int $id * @return Revision * @access public */ function loadFromPageId( &$db, $pageid, $id = 0 ) { $conds=array('page_id=rev_page','rev_page'=>intval( $pageid ), 'page_id'=>intval( $pageid )); if( $id ) { $conds['rev_id']=intval($id); } else { $conds[]='rev_id=page_latest'; } return Revision::loadFromConds( $db, $conds ); } /** * Load either the current, or a specified, revision * that's attached to a given page. If not attached * to that page, will return null. * * @param Database $db * @param Title $title * @param int $id * @return Revision * @access public */ function loadFromTitle( &$db, $title, $id = 0 ) { if( $id ) { $matchId = intval( $id ); } else { $matchId = 'page_latest'; } return Revision::loadFromConds( $db, array( "rev_id=$matchId", 'page_id=rev_page', 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDbkey() ) ); } /** * Load the revision for the given title with the given timestamp. * WARNING: Timestamps may in some circumstances not be unique, * so this isn't the best key to use. * * @param Database $db * @param Title $title * @param string $timestamp * @return Revision * @access public * @static */ function loadFromTimestamp( &$db, &$title, $timestamp ) { return Revision::loadFromConds( $db, array( 'rev_timestamp' => $db->timestamp( $timestamp ), 'page_id=rev_page', 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDbkey() ) ); } /** * Given a set of conditions, fetch a revision. * * @param array $conditions * @return Revision * @static * @access private */ function newFromConds( $conditions ) { $db =& wfGetDB( DB_SLAVE ); $row = Revision::loadFromConds( $db, $conditions ); if( is_null( $row ) ) { $dbw =& wfGetDB( DB_MASTER ); $row = Revision::loadFromConds( $dbw, $conditions ); } return $row; } /** * Given a set of conditions, fetch a revision from * the given database connection. * * @param Database $db * @param array $conditions * @return Revision * @static * @access private */ function loadFromConds( &$db, $conditions ) { $res = Revision::fetchFromConds( $db, $conditions ); if( $res ) { $row = $res->fetchObject(); $res->free(); if( $row ) { $ret = new Revision( $row ); return $ret; } } $ret = null; return $ret; } /** * Return a wrapper for a series of database rows to * fetch all of a given page's revisions in turn. * Each row can be fed to the constructor to get objects. * * @param Title $title * @return ResultWrapper * @static * @access public */ function fetchAllRevisions( &$title ) { return Revision::fetchFromConds( wfGetDB( DB_SLAVE ), array( 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDbkey(), 'page_id=rev_page' ) ); } /** * Return a wrapper for a series of database rows to * fetch all of a given page's revisions in turn. * Each row can be fed to the constructor to get objects. * * @param Title $title * @return ResultWrapper * @static * @access public */ function fetchRevision( &$title ) { return Revision::fetchFromConds( wfGetDB( DB_SLAVE ), array( 'rev_id=page_latest', 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDbkey(), 'page_id=rev_page' ) ); } /** * Given a set of conditions, return a ResultWrapper * which will return matching database rows with the * fields necessary to build Revision objects. * * @param Database $db * @param array $conditions * @return ResultWrapper * @static * @access private */ function fetchFromConds( &$db, $conditions ) { $res = $db->select( array( 'page', 'revision' ), array( 'page_namespace', 'page_title', 'page_latest', 'rev_id', 'rev_page', 'rev_text_id', 'rev_comment', 'rev_user_text', 'rev_user', 'rev_minor_edit', 'rev_timestamp', 'rev_deleted' ), $conditions, 'Revision::fetchRow', array( 'LIMIT' => 1 ) ); $ret = $db->resultObject( $res ); return $ret; } /** * @param object $row * @access private */ function Revision( $row ) { if( is_object( $row ) ) { $this->mId = intval( $row->rev_id ); $this->mPage = intval( $row->rev_page ); $this->mTextId = intval( $row->rev_text_id ); $this->mComment = $row->rev_comment; $this->mUserText = $row->rev_user_text; $this->mUser = intval( $row->rev_user ); $this->mMinorEdit = intval( $row->rev_minor_edit ); $this->mTimestamp = $row->rev_timestamp; $this->mDeleted = intval( $row->rev_deleted ); if( isset( $row->page_latest ) ) { $this->mCurrent = ( $row->rev_id == $row->page_latest ); $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title ); } else { $this->mCurrent = false; $this->mTitle = null; } if( isset( $row->old_text ) ) { $this->mText = $this->getRevisionText( $row ); } else { $this->mText = null; } } elseif( is_array( $row ) ) { // Build a new revision to be saved... global $wgUser; $this->mId = isset( $row['id'] ) ? intval( $row['id'] ) : null; $this->mPage = isset( $row['page'] ) ? intval( $row['page'] ) : null; $this->mTextId = isset( $row['text_id'] ) ? intval( $row['text_id'] ) : null; $this->mUserText = isset( $row['user_text'] ) ? strval( $row['user_text'] ) : $wgUser->getName(); $this->mUser = isset( $row['user'] ) ? intval( $row['user'] ) : $wgUser->getId(); $this->mMinorEdit = isset( $row['minor_edit'] ) ? intval( $row['minor_edit'] ) : 0; $this->mTimestamp = isset( $row['timestamp'] ) ? strval( $row['timestamp'] ) : wfTimestamp( TS_MW ); $this->mDeleted = isset( $row['deleted'] ) ? intval( $row['deleted'] ) : 0; // Enforce spacing trimming on supplied text $this->mComment = isset( $row['comment'] ) ? trim( strval( $row['comment'] ) ) : null; $this->mText = isset( $row['text'] ) ? rtrim( strval( $row['text'] ) ) : null; $this->mTitle = null; # Load on demand if needed $this->mCurrent = false; } else { throw new MWException( 'Revision constructor passed invalid row format.' ); } } /**#@+ * @access public */ /** * @return int */ function getId() { return $this->mId; } /** * @return int */ function getTextId() { return $this->mTextId; } /** * Returns the title of the page associated with this entry. * @return Title */ function getTitle() { if( isset( $this->mTitle ) ) { return $this->mTitle; } $dbr =& wfGetDB( DB_SLAVE ); $row = $dbr->selectRow( array( 'page', 'revision' ), array( 'page_namespace', 'page_title' ), array( 'page_id=rev_page', 'rev_id' => $this->mId ), 'Revision::getTitle' ); if( $row ) { $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title ); } return $this->mTitle; } /** * Set the title of the revision * @param Title $title */ function setTitle( $title ) { $this->mTitle = $title; } /** * @return int */ function getPage() { return $this->mPage; } /** * Fetch revision's user id if it's available to all users * @return int */ function getUser() { if( $this->isDeleted( self::DELETED_USER ) ) { return 0; } else { return $this->mUser; } } /** * Fetch revision's user id without regard for the current user's permissions * @return string */ function getRawUser() { return $this->mUser; } /** * Fetch revision's username if it's available to all users * @return string */ function getUserText() { if( $this->isDeleted( self::DELETED_USER ) ) { return ""; } else { return $this->mUserText; } } /** * Fetch revision's username without regard for view restrictions * @return string */ function getRawUserText() { return $this->mUserText; } /** * Fetch revision comment if it's available to all users * @return string */ function getComment() { if( $this->isDeleted( self::DELETED_COMMENT ) ) { return ""; } else { return $this->mComment; } } /** * Fetch revision comment without regard for the current user's permissions * @return string */ function getRawComment() { return $this->mComment; } /** * @return bool */ function isMinor() { return (bool)$this->mMinorEdit; } /** * int $field one of DELETED_* bitfield constants * @return bool */ function isDeleted( $field ) { return ($this->mDeleted & $field) == $field; } /** * Fetch revision text if it's available to all users * @return string */ function getText() { if( $this->isDeleted( self::DELETED_TEXT ) ) { return ""; } else { return $this->getRawText(); } } /** * Fetch revision text without regard for view restrictions * @return string */ function getRawText() { if( is_null( $this->mText ) ) { // Revision text is immutable. Load on demand: $this->mText = $this->loadText(); } return $this->mText; } /** * @return string */ function getTimestamp() { return wfTimestamp(TS_MW, $this->mTimestamp); } /** * @return bool */ function isCurrent() { return $this->mCurrent; } /** * @return Revision */ function getPrevious() { $prev = $this->mTitle->getPreviousRevisionID( $this->mId ); if ( $prev ) { return Revision::newFromTitle( $this->mTitle, $prev ); } else { return null; } } /** * @return Revision */ function getNext() { $next = $this->mTitle->getNextRevisionID( $this->mId ); if ( $next ) { return Revision::newFromTitle( $this->mTitle, $next ); } else { return null; } } /**#@-*/ /** * Get revision text associated with an old or archive row * $row is usually an object from wfFetchRow(), both the flags and the text * field must be included * @static * @param integer $row Id of a row * @param string $prefix table prefix (default 'old_') * @return string $text|false the text requested */ function getRevisionText( $row, $prefix = 'old_' ) { $fname = 'Revision::getRevisionText'; wfProfileIn( $fname ); # Get data $textField = $prefix . 'text'; $flagsField = $prefix . 'flags'; if( isset( $row->$flagsField ) ) { $flags = explode( ',', $row->$flagsField ); } else { $flags = array(); } if( isset( $row->$textField ) ) { $text = $row->$textField; } else { wfProfileOut( $fname ); return false; } # Use external methods for external objects, text in table is URL-only then if ( in_array( 'external', $flags ) ) { $url=$text; @list($proto,$path)=explode('://',$url,2); if ($path=="") { wfProfileOut( $fname ); return false; } require_once('ExternalStore.php'); $text=ExternalStore::fetchFromURL($url); } // If the text was fetched without an error, convert it if ( $text !== false ) { if( in_array( 'gzip', $flags ) ) { # Deal with optional compression of archived pages. # This can be done periodically via maintenance/compressOld.php, and # as pages are saved if $wgCompressRevisions is set. $text = gzinflate( $text ); } if( in_array( 'object', $flags ) ) { # Generic compressed storage $obj = unserialize( $text ); if ( !is_object( $obj ) ) { // Invalid object wfProfileOut( $fname ); return false; } $text = $obj->getText(); } global $wgLegacyEncoding; if( $wgLegacyEncoding && !in_array( 'utf-8', $flags ) ) { # Old revisions kept around in a legacy encoding? # Upconvert on demand. global $wgInputEncoding, $wgContLang; $text = $wgContLang->iconv( $wgLegacyEncoding, $wgInputEncoding . '//IGNORE', $text ); } } wfProfileOut( $fname ); return $text; } /** * If $wgCompressRevisions is enabled, we will compress data. * The input string is modified in place. * Return value is the flags field: contains 'gzip' if the * data is compressed, and 'utf-8' if we're saving in UTF-8 * mode. * * @static * @param mixed $text reference to a text * @return string */ function compressRevisionText( &$text ) { global $wgCompressRevisions; $flags = array(); # Revisions not marked this way will be converted # on load if $wgLegacyCharset is set in the future. $flags[] = 'utf-8'; if( $wgCompressRevisions ) { if( function_exists( 'gzdeflate' ) ) { $text = gzdeflate( $text ); $flags[] = 'gzip'; } else { wfDebug( "Revision::compressRevisionText() -- no zlib support, not compressing\n" ); } } return implode( ',', $flags ); } /** * Insert a new revision into the database, returning the new revision ID * number on success and dies horribly on failure. * * @param Database $dbw * @return int */ function insertOn( &$dbw ) { global $wgDefaultExternalStore; $fname = 'Revision::insertOn'; wfProfileIn( $fname ); $data = $this->mText; $flags = Revision::compressRevisionText( $data ); # Write to external storage if required if ( $wgDefaultExternalStore ) { if ( is_array( $wgDefaultExternalStore ) ) { // Distribute storage across multiple clusters $store = $wgDefaultExternalStore[mt_rand(0, count( $wgDefaultExternalStore ) - 1)]; } else { $store = $wgDefaultExternalStore; } require_once('ExternalStore.php'); // Store and get the URL $data = ExternalStore::insert( $store, $data ); if ( !$data ) { # This should only happen in the case of a configuration error, where the external store is not valid throw new MWException( "Unable to store text to external storage $store" ); } if ( $flags ) { $flags .= ','; } $flags .= 'external'; } # Record the text (or external storage URL) to the text table if( !isset( $this->mTextId ) ) { $old_id = $dbw->nextSequenceValue( 'text_old_id_val' ); $dbw->insert( 'text', array( 'old_id' => $old_id, 'old_text' => $data, 'old_flags' => $flags, ), $fname ); $this->mTextId = $dbw->insertId(); } # Record the edit in revisions $rev_id = isset( $this->mId ) ? $this->mId : $dbw->nextSequenceValue( 'rev_rev_id_val' ); $dbw->insert( 'revision', array( 'rev_id' => $rev_id, 'rev_page' => $this->mPage, 'rev_text_id' => $this->mTextId, 'rev_comment' => $this->mComment, 'rev_minor_edit' => $this->mMinorEdit ? 1 : 0, 'rev_user' => $this->mUser, 'rev_user_text' => $this->mUserText, 'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ), 'rev_deleted' => $this->mDeleted, ), $fname ); $this->mId = !is_null($rev_id) ? $rev_id : $dbw->insertId(); wfProfileOut( $fname ); return $this->mId; } /** * Lazy-load the revision's text. * Currently hardcoded to the 'text' table storage engine. * * @return string * @access private */ function loadText() { $fname = 'Revision::loadText'; wfProfileIn( $fname ); $dbr =& wfGetDB( DB_SLAVE ); $row = $dbr->selectRow( 'text', array( 'old_text', 'old_flags' ), array( 'old_id' => $this->getTextId() ), $fname); if( !$row ) { $dbw =& wfGetDB( DB_MASTER ); $row = $dbw->selectRow( 'text', array( 'old_text', 'old_flags' ), array( 'old_id' => $this->getTextId() ), $fname); } $text = Revision::getRevisionText( $row ); wfProfileOut( $fname ); return $text; } /** * Create a new null-revision for insertion into a page's * history. This will not re-save the text, but simply refer * to the text from the previous version. * * Such revisions can for instance identify page rename * operations and other such meta-modifications. * * @param Database $dbw * @param int $pageId ID number of the page to read from * @param string $summary * @param bool $minor * @return Revision */ function newNullRevision( &$dbw, $pageId, $summary, $minor ) { $fname = 'Revision::newNullRevision'; wfProfileIn( $fname ); $current = $dbw->selectRow( array( 'page', 'revision' ), array( 'page_latest', 'rev_text_id' ), array( 'page_id' => $pageId, 'page_latest=rev_id', ), $fname ); if( $current ) { $revision = new Revision( array( 'page' => $pageId, 'comment' => $summary, 'minor_edit' => $minor, 'text_id' => $current->rev_text_id, ) ); } else { $revision = null; } wfProfileOut( $fname ); return $revision; } /** * Determine if the current user is allowed to view a particular * field of this revision, if it's marked as deleted. * @param int $field one of self::DELETED_TEXT, * self::DELETED_COMMENT, * self::DELETED_USER * @return bool */ function userCan( $field ) { if( ( $this->mDeleted & $field ) == $field ) { global $wgUser; $permission = ( $this->mDeleted & self::DELETED_RESTRICTED ) == self::DELETED_RESTRICTED ? 'hiderevision' : 'deleterevision'; wfDebug( "Checking for $permission due to $field match on $this->mDeleted\n" ); return $wgUser->isAllowed( $permission ); } else { return true; } } /** * Get rev_timestamp from rev_id, without loading the rest of the row * @param integer $id */ static function getTimestampFromID( $id ) { $timestamp = $dbr->selectField( 'revision', 'rev_timestamp', array( 'rev_id' => $id ), __METHOD__ ); if ( $timestamp === false ) { # Not in slave, try master $dbw =& wfGetDB( DB_MASTER ); $timestamp = $dbw->selectField( 'revision', 'rev_timestamp', array( 'rev_id' => $id ), __METHOD__ ); } return $timestamp; } + + static function countByPageId( $db, $id ) { + $row = $db->selectRow( 'revision', 'COUNT(*) AS revCount', + array( 'rev_page' => $id ), __METHOD__ ); + if( $row ) { + return $row->revCount; + } + return 0; + } + + static function countByTitle( $db, $title ) { + $id = $title->getArticleId(); + if( $id ) { + return Revision::countByPageId( $db, $id ); + } + return 0; + } } /** * Aliases for backwards compatibility with 1.6 */ define( 'MW_REV_DELETED_TEXT', Revision::DELETED_TEXT ); define( 'MW_REV_DELETED_COMMENT', Revision::DELETED_COMMENT ); define( 'MW_REV_DELETED_USER', Revision::DELETED_USER ); define( 'MW_REV_DELETED_RESTRICTED', Revision::DELETED_RESTRICTED ); ?> Index: trunk/phase3/includes/SpecialExport.php =================================================================== --- trunk/phase3/includes/SpecialExport.php (revision 15100) +++ trunk/phase3/includes/SpecialExport.php (revision 15101) @@ -1,81 +1,106 @@ <?php # Copyright (C) 2003 Brion Vibber <brion@pobox.com> # http://www.mediawiki.org/ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # http://www.gnu.org/copyleft/gpl.html /** * * @package MediaWiki * @subpackage SpecialPage */ /** */ require_once( 'Export.php' ); /** * */ function wfSpecialExport( $page = '' ) { global $wgOut, $wgRequest, $wgExportAllowListContributors; - global $wgExportAllowHistory; + global $wgExportAllowHistory, $wgExportMaxHistory; + $curonly = true; if( $wgRequest->getVal( 'action' ) == 'submit') { $page = $wgRequest->getText( 'pages' ); - if( $wgExportAllowHistory ) { - $curonly = $wgRequest->getCheck( 'curonly' ); - } else { - $curonly = true; - } - } else { - # Pre-check the 'current version only' box in the UI + $curonly = $wgRequest->getCheck( 'curonly' ); + } + if( $wgRequest->getCheck( 'history' ) ) { + $curonly = false; + } + if( !$wgExportAllowHistory ) { + // Override $curonly = true; } $list_authors = $wgRequest->getCheck( 'listauthors' ); if ( !$curonly || !$wgExportAllowListContributors ) $list_authors = false ; if( $page != '' ) { $wgOut->disable(); + + // Cancel output buffering and gzipping if set + // This should provide safer streaming for pages with history + while( $status = ob_get_status() ) { + ob_end_clean(); + if( $status['name'] == 'ob_gzhandler' ) { + header( 'Content-Encoding:' ); + } + } header( "Content-type: application/xml; charset=utf-8" ); $pages = explode( "\n", $page ); $db =& wfGetDB( DB_SLAVE ); $history = $curonly ? MW_EXPORT_CURRENT : MW_EXPORT_FULL; $exporter = new WikiExporter( $db, $history ); $exporter->list_authors = $list_authors ; $exporter->openStream(); - $exporter->pagesByName( $pages ); + + foreach( $pages as $page ) { + if( $wgExportMaxHistory && !$curonly ) { + $title = Title::newFromText( $page ); + if( $title ) { + $count = Revision::countByTitle( $db, $title ); + if( $count > $wgExportMaxHistory ) { + wfDebug( __FUNCTION__ . + ": Skipped $page, $count revisions too big\n" ); + continue; + } + } + } + $exporter->pagesByName( $pages ); + } + $exporter->closeStream(); return; } $wgOut->addWikiText( wfMsg( "exporttext" ) ); $titleObj = Title::makeTitle( NS_SPECIAL, "Export" ); $form = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $titleObj->getLocalUrl() ) ); $form .= wfOpenElement( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ) ) . '</textarea><br />'; if( $wgExportAllowHistory ) { $form .= wfCheck( 'curonly', true, array( 'value' => 'true', 'id' => 'curonly' ) ); $form .= wfLabel( wfMsg( 'exportcuronly' ), 'curonly' ) . '<br />'; } else { $wgOut->addWikiText( wfMsg( 'exportnohistory' ) ); } $form .= wfHidden( 'action', 'submit' ); $form .= wfSubmitButton( wfMsg( 'export-submit' ) ) . '</form>'; $wgOut->addHtml( $form ); } ?> Index: trunk/phase3/includes/SpecialImport.php =================================================================== --- trunk/phase3/includes/SpecialImport.php (revision 15100) +++ trunk/phase3/includes/SpecialImport.php (revision 15101) @@ -1,728 +1,752 @@ <?php /** * MediaWiki page data importer * Copyright (C) 2003,2005 Brion Vibber <brion@pobox.com> * http://www.mediawiki.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html * * @package MediaWiki * @subpackage SpecialPage */ /** * Constructor */ function wfSpecialImport( $page = '' ) { global $wgUser, $wgOut, $wgRequest, $wgTitle, $wgImportSources; ### # $wgOut->addWikiText( "Special:Import is not ready for this beta release, sorry." ); # return; ### if( $wgRequest->wasPosted() && $wgRequest->getVal( 'action' ) == 'submit') { $isUpload = false; $interwiki = false; switch( $wgRequest->getVal( "source" ) ) { case "upload": $isUpload = true; if( $wgUser->isAllowed( 'importupload' ) ) { $source = ImportStreamSource::newFromUpload( "xmlimport" ); } else { return $wgOut->permissionRequired( 'importupload' ); } break; case "interwiki": - $interwiki = $wgRequest->getVal( "interwiki" ); + $interwiki = $wgRequest->getVal( 'interwiki' ); + $history = $wgRequest->getCheck( 'interwikiHistory' ); $source = ImportStreamSource::newFromInterwiki( $interwiki, - $wgRequest->getText( "frompage" ) ); + $wgRequest->getText( "frompage" ), + $history ); break; default: $source = new WikiError( "Unknown import source type" ); } if( WikiError::isError( $source ) ) { $wgOut->addWikiText( wfEscapeWikiText( $source->getMessage() ) ); } else { $wgOut->addWikiText( wfMsg( "importstart" ) ); $importer = new WikiImporter( $source ); $reporter = new ImportReporter( $importer, $isUpload, $interwiki ); $reporter->open(); $result = $importer->doImport(); $reporter->close(); if( WikiError::isError( $result ) ) { $wgOut->addWikiText( wfMsg( "importfailed", wfEscapeWikiText( $result->getMessage() ) ) ); } else { # Success! $wgOut->addWikiText( wfMsg( "importsuccess" ) ); } } } $action = $wgTitle->escapeLocalUrl( 'action=submit' ); if( $wgUser->isAllowed( 'importupload' ) ) { $wgOut->addWikiText( wfMsg( "importtext" ) ); $wgOut->addHTML( " <fieldset> <legend>" . wfMsgHtml('upload') . "</legend> <form enctype='multipart/form-data' method='post' action=\"$action\"> <input type='hidden' name='action' value='submit' /> <input type='hidden' name='source' value='upload' /> <input type='hidden' name='MAX_FILE_SIZE' value='2000000' /> <input type='file' name='xmlimport' value='' size='30' /> <input type='submit' value=\"" . wfMsgHtml( "uploadbtn" ) . "\" /> </form> </fieldset> " ); } else { if( empty( $wgImportSources ) ) { $wgOut->addWikiText( wfMsg( 'importnosources' ) ); } } if( !empty( $wgImportSources ) ) { $wgOut->addHTML( " <fieldset> <legend>" . wfMsgHtml('importinterwiki') . "</legend> - <form method='post' action=\"$action\"> + <form method='post' action=\"$action\">" . + $wgOut->parse( wfMsg( 'import-interwiki-text' ) ) . " <input type='hidden' name='action' value='submit' /> <input type='hidden' name='source' value='interwiki' /> - <select name='interwiki'> -" ); + <table> + <tr> + <td> + <select name='interwiki'>" ); foreach( $wgImportSources as $interwiki ) { $iw = htmlspecialchars( $interwiki ); $wgOut->addHTML( "<option value=\"$iw\">$iw</option>\n" ); } $wgOut->addHTML( " - </select> - <input name='frompage' /> - <input type='submit' /> + </select> + </td> + <td>" . + wfInput( 'frompage', 40 ) . + "</td> + </tr> + <tr> + <td></td> + <td>" . + wfCheckLabel( wfMsg( 'import-interwiki-history' ), + 'interwikiHistory', 'interwikiHistory', true ) . + "</td> + </tr> + <tr> + <td></td> + <td>" . + wfSubmitButton( wfMsg( 'import-interwiki-submit' ) ) . + "</td> + </tr> + </table> </form> </fieldset> " ); } } /** * Reporting callback */ class ImportReporter { function __construct( $importer, $upload, $interwiki ) { $importer->setPageCallback( array( $this, 'reportPage' ) ); $this->mPageCount = 0; $this->mIsUpload = $upload; $this->mInterwiki = $interwiki; } function open() { global $wgOut; $wgOut->addHtml( "<ul>\n" ); } function reportPage( $pageName ) { global $wgOut, $wgUser; $skin = $wgUser->getSkin(); $title = Title::newFromText( $pageName ); $this->mPageCount++; $wgOut->addHtml( "<li>" . $skin->makeKnownLinkObj( $title ) . "</li>\n" ); $log = new LogPage( 'import' ); if( $this->mIsUpload ) { $log->addEntry( 'upload', $title, '' ); } else { $interwiki = '[[:' . $this->mInterwiki . ':' . $title->getPrefixedText() . ']]'; $log->addEntry( 'interwiki', $title, wfMsg( 'import-logentry-interwiki-source', $interwiki ) ); } } function close() { global $wgOut; if( $this->mPageCount == 0 ) { $wgOut->addHtml( "<li>" . wfMsgHtml( 'importnopages' ) . "</li>\n" ); } $wgOut->addHtml( "</ul>\n" ); } } /** * * @package MediaWiki * @subpackage SpecialPage */ class WikiRevision { var $title = NULL; var $id = 0; var $timestamp = "20010115000000"; var $user = 0; var $user_text = ""; var $text = ""; var $comment = ""; var $minor = false; function setTitle( $text ) { $this->title = Title::newFromText( $text ); } function setID( $id ) { $this->id = $id; } function setTimestamp( $ts ) { # 2003-08-05T18:30:02Z $this->timestamp = wfTimestamp( TS_MW, $ts ); } function setUsername( $user ) { $this->user_text = $user; } function setUserIP( $ip ) { $this->user_text = $ip; } function setText( $text ) { $this->text = $text; } function setComment( $text ) { $this->comment = $text; } function setMinor( $minor ) { $this->minor = (bool)$minor; } function getTitle() { return $this->title; } function getID() { return $this->id; } function getTimestamp() { return $this->timestamp; } function getUser() { return $this->user_text; } function getText() { return $this->text; } function getComment() { return $this->comment; } function getMinor() { return $this->minor; } function importOldRevision() { $fname = "WikiImporter::importOldRevision"; $dbw =& wfGetDB( DB_MASTER ); # Sneak a single revision into place $user = User::newFromName( $this->getUser() ); if( $user ) { $userId = intval( $user->getId() ); $userText = $user->getName(); } else { $userId = 0; $userText = $this->getUser(); } // avoid memory leak...? $linkCache =& LinkCache::singleton(); $linkCache->clear(); $article = new Article( $this->title ); $pageId = $article->getId(); if( $pageId == 0 ) { # must create the page... $pageId = $article->insertOn( $dbw ); $created = true; } else { $created = false; } # FIXME: Check for exact conflicts # FIXME: Use original rev_id optionally # FIXME: blah blah blah #if( $numrows > 0 ) { # return wfMsg( "importhistoryconflict" ); #} # Insert the row $revision = new Revision( array( 'page' => $pageId, 'text' => $this->getText(), 'comment' => $this->getComment(), 'user' => $userId, 'user_text' => $userText, 'timestamp' => $this->timestamp, 'minor_edit' => $this->minor, ) ); $revId = $revision->insertOn( $dbw ); $changed = $article->updateIfNewerOn( $dbw, $revision ); if( $created ) { wfDebug( __METHOD__ . ": running onArticleCreate\n" ); Article::onArticleCreate( $this->title ); } else { if( $changed ) { wfDebug( __METHOD__ . ": running onArticleEdit\n" ); Article::onArticleEdit( $this->title ); } } if( $created || $changed ) { wfDebug( __METHOD__ . ": running edit updates\n" ); $article->editUpdates( $this->getText(), $this->getComment(), $this->minor, $this->timestamp, $revId ); } return true; } } /** * * @package MediaWiki * @subpackage SpecialPage */ class WikiImporter { var $mSource = null; var $mPageCallback = null; var $mRevisionCallback = null; var $lastfield; function WikiImporter( $source ) { $this->setRevisionCallback( array( &$this, "importRevision" ) ); $this->mSource = $source; } function throwXmlError( $err ) { $this->debug( "FAILURE: $err" ); wfDebug( "WikiImporter XML error: $err\n" ); } # -------------- function doImport() { if( empty( $this->mSource ) ) { return new WikiErrorMsg( "importnotext" ); } $parser = xml_parser_create( "UTF-8" ); # case folding violates XML standard, turn it off xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false ); xml_set_object( $parser, $this ); xml_set_element_handler( $parser, "in_start", "" ); $offset = 0; // for context extraction on error reporting do { $chunk = $this->mSource->readChunk(); if( !xml_parse( $parser, $chunk, $this->mSource->atEnd() ) ) { wfDebug( "WikiImporter::doImport encountered XML parsing error\n" ); return new WikiXmlError( $parser, 'XML import parse failure', $chunk, $offset ); } $offset += strlen( $chunk ); } while( $chunk !== false && !$this->mSource->atEnd() ); xml_parser_free( $parser ); return true; } function debug( $data ) { #wfDebug( "IMPORT: $data\n" ); } function notice( $data ) { global $wgCommandLineMode; if( $wgCommandLineMode ) { print "$data\n"; } else { global $wgOut; $wgOut->addHTML( "<li>$data</li>\n" ); } } /** * Sets the action to perform as each new page in the stream is reached. * @param callable $callback * @return callable */ function setPageCallback( $callback ) { $previous = $this->mPageCallback; $this->mPageCallback = $callback; return $previous; } /** * Sets the action to perform as each page revision is reached. * @param callable $callback * @return callable */ function setRevisionCallback( $callback ) { $previous = $this->mRevisionCallback; $this->mRevisionCallback = $callback; return $previous; } /** * Default per-revision callback, performs the import. * @param WikiRevision $revision * @private */ function importRevision( &$revision ) { $dbw =& wfGetDB( DB_MASTER ); $dbw->deadlockLoop( array( &$revision, 'importOldRevision' ) ); } /** * Alternate per-revision callback, for debugging. * @param WikiRevision $revision * @private */ function debugRevisionHandler( &$revision ) { $this->debug( "Got revision:" ); if( is_object( $revision->title ) ) { $this->debug( "-- Title: " . $revision->title->getPrefixedText() ); } else { $this->debug( "-- Title: <invalid>" ); } $this->debug( "-- User: " . $revision->user_text ); $this->debug( "-- Timestamp: " . $revision->timestamp ); $this->debug( "-- Comment: " . $revision->comment ); $this->debug( "-- Text: " . $revision->text ); } /** * Notify the callback function when a new <page> is reached. * @param Title $title * @private */ function pageCallback( $title ) { if( is_callable( $this->mPageCallback ) ) { call_user_func( $this->mPageCallback, $title ); } } # XML parser callbacks from here out -- beware! function donothing( $parser, $x, $y="" ) { #$this->debug( "donothing" ); } function in_start( $parser, $name, $attribs ) { $this->debug( "in_start $name" ); if( $name != "mediawiki" ) { return $this->throwXMLerror( "Expected <mediawiki>, got <$name>" ); } xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" ); } function in_mediawiki( $parser, $name, $attribs ) { $this->debug( "in_mediawiki $name" ); if( $name == 'siteinfo' ) { xml_set_element_handler( $parser, "in_siteinfo", "out_siteinfo" ); } elseif( $name == 'page' ) { xml_set_element_handler( $parser, "in_page", "out_page" ); } else { return $this->throwXMLerror( "Expected <page>, got <$name>" ); } } function out_mediawiki( $parser, $name ) { $this->debug( "out_mediawiki $name" ); if( $name != "mediawiki" ) { return $this->throwXMLerror( "Expected </mediawiki>, got </$name>" ); } xml_set_element_handler( $parser, "donothing", "donothing" ); } function in_siteinfo( $parser, $name, $attribs ) { // no-ops for now $this->debug( "in_siteinfo $name" ); switch( $name ) { case "sitename": case "base": case "generator": case "case": case "namespaces": case "namespace": break; default: return $this->throwXMLerror( "Element <$name> not allowed in <siteinfo>." ); } } function out_siteinfo( $parser, $name ) { if( $name == "siteinfo" ) { xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" ); } } function in_page( $parser, $name, $attribs ) { $this->debug( "in_page $name" ); switch( $name ) { case "id": case "title": case "restrictions": $this->appendfield = $name; $this->appenddata = ""; $this->parenttag = "page"; xml_set_element_handler( $parser, "in_nothing", "out_append" ); xml_set_character_data_handler( $parser, "char_append" ); break; case "revision": $this->workRevision = new WikiRevision; $this->workRevision->setTitle( $this->workTitle ); xml_set_element_handler( $parser, "in_revision", "out_revision" ); break; default: return $this->throwXMLerror( "Element <$name> not allowed in a <page>." ); } } function out_page( $parser, $name ) { $this->debug( "out_page $name" ); if( $name != "page" ) { return $this->throwXMLerror( "Expected </page>, got </$name>" ); } xml_set_element_handler( $parser, "in_mediawiki", "out_mediawiki" ); $this->workTitle = NULL; $this->workRevision = NULL; } function in_nothing( $parser, $name, $attribs ) { $this->debug( "in_nothing $name" ); return $this->throwXMLerror( "No child elements allowed here; got <$name>" ); } function char_append( $parser, $data ) { $this->debug( "char_append '$data'" ); $this->appenddata .= $data; } function out_append( $parser, $name ) { $this->debug( "out_append $name" ); if( $name != $this->appendfield ) { return $this->throwXMLerror( "Expected </{$this->appendfield}>, got </$name>" ); } xml_set_element_handler( $parser, "in_$this->parenttag", "out_$this->parenttag" ); xml_set_character_data_handler( $parser, "donothing" ); switch( $this->appendfield ) { case "title": $this->workTitle = $this->appenddata; $this->pageCallback( $this->workTitle ); break; case "id": if ( $this->parenttag == 'revision' ) { $this->workRevision->setID( $this->appenddata ); } break; case "text": $this->workRevision->setText( $this->appenddata ); break; case "username": $this->workRevision->setUsername( $this->appenddata ); break; case "ip": $this->workRevision->setUserIP( $this->appenddata ); break; case "timestamp": $this->workRevision->setTimestamp( $this->appenddata ); break; case "comment": $this->workRevision->setComment( $this->appenddata ); break; case "minor": $this->workRevision->setMinor( true ); break; default: $this->debug( "Bad append: {$this->appendfield}" ); } $this->appendfield = ""; $this->appenddata = ""; } function in_revision( $parser, $name, $attribs ) { $this->debug( "in_revision $name" ); switch( $name ) { case "id": case "timestamp": case "comment": case "minor": case "text": $this->parenttag = "revision"; $this->appendfield = $name; xml_set_element_handler( $parser, "in_nothing", "out_append" ); xml_set_character_data_handler( $parser, "char_append" ); break; case "contributor": xml_set_element_handler( $parser, "in_contributor", "out_contributor" ); break; default: return $this->throwXMLerror( "Element <$name> not allowed in a <revision>." ); } } function out_revision( $parser, $name ) { $this->debug( "out_revision $name" ); if( $name != "revision" ) { return $this->throwXMLerror( "Expected </revision>, got </$name>" ); } xml_set_element_handler( $parser, "in_page", "out_page" ); $out = call_user_func_array( $this->mRevisionCallback, array( &$this->workRevision, &$this ) ); if( !empty( $out ) ) { global $wgOut; $wgOut->addHTML( "<li>" . $out . "</li>\n" ); } } function in_contributor( $parser, $name, $attribs ) { $this->debug( "in_contributor $name" ); switch( $name ) { case "username": case "ip": case "id": $this->parenttag = "contributor"; $this->appendfield = $name; xml_set_element_handler( $parser, "in_nothing", "out_append" ); xml_set_character_data_handler( $parser, "char_append" ); break; default: $this->throwXMLerror( "Invalid tag <$name> in <contributor>" ); } } function out_contributor( $parser, $name ) { $this->debug( "out_contributor $name" ); if( $name != "contributor" ) { return $this->throwXMLerror( "Expected </contributor>, got </$name>" ); } xml_set_element_handler( $parser, "in_revision", "out_revision" ); } } /** @package MediaWiki */ class ImportStringSource { function ImportStringSource( $string ) { $this->mString = $string; $this->mRead = false; } function atEnd() { return $this->mRead; } function readChunk() { if( $this->atEnd() ) { return false; } else { $this->mRead = true; return $this->mString; } } } /** @package MediaWiki */ class ImportStreamSource { function ImportStreamSource( $handle ) { $this->mHandle = $handle; } function atEnd() { return feof( $this->mHandle ); } function readChunk() { return fread( $this->mHandle, 32768 ); } function newFromFile( $filename ) { $file = @fopen( $filename, 'rt' ); if( !$file ) { return new WikiError( "Couldn't open import file" ); } return new ImportStreamSource( $file ); } function newFromUpload( $fieldname = "xmlimport" ) { $upload =& $_FILES[$fieldname]; if( !isset( $upload ) || !$upload['name'] ) { return new WikiErrorMsg( 'importnofile' ); } if( !empty( $upload['error'] ) ) { return new WikiErrorMsg( 'importuploaderror', $upload['error'] ); } $fname = $upload['tmp_name']; if( is_uploaded_file( $fname ) ) { return ImportStreamSource::newFromFile( $fname ); } else { return new WikiErrorMsg( 'importnofile' ); } } function newFromURL( $url ) { + wfDebug( __METHOD__ . ": opening $url\n" ); # fopen-wrappers are normally turned off for security. ini_set( "allow_url_fopen", true ); $ret = ImportStreamSource::newFromFile( $url ); ini_set( "allow_url_fopen", false ); return $ret; } - function newFromInterwiki( $interwiki, $page ) { + function newFromInterwiki( $interwiki, $page, $history=false ) { $base = Title::getInterwikiLink( $interwiki ); - if( empty( $base ) ) { + $link = Title::newFromText( "$interwiki:Special:Export/$page" ); + if( empty( $base ) || empty( $link ) ) { return new WikiError( 'Bad interwiki link' ); } else { - $import = wfUrlencode( "Special:Export/$page" ); - $url = str_replace( "$1", $import, $base ); + $params = $history ? 'history=1' : ''; + $url = $link->getFullUrl( $params ); return ImportStreamSource::newFromURL( $url ); } } } ?> Index: trunk/phase3/languages/Messages.php =================================================================== --- trunk/phase3/languages/Messages.php (revision 15100) +++ trunk/phase3/languages/Messages.php (revision 15101) @@ -1,2050 +1,2055 @@ <?php #------------------------------------------------------------------- # Default messages #------------------------------------------------------------------- # Allowed characters in keys are: A-Z, a-z, 0-9, underscore (_) and # hyphen (-). If you need more characters, you may be able to change # the regex in MagicWord::initRegex global $wgAllMessagesEn; $wgAllMessagesEn = array( /* The sidebar for MonoBook is generated from this message, lines that do not begin with * or ** are discarded, furthermore lines that do begin with ** and do not contain | are also discarded, but don't depend on this behaviour for future releases. Also note that since each list value is wrapped in a unique XHTML id it should only appear once and include characters that are legal XHTML id names. Note to translators: Do not include this message in the language files you submit for inclusion in MediaWiki, it should always be inherited from the parent class in order maintain consistency across languages. */ 'sidebar' => ' * navigation ** mainpage|mainpage ** portal-url|portal ** currentevents-url|currentevents ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help ** sitesupport-url|sitesupport', # User preference toggles 'tog-underline' => 'Underline links:', 'tog-highlightbroken' => 'Format broken links <a href="" class="new">like this</a> (alternative: like this<a href="" class="internal">?</a>).', 'tog-justify' => 'Justify paragraphs', 'tog-hideminor' => 'Hide minor edits in recent changes', 'tog-extendwatchlist' => 'Expand watchlist to show all applicable changes', 'tog-usenewrc' => 'Enhanced recent changes (JavaScript)', 'tog-numberheadings' => 'Auto-number headings', 'tog-showtoolbar' => 'Show edit toolbar (JavaScript)', 'tog-editondblclick' => 'Edit pages on double click (JavaScript)', 'tog-editsection' => 'Enable section editing via [edit] links', 'tog-editsectiononrightclick' => 'Enable section editing by right clicking<br /> on section titles (JavaScript)', 'tog-showtoc' => 'Show table of contents (for pages with more than 3 headings)', 'tog-rememberpassword' => 'Remember across sessions', 'tog-editwidth' => 'Edit box has full width', 'tog-watchcreations' => 'Add pages I create to my watchlist', 'tog-watchdefault' => 'Add pages I edit to my watchlist', 'tog-minordefault' => 'Mark all edits minor by default', 'tog-previewontop' => 'Show preview before edit box', 'tog-previewonfirst' => 'Show preview on first edit', 'tog-nocache' => 'Disable page caching', 'tog-enotifwatchlistpages' => 'E-mail me when a page I\'m watching is changed', 'tog-enotifusertalkpages' => 'E-mail me when my user talk page is changed', 'tog-enotifminoredits' => 'E-mail me also for minor edits of pages', 'tog-enotifrevealaddr' => 'Reveal my e-mail address in notification mails', 'tog-shownumberswatching' => 'Show the number of watching users', 'tog-fancysig' => 'Raw signatures (without automatic link)', 'tog-externaleditor' => 'Use external editor by default', 'tog-externaldiff' => 'Use external diff by default', 'tog-showjumplinks' => 'Enable "jump to" accessibility links', 'tog-uselivepreview' => 'Use live preview (JavaScript) (Experimental)', 'tog-autopatrol' => 'Mark edits I make as patrolled', 'tog-forceeditsummary' => 'Prompt me when entering a blank edit summary', 'tog-watchlisthideown' => 'Hide my edits from the watchlist', 'tog-watchlisthidebots' => 'Hide bot edits from the watchlist', 'underline-always' => 'Always', 'underline-never' => 'Never', 'underline-default' => 'Browser default', 'skinpreview' => '(Preview)', # dates 'sunday' => 'Sunday', 'monday' => 'Monday', 'tuesday' => 'Tuesday', 'wednesday' => 'Wednesday', 'thursday' => 'Thursday', 'friday' => 'Friday', 'saturday' => 'Saturday', 'january' => 'January', 'february' => 'February', 'march' => 'March', 'april' => 'April', 'may_long' => 'May', 'june' => 'June', 'july' => 'July', 'august' => 'August', 'september' => 'September', 'october' => 'October', 'november' => 'November', 'december' => 'December', 'jan' => 'Jan', 'feb' => 'Feb', 'mar' => 'Mar', 'apr' => 'Apr', 'may' => 'May', 'jun' => 'Jun', 'jul' => 'Jul', 'aug' => 'Aug', 'sep' => 'Sep', 'oct' => 'Oct', 'nov' => 'Nov', 'dec' => 'Dec', # Bits of text used by many pages: # 'categories' => '{{PLURAL:$1|Category|Categories}}', 'category' => 'category', 'category_header' => 'Articles in category "$1"', 'subcategories' => 'Subcategories', 'linktrail' => '/^([a-z]+)(.*)$/sD', 'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD', 'mainpage' => 'Main Page', 'mainpagetext' => "<big>'''MediaWiki has been successfully installed.'''</big>", 'mainpagedocfooter' => "Consult the [http://meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software. == Getting started == * [http://www.mediawiki.org/wiki/Help:Configuration_settings Configuration settings list] * [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ] * [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", 'portal' => 'Community portal', 'portal-url' => 'Project:Community Portal', 'about' => 'About', 'aboutsite' => 'About {{SITENAME}}', 'aboutpage' => 'Project:About', 'article' => 'Content page', 'help' => 'Help', 'helppage' => 'Help:Contents', 'bugreports' => 'Bug reports', 'bugreportspage' => 'Project:Bug_reports', 'sitesupport' => 'Donations', 'sitesupport-url' => 'Project:Site support', 'faq' => 'FAQ', 'faqpage' => 'Project:FAQ', 'edithelp' => 'Editing help', 'newwindow' => '(opens in new window)', 'edithelppage' => 'Help:Editing', 'cancel' => 'Cancel', 'qbfind' => 'Find', 'qbbrowse' => 'Browse', 'qbedit' => 'Edit', 'qbpageoptions' => 'This page', 'qbpageinfo' => 'Context', 'qbmyoptions' => 'My pages', 'qbspecialpages' => 'Special pages', 'moredotdotdot' => 'More...', 'mypage' => 'My page', 'mytalk' => 'My talk', 'anontalk' => 'Talk for this IP', 'navigation' => 'Navigation', # Metadata in edit box 'metadata_help' => 'Metadata (see [[{{ns:project}}:Metadata]] for an explanation):', 'currentevents' => 'Current events', 'currentevents-url' => 'Current events', 'disclaimers' => 'Disclaimers', 'disclaimerpage' => 'Project:General_disclaimer', 'privacy' => 'Privacy policy', 'privacypage' => 'Project:Privacy_policy', 'errorpagetitle' => 'Error', 'returnto' => 'Return to $1.', 'tagline' => 'From {{SITENAME}}', 'help' => 'Help', 'search' => 'Search', 'go' => 'Go', 'history' => 'Page history', 'history_short' => 'History', 'updatedmarker' => 'updated since my last visit', 'info_short' => 'Information', 'printableversion' => 'Printable version', 'permalink' => 'Permanent link', 'print' => 'Print', 'edit' => 'Edit', 'editthispage' => 'Edit this page', 'delete' => 'Delete', 'deletethispage' => 'Delete this page', 'undelete_short' => 'Undelete {{PLURAL:$1|one edit|$1 edits}}', 'protect' => 'Protect', 'protectthispage' => 'Protect this page', 'unprotect' => 'unprotect', 'unprotectthispage' => 'Unprotect this page', 'newpage' => 'New page', 'talkpage' => 'Discuss this page', 'specialpage' => 'Special Page', 'personaltools' => 'Personal tools', 'postcomment' => 'Post a comment', 'addsection' => '+', 'articlepage' => 'View content page', 'subjectpage' => 'View subject', # For compatibility 'talk' => 'Discussion', 'views' => 'Views', 'toolbox' => 'Toolbox', 'userpage' => 'View user page', 'projectpage' => 'View project page', 'imagepage' => 'View image page', 'viewtalkpage' => 'View discussion', 'otherlanguages' => 'In other languages', 'redirectedfrom' => '(Redirected from $1)', 'autoredircomment' => 'Redirecting to [[$1]]', 'redirectpagesub' => 'Redirect page', 'lastmodified' => 'This page was last modified $1.', 'viewcount' => 'This page has been accessed {{plural:$1|one time|$1 times}}.', 'copyright' => 'Content is available under $1.', 'protectedpage' => 'Protected page', 'administrators' => '{{ns:project}}:Administrators', 'jumpto' => 'Jump to:', 'jumptonavigation' => 'navigation', 'jumptosearch' => 'search', 'sysoptitle' => 'Sysop access required', 'sysoptext' => 'The action you have requested can only be performed by users with "sysop" capability. See $1.', 'developertitle' => 'Developer access required', 'developertext' => 'The action you have requested can only be performed by users with "developer" capability. See $1.', 'badaccess' => 'Permission error', 'badaccesstext' => 'The action you have requested is limited to users with the "$2" permission assigned. See $1.', 'versionrequired' => 'Version $1 of MediaWiki required', 'versionrequiredtext' => 'Version $1 of MediaWiki is required to use this page. See [[Special:Version]]', 'widthheight' => '$1×$2', 'ok' => 'OK', 'sitetitle' => '{{SITENAME}}', 'pagetitle' => '$1 - {{SITENAME}}', 'sitesubtitle' => '', 'retrievedfrom' => 'Retrieved from "$1"', 'youhavenewmessages' => 'You have $1 ($2).', 'newmessageslink' => 'new messages', 'newmessagesdifflink' => 'diff to penultimate revision', 'editsection'=>'edit', 'editold'=>'edit', 'editsectionhint' => 'Edit section: $1', 'toc' => 'Contents', 'showtoc' => 'show', 'hidetoc' => 'hide', 'thisisdeleted' => 'View or restore $1?', 'viewdeleted' => 'View $1?', 'restorelink' => '{{PLURAL:$1|one deleted edit|$1 deleted edits}}', 'feedlinks' => 'Feed:', 'feed-invalid' => 'Invalid subscription feed type.', 'sitenotice' => '-', # the equivalent to wgSiteNotice 'anonnotice' => '-', # Short words for each namespace, by default used in the 'article' tab in monobook 'nstab-main' => 'Article', 'nstab-user' => 'User page', 'nstab-media' => 'Media page', 'nstab-special' => 'Special', 'nstab-project' => 'Project page', 'nstab-image' => 'File', 'nstab-mediawiki' => 'Message', 'nstab-template' => 'Template', 'nstab-help' => 'Help', 'nstab-category' => 'Category', # Main script and global functions # 'nosuchaction' => 'No such action', 'nosuchactiontext' => 'The action specified by the URL is not recognized by the wiki', 'nosuchspecialpage' => 'No such special page', 'nospecialpagetext' => 'You have requested an invalid special page, a list of valid special pages may be found at [[{{ns:special}}:Specialpages]].', # General errors # 'error' => 'Error', 'databaseerror' => 'Database error', 'dberrortext' => 'A database query syntax error has occurred. This may indicate a bug in the software. The last attempted database query was: <blockquote><tt>$1</tt></blockquote> from within function "<tt>$2</tt>". MySQL returned error "<tt>$3: $4</tt>".', 'dberrortextcl' => 'A database query syntax error has occurred. The last attempted database query was: "$1" from within function "$2". MySQL returned error "$3: $4"', 'noconnect' => 'Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server. <br /> $1', 'nodb' => 'Could not select database $1', 'cachederror' => 'The following is a cached copy of the requested page, and may not be up to date.', 'laggedslavemode' => 'Warning: Page may not contain recent updates.', 'readonly' => 'Database locked', 'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released', 'readonlytext' => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal. The administrator who locked it offered this explanation: $1', 'missingarticle' => 'The database did not find the text of a page that it should have found, named "$1". This is usually caused by following an outdated diff or history link to a page that has been deleted. If this is not the case, you may have found a bug in the software. Please report this to an administrator, making note of the URL.', 'readonly_lag' => 'The database has been automatically locked while the slave database servers catch up to the master', 'internalerror' => 'Internal error', 'filecopyerror' => 'Could not copy file "$1" to "$2".', 'filerenameerror' => 'Could not rename file "$1" to "$2".', 'filedeleteerror' => 'Could not delete file "$1".', 'filenotfound' => 'Could not find file "$1".', 'unexpected' => 'Unexpected value: "$1"="$2".', 'formerror' => 'Error: could not submit form', 'badarticleerror' => 'This action cannot be performed on this page.', 'cannotdelete' => 'Could not delete the page or file specified. (It may have already been deleted by someone else.)', 'badtitle' => 'Bad title', 'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one more characters which cannot be used in titles.', 'perfdisabled' => 'Sorry! This feature has been temporarily disabled because it slows the database down to the point that no one can use the wiki.', 'perfdisabledsub' => 'Here is a saved copy from $1:', # obsolete? 'perfcached' => 'The following data is cached and may not be up to date.', 'perfcachedts' => 'The following data is cached, and was last updated $1.', 'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br /> Function: $1<br /> Query: $2', 'viewsource' => 'View source', 'viewsourcefor' => 'for $1', 'protectedtext' => 'This page has been locked to prevent editing; there are a number of reasons why this may be so, please see [[{{ns:project}}:Protected page]]. You can view and copy the source of this page:', 'protectedinterface' => 'This page provides interface text for the software, and is locked to prevent abuse.', 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software. Changes to this page will affect the appearance of the user interface for other users.", 'sqlhidden' => '(SQL query hidden)', # Login and logout pages # 'logouttitle' => 'User logout', 'logouttext' => '<strong>You are now logged out.</strong><br /> You can continue to use {{SITENAME}} anonymously, or you can log in again as the same or as a different user. Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.', 'welcomecreation' => "== Welcome, $1! == Your account has been created. Don't forget to change your {{SITENAME}} preferences.", 'loginpagetitle' => 'User login', 'yourname' => 'Username', 'yourpassword' => 'Password', 'yourpasswordagain' => 'Retype password', 'remembermypassword' => 'Remember me', 'yourdomainname' => 'Your domain', 'externaldberror' => 'There was either an external authentication database error or you are not allowed to update your external account.', 'loginproblem' => '<b>There has been a problem with your login.</b><br />Try again!', 'alreadyloggedin' => "<strong>User $1, you are already logged in!</strong><br />", 'login' => 'Log in', 'loginprompt' => 'You must have cookies enabled to log in to {{SITENAME}}.', 'userlogin' => 'Log in / create account', 'logout' => 'Log out', 'userlogout' => 'Log out', 'notloggedin' => 'Not logged in', 'nologin' => 'Don\'t have a login? $1.', 'nologinlink' => 'Create an account', 'createaccount' => 'Create account', 'gotaccount' => 'Already have an account? $1.', 'gotaccountlink' => 'Log in', 'createaccountmail' => 'by e-mail', 'badretype' => 'The passwords you entered do not match.', 'userexists' => 'Username entered already in use. Please choose a different name.', 'youremail' => 'E-mail *', 'username' => 'Username:', 'uid' => 'User ID:', 'yourrealname' => 'Real name *', 'yourlanguage' => 'Language:', 'yourvariant' => 'Variant', 'yournick' => 'Nickname:', 'badsig' => 'Invalid raw signature; check HTML tags.', 'email' => 'E-mail', 'prefs-help-email-enotif' => 'This address is also used to send you e-mail notifications if you enabled the options.', 'prefs-help-realname' => '* Real name (optional): if you choose to provide it this will be used for giving you attribution for your work.', 'loginerror' => 'Login error', 'prefs-help-email' => '* E-mail (optional): Enables others to contact you through your user or user_talk page without needing to reveal your identity.', 'nocookiesnew' => 'The user account was created, but you are not logged in. {{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.', 'nocookieslogin' => '{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them and try again.', 'noname' => 'You have not specified a valid user name.', 'loginsuccesstitle' => 'Login successful', 'loginsuccess' => "'''You are now logged in to {{SITENAME}} as \"$1\".'''", 'nosuchuser' => 'There is no user by the name "$1". Check your spelling, or create a new account.', 'nosuchusershort' => 'There is no user by the name "$1". Check your spelling.', 'nouserspecified' => 'You have to specify a username.', 'wrongpassword' => 'Incorrect password entered. Please try again.', 'wrongpasswordempty' => 'Password entered was blank. Please try again.', 'mailmypassword' => 'E-mail password', 'passwordremindertitle' => 'Password reminder from {{SITENAME}}', 'passwordremindertext' => 'Someone (probably you, from IP address $1) requested that we send you a new password for {{SITENAME}} ($4). The password for user "$2" is now "$3". You should log in and change your password now. If someone else made this request or if you have remembered your password and you no longer wish to change it, you may ignore this message and continue using your old password.', 'noemail' => 'There is no e-mail address recorded for user "$1".', 'passwordsent' => 'A new password has been sent to the e-mail address registered for "$1". Please log in again after you receive it.', 'eauthentsent' => 'A confirmation e-mail has been sent to the nominated e-mail address. Before any other mail is sent to the account, you will have to follow the instructions in the e-mail, to confirm that the account is actually yours.', 'loginend' => '', 'signupend' => '{{int:loginend}}', 'mailerror' => 'Error sending mail: $1', 'acct_creation_throttle_hit' => 'Sorry, you have already created $1 accounts. You can\'t make any more.', 'emailauthenticated' => 'Your e-mail address was authenticated on $1.', 'emailnotauthenticated' => 'Your e-mail address is <strong>not yet authenticated</strong>. No e-mail will be sent for any of the following features.', 'noemailprefs' => 'Specify an e-mail address for these features to work.', 'emailconfirmlink' => 'Confirm your e-mail address', 'invalidemailaddress' => 'The e-mail address cannot be accepted as it appears to have an invalid format. Please enter a well-formatted address or empty that field.', 'accountcreated' => 'Account created', 'accountcreatedtext' => 'The user account for $1 has been created.', # Edit page toolbar 'bold_sample'=>'Bold text', 'bold_tip'=>'Bold text', 'italic_sample'=>'Italic text', 'italic_tip'=>'Italic text', 'link_sample'=>'Link title', 'link_tip'=>'Internal link', 'extlink_sample'=>'http://www.example.com link title', 'extlink_tip'=>'External link (remember http:// prefix)', 'headline_sample'=>'Headline text', 'headline_tip'=>'Level 2 headline', 'math_sample'=>'Insert formula here', 'math_tip'=>'Mathematical formula (LaTeX)', 'nowiki_sample'=>'Insert non-formatted text here', 'nowiki_tip'=>'Ignore wiki formatting', 'image_sample'=>'Example.jpg', 'image_tip'=>'Embedded image', 'media_sample'=>'Example.ogg', 'media_tip'=>'Media file link', 'sig_tip'=>'Your signature with timestamp', 'hr_tip'=>'Horizontal line (use sparingly)', # Edit pages # 'summary' => 'Summary', 'subject' => 'Subject/headline', 'minoredit' => 'This is a minor edit', 'watchthis' => 'Watch this page', 'savearticle' => 'Save page', 'preview' => 'Preview', 'showpreview' => 'Show preview', 'showlivepreview' => 'Live preview', 'showdiff' => 'Show changes', 'anoneditwarning' => "'''Warning:''' You are not logged in. Your IP address will be recorded in this page's edit history.", 'missingsummary' => "'''Reminder:''' You have not provided an edit summary. If you click Save again, your edit will be saved without one.", 'missingcommenttext' => 'Please enter a comment below.', 'blockedtitle' => 'User is blocked', 'blockedtext' => 'Your user name or IP address has been blocked by $1. The reason given is this:<br />\'\'$2\'\'<br />You may contact $1 or one of the other [[{{ns:project}}:Administrators|administrators]] to discuss the block. Note that you may not use the "e-mail this user" feature unless you have a valid e-mail address registered in your [[Special:Preferences|user preferences]]. Your IP address is $3. Please include this address in any queries you make.', 'blockedoriginalsource' => "The source of '''$1''' is shown below:", 'blockededitsource' => "The text of '''your edits''' to '''$1''' is shown below:", 'whitelistedittitle' => 'Login required to edit', 'whitelistedittext' => 'You have to $1 to edit pages.', 'whitelistreadtitle' => 'Login required to read', 'whitelistreadtext' => 'You have to [[Special:Userlogin|login]] to read pages.', 'whitelistacctitle' => 'You are not allowed to create an account', 'whitelistacctext' => 'To be allowed to create accounts in this Wiki you have to [[Special:Userlogin|log]] in and have the appropriate permissions.', 'confirmedittitle' => 'E-mail confirmation required to edit', 'confirmedittext' => 'You must confirm your e-mail address before editing pages. Please set and validate your e-mail address through your [[Special:Preferences|user preferences]].', 'loginreqtitle' => 'Login Required', 'loginreqlink' => 'log in', 'loginreqpagetext' => 'You must $1 to view other pages.', 'accmailtitle' => 'Password sent.', 'accmailtext' => 'The password for "$1" has been sent to $2.', 'newarticle' => '(New)', 'newarticletext' => "You've followed a link to a page that doesn't exist yet. To create the page, start typing in the box below (see the [[{{ns:help}}:Contents|help page]] for more info). If you are here by mistake, just click your browser's '''back''' button.", 'newarticletextanon' => '{{int:newarticletext}}', 'talkpagetext' => '<!-- MediaWiki:talkpagetext -->', 'anontalkpagetext' => "----''This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical IP address to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:Userlogin|create an account or log in]] to avoid future confusion with other anonymous users.''", 'noarticletext' => 'There is currently no text in this page, you can [[{{ns:special}}:Search/{{PAGENAME}}|search for this page title]] in other pages or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page].', 'noarticletextanon' => '{{int:noarticletext}}', 'clearyourcache' => "'''Note:''' After saving, you may have to bypass your browser's cache to see the changes. '''Mozilla / Firefox / Safari:''' hold down ''Shift'' while clicking ''Reload'', or press ''Ctrl-Shift-R'' (''Cmd-Shift-R'' on Apple Mac); '''IE:''' hold ''Ctrl'' while clicking ''Refresh'', or press ''Ctrl-F5''; '''Konqueror:''': simply click the ''Reload'' button, or press ''F5''; '''Opera''' users may need to completely clear their cache in ''Tools→Preferences''.", 'usercssjsyoucanpreview' => '<strong>Tip:</strong> Use the \'Show preview\' button to test your new CSS/JS before saving.', 'usercsspreview' => '\'\'\'Remember that you are only previewing your user CSS, it has not yet been saved!\'\'\'', 'userjspreview' => '\'\'\'Remember that you are only testing/previewing your user JavaScript, it has not yet been saved!\'\'\'', 'userinvalidcssjstitle' => "'''Warning:''' There is no skin \"$1\". Remember that custom .css and .js pages use a lowercase title, e.g. User:Foo/monobook.css as opposed to User:Foo/Monobook.css.", 'updated' => '(Updated)', 'note' => '<strong>Note:</strong>', 'previewnote' => '<strong>This is only a preview; changes have not yet been saved!</strong>', 'session_fail_preview' => '<strong>Sorry! We could not process your edit due to a loss of session data. Please try again. If it still doesn\'t work, try logging out and logging back in.</strong>', 'previewconflict' => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.', 'session_fail_preview_html' => '<strong>Sorry! We could not process your edit due to a loss of session data.</strong> \'\'Because this wiki has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.\'\' <strong>If this is a legitimate edit attempt, please try again. If it still doesn\'t work, try logging out and logging back in.</strong>', 'importing' => 'Importing $1', 'editing' => 'Editing $1', 'editingsection' => 'Editing $1 (section)', 'editingcomment' => 'Editing $1 (comment)', 'editconflict' => 'Edit conflict: $1', 'explainconflict' => 'Someone else has changed this page since you started editing it. The upper text area contains the page text as it currently exists. Your changes are shown in the lower text area. You will have to merge your changes into the existing text. <b>Only</b> the text in the upper text area will be saved when you press "Save page".<br />', 'yourtext' => 'Your text', 'storedversion' => 'Stored version', 'nonunicodebrowser' => "<strong>WARNING: Your browser is not unicode compliant. A workaround is in place to allow you to safely edit articles: non-ASCII characters will appear in the edit box as hexadecimal codes.</strong>", 'editingold' => "<strong>WARNING: You are editing an out-of-date revision of this page. If you save it, any changes made since this revision will be lost.</strong>", 'yourdiff' => 'Differences', 'copyrightwarning' => 'Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details). If you don\'t want your writing to be edited mercilessly and redistributed at will, then don\'t submit it here.<br /> You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. <strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>', 'copyrightwarning2' => 'Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors. If you don\'t want your writing to be edited mercilessly, then don\'t submit it here.<br /> You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details). <strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>', 'longpagewarning' => "<strong>WARNING: This page is $1 kilobytes long; some browsers may have problems editing pages approaching or longer than 32kb. Please consider breaking the page into smaller sections.</strong>", 'longpageerror' => "<strong>ERROR: The text you have submitted is $1 kilobytes long, which is longer than the maximum of $2 kilobytes. It cannot be saved.</strong>", 'readonlywarning' => '<strong>WARNING: The database has been locked for maintenance, so you will not be able to save your edits right now. You may wish to cut-n-paste the text into a text file and save it for later.</strong>', 'protectedpagewarning' => "<strong>WARNING: This page has been locked so that only users with sysop privileges can edit it. Be sure you are following the [[{{ns:project}}:Protected page guidelines|protected page guidelines]].</strong>", 'semiprotectedpagewarning' => "'''Note:''' This page has been locked so that only registered users can edit it.", 'templatesused' => 'Templates used on this page:', 'edittools' => '<!-- Text here will be shown below edit and upload forms. -->', 'nocreatetitle' => 'Page creation limited', 'nocreatetext' => 'This site has restricted the ability to create new pages. You can go back and edit an existing page, or [[Special:Userlogin|log in or create an account]].', # History pages # 'revhistory' => 'Revision history', 'nohistory' => 'There is no edit history for this page.', 'revnotfound' => 'Revision not found', 'revnotfoundtext' => "The old revision of the page you asked for could not be found. Please check the URL you used to access this page.", 'loadhist' => 'Loading page history', 'currentrev' => 'Current revision', 'revisionasof' => 'Revision as of $1', 'oldrevisionnavigation' => 'Revision as of $1; $5<br />$3 | $2 | $4', 'previousrevision' => '←Older revision', 'nextrevision' => 'Newer revision→', 'currentrevisionlink' => 'Current revision', 'cur' => 'cur', 'next' => 'next', 'last' => 'last', 'orig' => 'orig', 'histlegend' => 'Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.<br /> Legend: (cur) = difference with current version, (last) = difference with preceding version, M = minor edit.', 'history_copyright' => '-', 'deletedrev' => '[deleted]', 'histfirst' => 'Earliest', 'histlast' => 'Latest', 'rev-deleted-comment' => '(comment removed)', 'rev-deleted-user' => '(username removed)', 'rev-deleted-text-permission' => '<div class="mw-warning plainlinks"> This page revision has been removed from the public archives. There may be details in the [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} deletion log]. </div>', 'rev-deleted-text-view' => '<div class="mw-warning plainlinks"> This page revision has been removed from the public archives. As an administrator on this site you can view it; there may be details in the [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} deletion log]. </div>', #'rev-delundel' => 'del/undel', 'rev-delundel' => 'show/hide', 'history-feed-title' => 'Revision history', 'history-feed-description' => 'Revision history for this page on the wiki', 'history-feed-item-nocomment' => '$1 at $2', # user at time 'history-feed-empty' => 'The requested page doesn\'t exist. It may have been deleted from the wiki, or renamed. Try [[Special:Search|searching on the wiki]] for relevant new pages.', # Revision deletion # 'revisiondelete' => 'Delete/undelete revisions', 'revdelete-selected' => 'Selected revision of [[:$1]]:', 'revdelete-text' => "Deleted revisions will still appear in the page history, but their text contents will be inaccessible to the public. Other admins on this wiki will still be able to access the hidden content and can undelete it again through this same interface, unless an additional restriction is placed by the site operators.", 'revdelete-legend' => 'Set revision restrictions:', 'revdelete-hide-text' => 'Hide revision text', 'revdelete-hide-comment' => 'Hide edit comment', 'revdelete-hide-user' => 'Hide editor\'s username/IP', 'revdelete-hide-restricted' => 'Apply these restrictions to sysops as well as others', 'revdelete-log' => 'Log comment:', 'revdelete-submit' => 'Apply to selected revision', 'revdelete-logentry' => 'changed revision visibility for [[$1]]', # Diffs # 'difference' => '(Difference between revisions)', 'loadingrev' => 'loading revision for diff', 'lineno' => "Line $1:", 'editcurrent' => 'Edit the current version of this page', 'selectnewerversionfordiff' => 'Select a newer version for comparison', 'selectolderversionfordiff' => 'Select an older version for comparison', 'compareselectedversions' => 'Compare selected versions', # Search results # 'searchresults' => 'Search results', 'searchresulttext' => "For more information about searching {{SITENAME}}, see [[{{ns:project}}:Searching|Searching {{SITENAME}}]].", 'searchquery' => "For query \"$1\"", 'badquery' => 'Badly formed search query', 'badquerytext' => 'We could not process your query. This is probably because you have attempted to search for a word fewer than three letters long, which is not yet supported. It could also be that you have mistyped the expression, for example "fish and and scales". Please try another query.', 'matchtotals' => "The query \"$1\" matched $2 page titles and the text of $3 pages.", 'noexactmatch' => "'''There is no page titled \"$1\".''' You can [[:$1|create this page]].", 'titlematches' => 'Article title matches', 'notitlematches' => 'No page title matches', 'textmatches' => 'Page text matches', 'notextmatches' => 'No page text matches', 'prevn' => "previous $1", 'nextn' => "next $1", 'viewprevnext' => "View ($1) ($2) ($3).", 'showingresults' => "Showing below up to <b>$1</b> results starting with #<b>$2</b>.", 'showingresultsnum' => "Showing below <b>$3</b> results starting with #<b>$2</b>.", 'nonefound' => "'''Note''': unsuccessful searches are often caused by searching for common words like \"have\" and \"from\", which are not indexed, or by specifying more than one search term (only pages containing all of the search terms will appear in the result).", 'powersearch' => 'Search', 'powersearchtext' => "Search in namespaces:<br />$1<br />$2 List redirects<br />Search for $3 $9", 'searchdisabled' => '{{SITENAME}} search is disabled. You can search via Google in the meantime. Note that their indexes of {{SITENAME}} content may be out of date.', 'googlesearch' => ' <form method="get" action="http://www.google.com/search" id="googlesearch"> <input type="hidden" name="domains" value="{{SERVER}}" /> <input type="hidden" name="num" value="50" /> <input type="hidden" name="ie" value="$2" /> <input type="hidden" name="oe" value="$2" /> <input type="text" name="q" size="31" maxlength="255" value="$1" /> <input type="submit" name="btnG" value="$3" /> <div> <input type="radio" name="sitesearch" id="gwiki" value="{{SERVER}}" checked="checked" /><label for="gwiki">{{SITENAME}}</label> <input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label> </div> </form>', 'blanknamespace' => '(Main)', # Preferences page # 'preferences' => 'Preferences', 'prefsnologin' => 'Not logged in', 'prefsnologintext' => "You must be [[Special:Userlogin|logged in]] to set user preferences.", 'prefsreset' => 'Preferences have been reset from storage.', 'qbsettings' => 'Quickbar', 'changepassword' => 'Change password', 'skin' => 'Skin', 'math' => 'Math', 'dateformat' => 'Date format', 'datedefault' => 'No preference', 'datetime' => 'Date and time', 'math_failure' => 'Failed to parse', 'math_unknown_error' => 'unknown error', 'math_unknown_function' => 'unknown function', 'math_lexing_error' => 'lexing error', 'math_syntax_error' => 'syntax error', 'math_image_error' => 'PNG conversion failed; check for correct installation of latex, dvips, gs, and convert', 'math_bad_tmpdir' => 'Can\'t write to or create math temp directory', 'math_bad_output' => 'Can\'t write to or create math output directory', 'math_notexvc' => 'Missing texvc executable; please see math/README to configure.', 'prefs-personal' => 'User profile', 'prefs-rc' => 'Recent changes', 'prefs-watchlist' => 'Watchlist', 'prefs-watchlist-days' => 'Number of days to show in watchlist:', 'prefs-watchlist-edits' => 'Number of edits to show in expanded watchlist:', 'prefs-misc' => 'Misc', 'saveprefs' => 'Save', 'resetprefs' => 'Reset', 'oldpassword' => 'Old password:', 'newpassword' => 'New password:', 'retypenew' => 'Retype new password:', 'textboxsize' => 'Editing', 'rows' => 'Rows:', 'columns' => 'Columns:', 'searchresultshead' => 'Search', 'resultsperpage' => 'Hits per page:', 'contextlines' => 'Lines per hit:', 'contextchars' => 'Context per line:', 'stubthreshold' => 'Threshold for stub display:', 'recentchangescount' => 'Titles in recent changes:', 'savedprefs' => 'Your preferences have been saved.', 'timezonelegend' => 'Time zone', 'timezonetext' => 'The number of hours your local time differs from server time (UTC).', 'localtime' => 'Local time', 'timezoneoffset' => 'Offset¹', 'servertime' => 'Server time', 'guesstimezone' => 'Fill in from browser', 'allowemail' => 'Enable e-mail from other users', 'defaultns' => 'Search in these namespaces by default:', 'default' => 'default', 'files' => 'Files', # User rights 'userrights-lookup-user' => 'Manage user groups', 'userrights-user-editname' => 'Enter a username:', 'editusergroup' => 'Edit User Groups', 'userrights-editusergroup' => 'Edit user groups', 'saveusergroups' => 'Save User Groups', 'userrights-groupsmember' => 'Member of:', 'userrights-groupsavailable' => 'Available groups:', 'userrights-groupshelp' => 'Select groups you want the user to be removed from or added to. Unselected groups will not be changed. You can deselect a group with CTRL + Left Click', 'userrights-logcomment' => 'Changed group membership from $1 to $2', # Groups 'group' => 'Group:', 'group-bot' => 'Bots', 'group-sysop' => 'Sysops', 'group-bureaucrat' => 'Bureaucrats', 'group-steward' => 'Stewards', 'group-all' => '(all)', 'group-bot-member' => 'Bot', 'group-sysop-member' => 'Sysop', 'group-bureaucrat-member' => 'Bureaucrat', 'group-steward-member' => 'Steward', 'grouppage-bot' => '{{ns:project}}:Bots', 'grouppage-sysop' => '{{ns:project}}:Administrators', 'grouppage-bureaucrat' => '{{ns:project}}:Bureaucrats', # Recent changes # 'changes' => 'changes', 'recentchanges' => 'Recent changes', 'recentchanges-url' => 'Special:Recentchanges', 'recentchangestext' => 'Track the most recent changes to the wiki on this page.', 'rcnote' => "Below are the last <strong>$1</strong> changes in the last <strong>$2</strong> days, as of $3.", 'rcnotefrom' => "Below are the changes since <b>$2</b> (up to <b>$1</b> shown).", 'rclistfrom' => "Show new changes starting from $1", 'rcshowhideminor' => '$1 minor edits', 'rcshowhidebots' => '$1 bots', 'rcshowhideliu' => '$1 logged-in users', 'rcshowhideanons' => '$1 anonymous users', 'rcshowhidepatr' => '$1 patrolled edits', 'rcshowhidemine' => '$1 my edits', 'rclinks' => "Show last $1 changes in last $2 days<br />$3", 'diff' => 'diff', 'hist' => 'hist', 'hide' => 'Hide', 'show' => 'Show', 'minoreditletter' => 'm', 'newpageletter' => 'N', 'boteditletter' => 'b', 'sectionlink' => '→', 'number_of_watching_users_RCview' => '[$1]', 'number_of_watching_users_pageview' => '[$1 watching user/s]', 'rc_categories' => 'Limit to categories (separate with "|")', 'rc_categories_any' => 'Any', # Upload # 'upload' => 'Upload file', 'uploadbtn' => 'Upload file', 'reupload' => 'Re-upload', 'reuploaddesc' => 'Return to the upload form.', 'uploadnologin' => 'Not logged in', 'uploadnologintext' => "You must be [[Special:Userlogin|logged in]] to upload files.", 'upload_directory_read_only' => 'The upload directory ($1) is not writable by the webserver.', 'uploaderror' => 'Upload error', 'uploadtext' => "Use the form below to upload files, to view or search previously uploaded images go to the [[Special:Imagelist|list of uploaded files]], uploads and deletions are also logged in the [[Special:Log/upload|upload log]]. To include the image in a page, use a link in the form '''<nowiki>[[{{ns:image}}:File.jpg]]</nowiki>''', '''<nowiki>[[{{ns:image}}:File.png|alt text]]</nowiki>''' or '''<nowiki>[[{{ns:media}}:File.ogg]]</nowiki>''' for directly linking to the file.", 'uploadlog' => 'upload log', 'uploadlogpage' => 'Upload log', 'uploadlogpagetext' => 'Below is a list of the most recent file uploads.', 'filename' => 'Filename', 'filedesc' => 'Summary', 'fileuploadsummary' => 'Summary:', 'filestatus' => 'Copyright status', 'filesource' => 'Source', 'copyrightpage' => "Project:Copyrights", 'copyrightpagename' => "{{SITENAME}} copyright", 'uploadedfiles' => 'Uploaded files', 'ignorewarning' => 'Ignore warning and save file anyway.', 'ignorewarnings' => 'Ignore any warnings', 'minlength' => 'File names must be at least three letters.', 'illegalfilename' => 'The filename "$1" contains characters that are not allowed in page titles. Please rename the file and try uploading it again.', 'badfilename' => 'File name has been changed to "$1".', 'badfiletype' => "\".$1\" is not a recommended image file format.", 'largefile' => 'It is recommended that files do not exceed $1 bytes in size; this file is $2 bytes', 'largefileserver' => 'This file is bigger than the server is configured to allow.', 'emptyfile' => 'The file you uploaded seems to be empty. This might be due to a typo in the file name. Please check whether you really want to upload this file.', 'fileexists' => 'A file with this name exists already, please check $1 if you are not sure if you want to change it.', 'fileexists-forbidden' => 'A file with this name exists already; please go back and upload this file under a new name. [[Image:$1|thumb|center|$1]]', 'fileexists-shared-forbidden' => 'A file with this name exists already in the shared file repository; please go back and upload this file under a new name. [[Image:$1|thumb|center|$1]]', 'successfulupload' => 'Successful upload', 'fileuploaded' => "File $1 uploaded successfully. Please follow this link: $2 to the description page and fill in information about the file, such as where it came from, when it was created and by whom, and anything else you may know about it. If this is an image, you can insert it like this: <tt><nowiki>[[Image:$1|thumb|Description]]</nowiki></tt>", 'uploadwarning' => 'Upload warning', 'savefile' => 'Save file', 'uploadedimage' => "uploaded \"[[$1]]\"", 'uploaddisabled' => 'Uploads disabled', 'uploaddisabledtext' => 'File uploads are disabled on this wiki.', 'uploadscripted' => 'This file contains HTML or script code that may be erroneously be interpreted by a web browser.', 'uploadcorrupt' => 'The file is corrupt or has an incorrect extension. Please check the file and upload again.', 'uploadvirus' => 'The file contains a virus! Details: $1', 'sourcefilename' => 'Source filename', 'destfilename' => 'Destination filename', 'filewasdeleted' => 'A file of this name has been previously uploaded and subsequently deleted. You should check the $1 before proceeding to upload it again.', 'license' => 'Licensing', 'nolicense' => 'None selected', 'licenses' => '-', # Don't duplicate this in translations # Image list # 'imagelist' => 'File list', 'imagelisttext' => 'Below is a list of <strong>$1</strong> files sorted <strong>$2</strong>.', 'imagelistforuser' => "This shows only images uploaded by $1.", 'getimagelist' => 'fetching file list', 'ilsubmit' => 'Search', 'showlast' => 'Show last $1 files sorted $2.', 'byname' => 'by name', 'bydate' => 'by date', 'bysize' => 'by size', 'imgdelete' => 'del', 'imgdesc' => 'desc', 'imglegend' => 'Legend: (desc) = show/edit file description.', 'imghistory' => 'File history', 'revertimg' => 'rev', 'deleteimg' => 'del', 'deleteimgcompletely' => 'Delete all revisions of this file', 'imghistlegend' => 'Legend: (cur) = this is the current file, (del) = delete this old version, (rev) = revert to this old version. <br /><i>Click on date to see the file uploaded on that date</i>.', 'imagelinks' => 'Links', 'linkstoimage' => 'The following pages link to this file:', 'nolinkstoimage' => 'There are no pages that link to this file.', 'sharedupload' => 'This file is a shared upload and may be used by other projects.', 'shareduploadwiki' => 'Please see the $1 for further information.', 'shareduploadwiki-linktext' => 'file description page', 'shareddescriptionfollows' => '-', 'noimage' => 'No file by this name exists, you can $1.', 'noimage-linktext' => 'upload it', 'uploadnewversion-linktext' => 'Upload a new version of this file', # Mime search # 'mimesearch' => 'MIME search', 'mimetype' => 'MIME type:', 'download' => 'download', # Unwatchedpages # 'unwatchedpages' => 'Unwatched pages', # List redirects 'listredirects' => 'List redirects', # Unused templates 'unusedtemplates' => 'Unused templates', 'unusedtemplatestext' => 'This page lists all pages in the template namespace which are not included in another page. Remember to check for other links to the templates before deleting them.', 'unusedtemplateswlh' => 'other links', # Random redirect 'randomredirect' => 'Random redirect', # Statistics # 'statistics' => 'Statistics', 'sitestats' => '{{SITENAME}} statistics', 'userstats' => 'User statistics', 'sitestatstext' => "There are '''$1''' total pages in the database. This includes \"talk\" pages, pages about {{SITENAME}}, minimal \"stub\" pages, redirects, and others that probably don't qualify as content pages. Excluding those, there are '''$2''' pages that are probably legitimate content pages. '''$8''' files have been uploaded. There have been a total of '''$3''' page views, and '''$4''' page edits since the wiki was setup. That comes to '''$5''' average edits per page, and '''$6''' views per edit. The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''$7'''.", 'userstatstext' => "There are '''$1''' registered users, of which '''$2''' (or '''$4%''') are administrators (see $3).", 'disambiguations' => 'Disambiguation pages', 'disambiguationspage' => 'Template:disambig', 'disambiguationstext' => "The following pages link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as disambiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.", 'doubleredirects' => 'Double redirects', 'doubleredirectstext' => "Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" target page, which the first redirect should point to.", 'brokenredirects' => 'Broken redirects', 'brokenredirectstext' => 'The following redirects link to non-existent pages:', # Miscellaneous special pages # 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}', 'ncategories' => '$1 {{PLURAL:$1|category|categories}}', 'nlinks' => '$1 {{PLURAL:$1|link|links}}', 'nmembers' => '$1 {{PLURAL:$1|member|members}}', 'nrevisions' => '$1 {{PLURAL:$1|revision|revisions}}', 'nviews' => '$1 {{PLURAL:$1|view|views}}', 'lonelypages' => 'Orphaned pages', 'uncategorizedpages' => 'Uncategorized pages', 'uncategorizedcategories' => 'Uncategorized categories', 'uncategorizedimages' => 'Uncategorized images', 'unusedcategories' => 'Unused categories', 'unusedimages' => 'Unused files', 'popularpages' => 'Popular pages', 'wantedcategories' => 'Wanted categories', 'wantedpages' => 'Wanted pages', 'mostlinked' => 'Most linked to pages', 'mostlinkedcategories' => 'Most linked to categories', 'mostcategories' => 'Articles with the most categories', 'mostimages' => 'Most linked to images', 'mostrevisions' => 'Articles with the most revisions', 'allpages' => 'All pages', 'prefixindex' => 'Prefix index', 'randompage' => 'Random page', 'randompage-url'=> 'Special:Random', 'shortpages' => 'Short pages', 'longpages' => 'Long pages', 'deadendpages' => 'Dead-end pages', 'listusers' => 'User list', 'specialpages' => 'Special pages', 'spheading' => 'Special pages for all users', 'restrictedpheading' => 'Restricted special pages', 'recentchangeslinked' => 'Related changes', 'rclsub' => "(to pages linked from \"$1\")", 'newpages' => 'New pages', 'ancientpages' => 'Oldest pages', 'intl' => 'Interlanguage links', 'move' => 'Move', 'movethispage' => 'Move this page', 'unusedimagestext' => '<p>Please note that other web sites may link to an image with a direct URL, and so may still be listed here despite being in active use.</p>', 'unusedcategoriestext' => 'The following category pages exist although no other article or category make use of them.', 'booksources' => 'Book sources', 'categoriespagetext' => 'The following categories exist in the wiki.', 'data' => 'Data', 'userrights' => 'User rights management', 'groups' => 'User groups', 'booksourcetext' => "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for.", 'isbn' => 'ISBN', 'rfcurl' => 'http://www.ietf.org/rfc/rfc$1.txt', 'pubmedurl' => 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=$1', 'alphaindexline' => "$1 to $2", 'version' => 'Version', 'log' => 'Logs', 'alllogstext' => 'Combined display of upload, deletion, protection, blocking, and sysop logs. You can narrow down the view by selecting a log type, the user name, or the affected page.', 'logempty' => 'No matching items in log.', # Special:Allpages 'nextpage' => 'Next page ($1)', 'allpagesfrom' => 'Display pages starting at:', 'allarticles' => 'All articles', 'allnonarticles' => 'All non-articles', 'allinnamespace' => 'All pages ($1 namespace)', 'allnotinnamespace' => 'All pages (not in $1 namespace)', 'allpagesprev' => 'Previous', 'allpagesnext' => 'Next', 'allpagessubmit' => 'Go', 'allpagesprefix' => 'Display pages with prefix:', # E this user # 'mailnologin' => 'No send address', 'mailnologintext' => "You must be [[Special:Userlogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.", 'emailuser' => 'E-mail this user', 'emailpage' => 'E-mail user', 'emailpagetext' => 'If this user has entered a valid e-mail address in his or her user preferences, the form below will send a single message. The e-mail address you entered in your user preferences will appear as the "From" address of the mail, so the recipient will be able to reply.', 'usermailererror' => 'Mail object returned error:', 'defemailsubject' => "{{SITENAME}} e-mail", 'noemailtitle' => 'No e-mail address', 'noemailtext' => 'This user has not specified a valid e-mail address, or has chosen not to receive e-mail from other users.', 'emailfrom' => 'From', 'emailto' => 'To', 'emailsubject' => 'Subject', 'emailmessage' => 'Message', 'emailsend' => 'Send', 'emailsent' => 'E-mail sent', 'emailsenttext' => 'Your e-mail message has been sent.', # Watchlist # 'watchlist' => 'My watchlist', 'watchlistsub' => "(for user \"$1\")", 'nowatchlist' => 'You have no items on your watchlist.', 'watchlistcount' => "'''You have $1 items on your watchlist, including talk pages.'''", 'clearwatchlist' => 'Clear watchlist', 'watchlistcleartext' => 'Are you sure you wish to remove them?', 'watchlistclearbutton' => 'Clear watchlist', 'watchlistcleardone' => 'Your watchlist has been cleared. $1 items were removed.', 'watchnologin' => 'Not logged in', 'watchnologintext' => 'You must be [[Special:Userlogin|logged in]] to modify your watchlist.', 'addedwatch' => 'Added to watchlist', 'addedwatchtext' => "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]]. Future changes to this page and its associated Talk page will be listed there, and the page will appear '''bolded''' in the [[Special:Recentchanges|list of recent changes]] to make it easier to pick out. If you want to remove the page from your watchlist later, click \"Unwatch\" in the sidebar.", 'removedwatch' => 'Removed from watchlist', 'removedwatchtext' => "The page \"[[:$1]]\" has been removed from your watchlist.", 'watch' => 'Watch', 'watchthispage' => 'Watch this page', 'unwatch' => 'Unwatch', 'unwatchthispage' => 'Stop watching', 'notanarticle' => 'Not a content page', 'watchnochange' => 'None of your watched items was edited in the time period displayed.', 'watchdetails' => '* $1 pages watched not counting talk pages * [[Special:Watchlist/edit|Show and edit complete watchlist]] * [[Special:Watchlist/clear|Remove all pages]]', 'wlheader-enotif' => "* E-mail notification is enabled.", 'wlheader-showupdated' => "* Pages which have been changed since you last visited them are shown in '''bold'''", 'watchmethod-recent'=> 'checking recent edits for watched pages', 'watchmethod-list' => 'checking watched pages for recent edits', 'removechecked' => 'Remove checked items from watchlist', 'watchlistcontains' => "Your watchlist contains $1 pages.", 'watcheditlist' => 'Here\'s an alphabetical list of your watched content pages. Check the boxes of pages you want to remove from your watchlist and click the \'remove checked\' button at the bottom of the screen (deleting a content page also deletes the accompanying talk page and vice versa).', 'removingchecked' => 'Removing requested items from watchlist...', 'couldntremove' => "Couldn't remove item '$1'...", 'iteminvalidname' => "Problem with item '$1', invalid name...", 'wlnote' => 'Below are the last $1 changes in the last <b>$2</b> hours.', 'wlshowlast' => 'Show last $1 hours $2 days $3', 'wlsaved' => 'This is a saved version of your watchlist.', 'wlhideshowown' => '$1 my edits', 'wlhideshowbots' => '$1 bot edits', 'wldone' => 'Done.', 'enotif_mailer' => '{{SITENAME}} Notification Mailer', 'enotif_reset' => 'Mark all pages visited', 'enotif_newpagetext'=> 'This is a new page.', 'changed' => 'changed', 'created' => 'created', 'enotif_subject' => '{{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED by $PAGEEDITOR', 'enotif_lastvisited' => 'See $1 for all changes since your last visit.', 'enotif_body' => 'Dear $WATCHINGUSERNAME, the {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current version. $NEWPAGE Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT Contact the editor: mail: $PAGEEDITOR_EMAIL wiki: $PAGEEDITOR_WIKI There will be no other notifications in case of further changes unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist. Your friendly {{SITENAME}} notification system -- To change your watchlist settings, visit {{fullurl:{{ns:special}}:Watchlist/edit}} Feedback and further assistance: {{fullurl:{{ns:help}}:Contents}}', # Delete/protect/revert # 'deletepage' => 'Delete page', 'confirm' => 'Confirm', 'excontent' => "content was: '$1'", 'excontentauthor' => "content was: '$1' (and the only contributor was '$2')", 'exbeforeblank' => "content before blanking was: '$1'", 'exblank' => 'page was empty', 'confirmdelete' => 'Confirm delete', 'deletesub' => "(Deleting \"$1\")", 'historywarning' => 'Warning: The page you are about to delete has a history:', 'confirmdeletetext' => "You are about to permanently delete a page or image along with all of its history from the database. Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{ns:project}}:Policy]].", 'actioncomplete' => 'Action complete', 'deletedtext' => "\"$1\" has been deleted. See $2 for a record of recent deletions.", 'deletedarticle' => "deleted \"[[$1]]\"", 'dellogpage' => 'Deletion log', 'dellogpagetext' => 'Below is a list of the most recent deletions.', 'deletionlog' => 'deletion log', 'reverted' => 'Reverted to earlier revision', 'deletecomment' => 'Reason for deletion', 'imagereverted' => 'Revert to earlier version was successful.', 'rollback' => 'Roll back edits', 'rollback_short' => 'Rollback', 'rollbacklink' => 'rollback', 'rollbackfailed' => 'Rollback failed', 'cantrollback' => 'Cannot revert edit; last contributor is only author of this page.', 'alreadyrolled' => "Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]).", # only shown if there is an edit comment 'editcomment' => "The edit comment was: \"<i>$1</i>\".", 'revertpage' => "Reverted edits by [[Special:Contributions/$2|$2]] ([[User_talk:$2|Talk]]); changed back to last version by [[User:$1|$1]]", 'sessionfailure' => 'There seems to be a problem with your login session; this action has been canceled as a precaution against session hijacking. Please hit "back" and reload the page you came from, then try again.', 'protectlogpage' => 'Protection log', 'protectlogtext' => "Below is a list of page locks/unlocks. See [[{{ns:project}}:Protected page]] for more information.", 'protectedarticle' => 'protected "[[$1]]"', 'unprotectedarticle' => 'unprotected "[[$1]]"', 'protectsub' => '(Protecting "$1")', 'confirmprotecttext' => 'Do you really want to protect this page?', 'confirmprotect' => 'Confirm protection', 'protectmoveonly' => 'Protect from moves only', 'protectcomment' => 'Reason for protecting', 'unprotectsub' =>"(Unprotecting \"$1\")", 'confirmunprotecttext' => 'Do you really want to unprotect this page?', 'confirmunprotect' => 'Confirm unprotection', 'unprotectcomment' => 'Reason for unprotecting', 'protect-unchain' => 'Unlock move permissions', 'protect-text' => 'You may view and change the protection level here for the page <strong>$1</strong>. Please be sure you are following the [[{{ns:project}}:Protected page|project guidelines]].', 'protect-viewtext' => 'Your account does not have permission to change page protection levels. Here are the current settings for the page <strong>$1</strong>:', 'protect-default' => '(default)', 'protect-level-autoconfirmed' => 'Block unregistered users', 'protect-level-sysop' => 'Sysops only', # restrictions (nouns) 'restriction-edit' => 'Edit', 'restriction-move' => 'Move', # Undelete 'undelete' => 'View deleted pages', 'undeletepage' => 'View and restore deleted pages', 'viewdeletedpage' => 'View deleted pages', 'undeletepagetext' => 'The following pages have been deleted but are still in the archive and can be restored. The archive may be periodically cleaned out.', 'undeleteextrahelp' => "To restore the entire page, leave all checkboxes deselected and click '''''Restore'''''. To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''Restore'''''. Clicking '''''Reset''''' will clear the comment field and all checkboxes.", 'undeletearticle' => 'Restore deleted page', 'undeleterevisions' => "$1 revisions archived", 'undeletehistory' => 'If you restore the page, all revisions will be restored to the history. If a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history, and the current revision of the live page will not be automatically replaced.', 'undeletehistorynoadmin' => 'This article has been deleted. The reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion. The actual text of these deleted revisions is only available to administrators.', 'undeleterevision' => "Deleted revision as of $1", 'undeletebtn' => 'Restore', 'undeletereset' => 'Reset', 'undeletecomment' => 'Comment:', 'undeletedarticle' => "restored \"[[$1]]\"", 'undeletedrevisions' => "$1 revisions restored", 'undeletedrevisions-files' => "$1 revisions and $2 file(s) restored", 'undeletedfiles' => "$1 file(s) restored", 'cannotundelete' => 'Undelete failed; someone else may have undeleted the page first.', 'undeletedpage' => "<big>'''$1 has been restored'''</big> Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.", # Namespace form on various pages 'namespace' => 'Namespace:', 'invert' => 'Invert selection', # Contributions # 'contributions' => 'User contributions', 'mycontris' => 'My contributions', 'contribsub' => "For $1", 'nocontribs' => 'No changes were found matching these criteria.', 'ucnote' => "Below are this user's last <b>$1</b> changes in the last <b>$2</b> days.", 'uclinks' => "View the last $1 changes; view the last $2 days.", 'uctop' => ' (top)' , 'newbies' => 'newbies', 'sp-newimages-showfrom' => 'Show new images starting from $1', 'sp-contributions-newest' => 'Newest', 'sp-contributions-oldest' => 'Oldest', 'sp-contributions-newer' => 'Newer $1', 'sp-contributions-older' => 'Older $1', 'sp-contributions-newbies-sub' => 'For newbies', # What links here # 'whatlinkshere' => 'What links here', 'notargettitle' => 'No target', 'notargettext' => 'You have not specified a target page or user to perform this function on.', 'linklistsub' => '(List of links)', 'linkshere' => 'The following pages link to here:', 'nolinkshere' => 'No pages link to here.', 'isredirect' => 'redirect page', 'istemplate' => 'inclusion', # Block/unblock IP # 'blockip' => 'Block user', 'blockiptext' => "Use the form below to block write access from a specific IP address or username. This should be done only only to prevent vandalism, and in accordance with [[{{ns:project}}:Policy|policy]]. Fill in a specific reason below (for example, citing particular pages that were vandalized).", 'ipaddress' => 'IP Address', 'ipadressorusername' => 'IP Address or username', 'ipbexpiry' => 'Expiry', 'ipbreason' => 'Reason', 'ipbsubmit' => 'Block this user', 'ipbother' => 'Other time', 'ipboptions' => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite', 'ipbotheroption' => 'other', 'badipaddress' => 'Invalid IP address', 'blockipsuccesssub' => 'Block succeeded', 'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1|$1]] has been blocked. <br />See [[{{ns:Special}}:Ipblocklist|IP block list]] to review blocks.', 'unblockip' => 'Unblock user', 'unblockiptext' => 'Use the form below to restore write access to a previously blocked IP address or username.', 'ipusubmit' => 'Unblock this address', 'unblocked' => '[[User:$1|$1]] has been unblocked', 'ipblocklist' => 'List of blocked IP addresses and usernames', 'blocklistline' => "$1, $2 blocked $3 ($4)", 'infiniteblock' => 'infinite', 'expiringblock' => 'expires $1', 'ipblocklistempty' => 'The blocklist is empty.', 'blocklink' => 'block', 'unblocklink' => 'unblock', 'contribslink' => 'contribs', 'autoblocker' => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]". The reason given for $1\'s block is: "\'\'\'$2\'\'\'"', 'blocklogpage' => 'Block log', 'blocklogentry' => 'blocked "[[$1]]" with an expiry time of $2', 'blocklogtext' => 'This is a log of user blocking and unblocking actions. Automatically blocked IP addresses are not listed. See the [[Special:Ipblocklist|IP block list]] for the list of currently operational bans and blocks.', 'unblocklogentry' => 'unblocked $1', 'range_block_disabled' => 'The sysop ability to create range blocks is disabled.', 'ipb_expiry_invalid' => 'Expiry time invalid.', 'ip_range_invalid' => 'Invalid IP range.', 'proxyblocker' => 'Proxy blocker', 'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.', 'proxyblocksuccess' => 'Done.', 'sorbs' => 'SORBS DNSBL', 'sorbsreason' => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL.', 'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL. You cannot create an account', # Developer tools # 'lockdb' => 'Lock database', 'unlockdb' => 'Unlock database', 'lockdbtext' => 'Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database. Please confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.', 'unlockdbtext' => 'Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database. Please confirm that this is what you intend to do.', 'lockconfirm' => 'Yes, I really want to lock the database.', 'unlockconfirm' => 'Yes, I really want to unlock the database.', 'lockbtn' => 'Lock database', 'unlockbtn' => 'Unlock database', 'locknoconfirm' => 'You did not check the confirmation box.', 'lockdbsuccesssub' => 'Database lock succeeded', 'unlockdbsuccesssub' => 'Database lock removed', 'lockdbsuccesstext' => 'The database has been locked. <br />Remember to remove the lock after your maintenance is complete.', 'unlockdbsuccesstext' => 'The database has been unlocked.', # Make sysop 'makesysoptitle' => 'Make a user into a sysop', 'makesysoptext' => 'This form is used by bureaucrats to turn ordinary users into administrators. Type the name of the user in the box and press the button to make the user an administrator', 'makesysopname' => 'Name of the user:', 'makesysopsubmit' => 'Make this user into a sysop', 'makesysopok' => "<b>User \"$1\" is now a sysop</b>", 'makesysopfail' => "<b>User \"$1\" could not be made into a sysop. (Did you enter the name correctly?)</b>", 'setbureaucratflag' => 'Set bureaucrat flag', 'setstewardflag' => 'Set steward flag', 'rightslog' => 'User rights log', 'rightslogtext' => 'This is a log of changes to user rights.', 'rightslogentry' => 'changed group membership for $1 from $2 to $3', 'rights' => 'Rights:', 'set_user_rights' => 'Set user rights', 'user_rights_set' => "<b>User rights for \"$1\" updated</b>", 'set_rights_fail' => "<b>User rights for \"$1\" could not be set. (Did you enter the name correctly?)</b>", 'makesysop' => 'Make a user into a sysop', 'already_sysop' => 'This user is already an administrator', 'already_bureaucrat' => 'This user is already a bureaucrat', 'already_steward' => 'This user is already a steward', 'rightsnone' => '(none)', # Move page # 'movepage' => 'Move page', 'movepagetext' => 'Using the form below will rename a page, moving all of its history to the new name. The old title will become a redirect page to the new title. Links to the old page title will not be changed; be sure to check for double or broken redirects. You are responsible for making sure that links continue to point where they are supposed to go. Note that the page will \'\'\'not\'\'\' be moved if there is already a page at the new title, unless it is empty or a redirect and has no past edit history. This means that you can rename a page back to where it was just renamed from if you make a mistake, and you cannot overwrite an existing page. <b>WARNING!</b> This can be a drastic and unexpected change for a popular page; please be sure you understand the consequences of this before proceeding.', 'movepagetalktext' => 'The associated talk page will be automatically moved along with it \'\'\'unless:\'\'\' *A non-empty talk page already exists under the new name, or *You uncheck the box below. In those cases, you will have to move or merge the page manually if desired.', 'movearticle' => 'Move page', 'movenologin' => 'Not logged in', 'movenologintext' => "You must be a registered user and [[Special:Userlogin|logged in]] to move a page.", 'newtitle' => 'To new title', 'movepagebtn' => 'Move page', 'pagemovedsub' => 'Move succeeded', 'pagemovedtext' => "Page \"[[$1]]\" moved to \"[[$2]]\".", 'articleexists' => 'A page of that name already exists, or the name you have chosen is not valid. Please choose another name.', 'talkexists' => "'''The page itself was moved successfully, but the talk page could not be moved because one already exists at the new title. Please merge them manually.'''", 'movedto' => 'moved to', 'movetalk' => 'Move associated talk page', 'talkpagemoved' => 'The corresponding talk page was also moved.', 'talkpagenotmoved' => 'The corresponding talk page was <strong>not</strong> moved.', '1movedto2' => '[[$1]] moved to [[$2]]', '1movedto2_redir' => '[[$1]] moved to [[$2]] over redirect', 'movelogpage' => 'Move log', 'movelogpagetext' => 'Below is a list of page moved.', 'movereason' => 'Reason', 'revertmove' => 'revert', 'delete_and_move' => 'Delete and move', 'delete_and_move_text' => '==Deletion required== The destination article "[[$1]]" already exists. Do you want to delete it to make way for the move?', 'delete_and_move_confirm' => 'Yes, delete the page', 'delete_and_move_reason' => 'Deleted to make way for move', 'selfmove' => "Source and destination titles are the same; can't move a page over itself.", 'immobile_namespace' => "Destination title is of a special type; cannot move pages into that namespace.", # Export 'export' => 'Export pages', 'exporttext' => 'You can export the text and editing history of a particular page or set of pages wrapped in some XML. This can be imported into another wiki using MediaWiki via the Special:Import page. To export pages, enter the titles in the text box below, one title per line, and select whether you want the current version as well as all old versions, with the page history lines, or just the current version with the info about the last edit. In the latter case you can also use a link, e.g. [[{{ns:Special}}:Export/{{int:mainpage}}]] for the page {{int:mainpage}}.', 'exportcuronly' => 'Include only the current revision, not the full history', 'exportnohistory' => "---- '''Note:''' Exporting the full history of pages through this form has been disabled due to performance reasons.", 'export-submit' => 'Export', # Namespace 8 related 'allmessages' => 'System messages', 'allmessagesname' => 'Name', 'allmessagesdefault' => 'Default text', 'allmessagescurrent' => 'Current text', 'allmessagestext' => 'This is a list of system messages available in the MediaWiki namespace.', 'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:Allmessages at this site.', 'allmessagesnotsupportedDB' => '\'\'\'Special:Allmessages\'\'\' cannot be used because \'\'\'$wgUseDatabaseMessages\'\'\' is switched off.', 'allmessagesfilter' => 'Message name filter:', 'allmessagesmodified' => 'Show only modified', # Thumbnails 'thumbnail-more' => 'Enlarge', 'missingimage' => '<b>Missing image</b><br /><i>$1</i>', 'filemissing' => 'File missing', 'thumbnail_error' => 'Error creating thumbnail: $1', # Special:Import 'import' => 'Import pages', 'importinterwiki' => 'Transwiki import', +'import-interwiki-text' => 'Select a wiki and page title to import. +Revision dates and editors\' names will be preserved. +All transwiki import actions are logged at the [[Special:Log/import|import log]].', +'import-interwiki-history' => 'Copy all history versions for this page', +'import-interwiki-submit' => 'Import', 'importtext' => 'Please export the file from the source wiki using the Special:Export utility, save it to your disk and upload it here.', 'importstart' => "Importing pages...", 'importnopages' => "No pages to import.", 'importfailed' => "Import failed: $1", 'importnotext' => 'Empty or no text', 'importsuccess' => 'Import succeeded!', 'importhistoryconflict' => 'Conflicting history revision exists (may have imported this page before)', 'importnosources' => 'No transwiki import sources have been defined and direct history uploads are disabled.', 'importnofile' => 'No import file was uploaded.', 'importuploaderror' => 'Upload of import file failed; perhaps the file is bigger than the allowed upload size.', # import log 'importlogpage' => 'Import log', 'importlogpagetext' => 'Administrative imports of pages with edit history from other wikis.', 'import-logentry-upload' => 'imported $1 by file upload', 'import-logentry-interwiki' => 'transwikied $1', 'import-logentry-interwiki-source' => 'from $1', # Keyboard access keys for power users 'accesskey-search' => 'f', 'accesskey-minoredit' => 'i', 'accesskey-save' => 's', 'accesskey-preview' => 'p', 'accesskey-diff' => 'v', 'accesskey-compareselectedversions' => 'v', 'accesskey-watch' => 'w', # tooltip help for some actions, most are in Monobook.js 'tooltip-search' => 'Search {{SITENAME}} [alt-f]', 'tooltip-minoredit' => 'Mark this as a minor edit [alt-i]', 'tooltip-save' => 'Save your changes [alt-s]', 'tooltip-preview' => 'Preview your changes, please use this before saving! [alt-p]', 'tooltip-diff' => 'Show which changes you made to the text. [alt-v]', 'tooltip-compareselectedversions' => 'See the differences between the two selected versions of this page. [alt-v]', 'tooltip-watch' => 'Add this page to your watchlist [alt-w]', # stylesheets 'Common.css' => '/** CSS placed here will be applied to all skins */', 'Monobook.css' => '/* CSS placed here will affect users of the Monobook skin */', # Metadata 'nodublincore' => 'Dublin Core RDF metadata disabled for this server.', 'nocreativecommons' => 'Creative Commons RDF metadata disabled for this server.', 'notacceptable' => 'The wiki server can\'t provide data in a format your client can read.', # Attribution 'anonymous' => 'Anonymous user(s) of {{SITENAME}}', 'siteuser' => '{{SITENAME}} user $1', 'lastmodifiedby' => 'This page was last modified $1 by $2.', 'and' => 'and', 'othercontribs' => 'Based on work by $1.', 'others' => 'others', 'siteusers' => '{{SITENAME}} user(s) $1', 'creditspage' => 'Page credits', 'nocredits' => 'There is no credits info available for this page.', # Spam protection 'spamprotectiontitle' => 'Spam protection filter', 'spamprotectiontext' => 'The page you wanted to save was blocked by the spam filter. This is probably caused by a link to an external site.', 'spamprotectionmatch' => 'The following text is what triggered our spam filter: $1', 'subcategorycount' => "There {{PLURAL:$1|is one subcategory|are $1 subcategories}} to this category.", 'categoryarticlecount' => "There {{PLURAL:$1|is one article|are $1 articles}} in this category.", 'listingcontinuesabbrev' => " cont.", 'spambot_username' => 'MediaWiki spam cleanup', 'spam_reverting' => 'Reverting to last version not containing links to $1', 'spam_blanking' => 'All revisions contained links to $1, blanking', # Info page 'infosubtitle' => 'Information for page', 'numedits' => 'Number of edits (article): $1', 'numtalkedits' => 'Number of edits (discussion page): $1', 'numwatchers' => 'Number of watchers: $1', 'numauthors' => 'Number of distinct authors (article): $1', 'numtalkauthors' => 'Number of distinct authors (discussion page): $1', # Math options 'mw_math_png' => 'Always render PNG', 'mw_math_simple' => 'HTML if very simple or else PNG', 'mw_math_html' => 'HTML if possible or else PNG', 'mw_math_source' => 'Leave it as TeX (for text browsers)', 'mw_math_modern' => 'Recommended for modern browsers', 'mw_math_mathml' => 'MathML if possible (experimental)', # Patrolling 'markaspatrolleddiff' => "Mark as patrolled", 'markaspatrolledlink' => "[$1]", 'markaspatrolledtext' => "Mark this article as patrolled", 'markedaspatrolled' => "Marked as patrolled", 'markedaspatrolledtext' => "The selected revision has been marked as patrolled.", 'rcpatroldisabled' => "Recent Changes Patrol disabled", 'rcpatroldisabledtext' => "The Recent Changes Patrol feature is currently disabled.", 'markedaspatrollederror' => "Cannot mark as patrolled", 'markedaspatrollederrortext' => "You need to specify a revision to mark as patrolled.", # Monobook.js: tooltips and access keys for monobook 'Monobook.js' => '/* tooltips and access keys */ ta = new Object(); ta[\'pt-userpage\'] = new Array(\'.\',\'My user page\'); ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\\\'re editing as\'); ta[\'pt-mytalk\'] = new Array(\'n\',\'My talk page\'); ta[\'pt-anontalk\'] = new Array(\'n\',\'Discussion about edits from this ip address\'); ta[\'pt-preferences\'] = new Array(\'\',\'My preferences\'); ta[\'pt-watchlist\'] = new Array(\'l\',\'The list of pages you\\\'re monitoring for changes.\'); ta[\'pt-mycontris\'] = new Array(\'y\',\'List of my contributions\'); ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\'); ta[\'pt-anonlogin\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\'); ta[\'pt-logout\'] = new Array(\'o\',\'Log out\'); ta[\'ca-talk\'] = new Array(\'t\',\'Discussion about the content page\'); ta[\'ca-edit\'] = new Array(\'e\',\'You can edit this page. Please use the preview button before saving.\'); ta[\'ca-addsection\'] = new Array(\'+\',\'Add a comment to this discussion.\'); ta[\'ca-viewsource\'] = new Array(\'e\',\'This page is protected. You can view its source.\'); ta[\'ca-history\'] = new Array(\'h\',\'Past versions of this page.\'); ta[\'ca-protect\'] = new Array(\'=\',\'Protect this page\'); ta[\'ca-delete\'] = new Array(\'d\',\'Delete this page\'); ta[\'ca-undelete\'] = new Array(\'d\',\'Restore the edits done to this page before it was deleted\'); ta[\'ca-move\'] = new Array(\'m\',\'Move this page\'); ta[\'ca-watch\'] = new Array(\'w\',\'Add this page to your watchlist\'); ta[\'ca-unwatch\'] = new Array(\'w\',\'Remove this page from your watchlist\'); ta[\'search\'] = new Array(\'f\',\'Search this wiki\'); ta[\'p-logo\'] = new Array(\'\',\'Main Page\'); ta[\'n-mainpage\'] = new Array(\'z\',\'Visit the Main Page\'); ta[\'n-portal\'] = new Array(\'\',\'About the project, what you can do, where to find things\'); ta[\'n-currentevents\'] = new Array(\'\',\'Find background information on current events\'); ta[\'n-recentchanges\'] = new Array(\'r\',\'The list of recent changes in the wiki.\'); ta[\'n-randompage\'] = new Array(\'x\',\'Load a random page\'); ta[\'n-help\'] = new Array(\'\',\'The place to find out.\'); ta[\'n-sitesupport\'] = new Array(\'\',\'Support us\'); ta[\'t-whatlinkshere\'] = new Array(\'j\',\'List of all wiki pages that link here\'); ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Recent changes in pages linked from this page\'); ta[\'feed-rss\'] = new Array(\'\',\'RSS feed for this page\'); ta[\'feed-atom\'] = new Array(\'\',\'Atom feed for this page\'); ta[\'t-contributions\'] = new Array(\'\',\'View the list of contributions of this user\'); ta[\'t-emailuser\'] = new Array(\'\',\'Send a mail to this user\'); ta[\'t-upload\'] = new Array(\'u\',\'Upload images or media files\'); ta[\'t-specialpages\'] = new Array(\'q\',\'List of all special pages\'); ta[\'ca-nstab-main\'] = new Array(\'c\',\'View the content page\'); ta[\'ca-nstab-user\'] = new Array(\'c\',\'View the user page\'); ta[\'ca-nstab-media\'] = new Array(\'c\',\'View the media page\'); ta[\'ca-nstab-special\'] = new Array(\'\',\'This is a special page, you can\\\'t edit the page itself.\'); ta[\'ca-nstab-project\'] = new Array(\'a\',\'View the project page\'); ta[\'ca-nstab-image\'] = new Array(\'c\',\'View the image page\'); ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'View the system message\'); ta[\'ca-nstab-template\'] = new Array(\'c\',\'View the template\'); ta[\'ca-nstab-help\'] = new Array(\'c\',\'View the help page\'); ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');', # image deletion 'deletedrevision' => 'Deleted old revision $1.', # browsing diffs 'previousdiff' => '← Previous diff', 'nextdiff' => 'Next diff →', 'imagemaxsize' => 'Limit images on image description pages to:', 'thumbsize' => 'Thumbnail size:', 'showbigimage' => 'Download high resolution version ($1x$2, $3 KB)', 'newimages' => 'Gallery of new files', 'showhidebots' => '($1 bots)', 'noimages' => 'Nothing to see.', # short names for language variants used for language conversion links. # to disable showing a particular link, set it to 'disable', e.g. # 'variantname-zh-sg' => 'disable', 'variantname-zh-cn' => 'cn', 'variantname-zh-tw' => 'tw', 'variantname-zh-hk' => 'hk', 'variantname-zh-sg' => 'sg', 'variantname-zh' => 'zh', # variants for Serbian language 'variantname-sr-ec' => 'sr-ec', 'variantname-sr-el' => 'sr-el', 'variantname-sr-jc' => 'sr-jc', 'variantname-sr-jl' => 'sr-jl', 'variantname-sr' => 'sr', # labels for User: and Title: on Special:Log pages 'specialloguserlabel' => 'User:', 'speciallogtitlelabel' => 'Title:', 'passwordtooshort' => 'Your password is too short. It must have at least $1 characters.', # Media Warning 'mediawarning' => '\'\'\'Warning\'\'\': This file may contain malicious code, by executing it your system may be compromised.<hr />', 'fileinfo' => '$1KB, MIME type: <code>$2</code>', # Metadata 'metadata' => 'Metadata', 'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it. If the file has been modified from its original state, some details may not fully reflect the modified image.', 'metadata-expand' => 'Show extended details', 'metadata-collapse' => 'Hide extended details', 'metadata-fields' => 'EXIF metadata fields listed in this message will be included on image page display when the metadata table is collapsed. Others will be hidden by default. * make * model * datetimeoriginal * exposuretime * fnumber * focallength', # Exif tags 'exif-imagewidth' =>'Width', 'exif-imagelength' =>'Height', 'exif-bitspersample' =>'Bits per component', 'exif-compression' =>'Compression scheme', 'exif-photometricinterpretation' =>'Pixel composition', 'exif-orientation' =>'Orientation', 'exif-samplesperpixel' =>'Number of components', 'exif-planarconfiguration' =>'Data arrangement', 'exif-ycbcrsubsampling' =>'Subsampling ratio of Y to C', 'exif-ycbcrpositioning' =>'Y and C positioning', 'exif-xresolution' =>'Horizontal resolution', 'exif-yresolution' =>'Vertical resolution', 'exif-resolutionunit' =>'Unit of X and Y resolution', 'exif-stripoffsets' =>'Image data location', 'exif-rowsperstrip' =>'Number of rows per strip', 'exif-stripbytecounts' =>'Bytes per compressed strip', 'exif-jpeginterchangeformat' =>'Offset to JPEG SOI', 'exif-jpeginterchangeformatlength' =>'Bytes of JPEG data', 'exif-transferfunction' =>'Transfer function', 'exif-whitepoint' =>'White point chromaticity', 'exif-primarychromaticities' =>'Chromaticities of primarities', 'exif-ycbcrcoefficients' =>'Color space transformation matrix coefficients', 'exif-referenceblackwhite' =>'Pair of black and white reference values', 'exif-datetime' =>'File change date and time', 'exif-imagedescription' =>'Image title', 'exif-make' =>'Camera manufacturer', 'exif-model' =>'Camera model', 'exif-software' =>'Software used', 'exif-artist' =>'Author', 'exif-copyright' =>'Copyright holder', 'exif-exifversion' =>'Exif version', 'exif-flashpixversion' =>'Supported Flashpix version', 'exif-colorspace' =>'Color space', 'exif-componentsconfiguration' =>'Meaning of each component', 'exif-compressedbitsperpixel' =>'Image compression mode', 'exif-pixelydimension' =>'Valid image width', 'exif-pixelxdimension' =>'Valid image height', 'exif-makernote' =>'Manufacturer notes', 'exif-usercomment' =>'User comments', 'exif-relatedsoundfile' =>'Related audio file', 'exif-datetimeoriginal' =>'Date and time of data generation', 'exif-datetimedigitized' =>'Date and time of digitizing', 'exif-subsectime' =>'DateTime subseconds', 'exif-subsectimeoriginal' =>'DateTimeOriginal subseconds', 'exif-subsectimedigitized' =>'DateTimeDigitized subseconds', 'exif-exposuretime' =>'Exposure time', 'exif-exposuretime-format' => '$1 sec ($2)', 'exif-fnumber' =>'F Number', 'exif-fnumber-format' =>'f/$1', 'exif-exposureprogram' =>'Exposure Program', 'exif-spectralsensitivity' =>'Spectral sensitivity', 'exif-isospeedratings' =>'ISO speed rating', 'exif-oecf' =>'Optoelectronic conversion factor', 'exif-shutterspeedvalue' =>'Shutter speed', 'exif-aperturevalue' =>'Aperture', 'exif-brightnessvalue' =>'Brightness', 'exif-exposurebiasvalue' =>'Exposure bias', 'exif-maxaperturevalue' =>'Maximum land aperture', 'exif-subjectdistance' =>'Subject distance', 'exif-meteringmode' =>'Metering mode', 'exif-lightsource' =>'Light source', 'exif-flash' =>'Flash', 'exif-focallength' =>'Lens focal length', 'exif-focallength-format' =>'$1 mm', 'exif-subjectarea' =>'Subject area', 'exif-flashenergy' =>'Flash energy', 'exif-spatialfrequencyresponse' =>'Spatial frequency response', 'exif-focalplanexresolution' =>'Focal plane X resolution', 'exif-focalplaneyresolution' =>'Focal plane Y resolution', 'exif-focalplaneresolutionunit' =>'Focal plane resolution unit', 'exif-subjectlocation' =>'Subject location', 'exif-exposureindex' =>'Exposure index', 'exif-sensingmethod' =>'Sensing method', 'exif-filesource' =>'File source', 'exif-scenetype' =>'Scene type', 'exif-cfapattern' =>'CFA pattern', 'exif-customrendered' =>'Custom image processing', 'exif-exposuremode' =>'Exposure mode', 'exif-whitebalance' =>'White Balance', 'exif-digitalzoomratio' =>'Digital zoom ratio', 'exif-focallengthin35mmfilm' =>'Focal length in 35 mm film', 'exif-scenecapturetype' =>'Scene capture type', 'exif-gaincontrol' =>'Scene control', 'exif-contrast' =>'Contrast', 'exif-saturation' =>'Saturation', 'exif-sharpness' =>'Sharpness', 'exif-devicesettingdescription' =>'Device settings description', 'exif-subjectdistancerange' =>'Subject distance range', 'exif-imageuniqueid' =>'Unique image ID', 'exif-gpsversionid' =>'GPS tag version', 'exif-gpslatituderef' =>'North or South Latitude', 'exif-gpslatitude' =>'Latitude', 'exif-gpslongituderef' =>'East or West Longitude', 'exif-gpslongitude' =>'Longitude', 'exif-gpsaltituderef' =>'Altitude reference', 'exif-gpsaltitude' =>'Altitude', 'exif-gpstimestamp' =>'GPS time (atomic clock)', 'exif-gpssatellites' =>'Satellites used for measurement', 'exif-gpsstatus' =>'Receiver status', 'exif-gpsmeasuremode' =>'Measurement mode', 'exif-gpsdop' =>'Measurement precision', 'exif-gpsspeedref' =>'Speed unit', 'exif-gpsspeed' =>'Speed of GPS receiver', 'exif-gpstrackref' =>'Reference for direction of movement', 'exif-gpstrack' =>'Direction of movement', 'exif-gpsimgdirectionref' =>'Reference for direction of image', 'exif-gpsimgdirection' =>'Direction of image', 'exif-gpsmapdatum' =>'Geodetic survey data used', 'exif-gpsdestlatituderef' =>'Reference for latitude of destination', 'exif-gpsdestlatitude' =>'Latitude destination', 'exif-gpsdestlongituderef' =>'Reference for longitude of destination', 'exif-gpsdestlongitude' =>'Longitude of destination', 'exif-gpsdestbearingref' =>'Reference for bearing of destination', 'exif-gpsdestbearing' =>'Bearing of destination', 'exif-gpsdestdistanceref' =>'Reference for distance to destination', 'exif-gpsdestdistance' =>'Distance to destination', 'exif-gpsprocessingmethod' =>'Name of GPS processing method', 'exif-gpsareainformation' =>'Name of GPS area', 'exif-gpsdatestamp' =>'GPS date', 'exif-gpsdifferential' =>'GPS differential correction', # Make & model, can be wikified in order to link to the camera and model name 'exif-make-value' => '$1', 'exif-model-value' =>'$1', 'exif-software-value' => '$1', # Exif attributes 'exif-compression-1' => 'Uncompressed', 'exif-compression-6' => 'JPEG', 'exif-photometricinterpretation-2' => 'RGB', 'exif-photometricinterpretation-6' => 'YCbCr', 'exif-orientation-1' => 'Normal', // 0th row: top; 0th column: left 'exif-orientation-2' => 'Flipped horizontally', // 0th row: top; 0th column: right 'exif-orientation-3' => 'Rotated 180°', // 0th row: bottom; 0th column: right 'exif-orientation-4' => 'Flipped vertically', // 0th row: bottom; 0th column: left 'exif-orientation-5' => 'Rotated 90° CCW and flipped vertically', // 0th row: left; 0th column: top 'exif-orientation-6' => 'Rotated 90° CW', // 0th row: right; 0th column: top 'exif-orientation-7' => 'Rotated 90° CW and flipped vertically', // 0th row: right; 0th column: bottom 'exif-orientation-8' => 'Rotated 90° CCW', // 0th row: left; 0th column: bottom 'exif-planarconfiguration-1' => 'chunky format', 'exif-planarconfiguration-2' => 'planar format', 'exif-xyresolution-i' => '$1 dpi', 'exif-xyresolution-c' => '$1 dpc', 'exif-colorspace-1' => 'sRGB', 'exif-colorspace-ffff.h' => 'FFFF.H', 'exif-componentsconfiguration-0' => 'does not exist', 'exif-componentsconfiguration-1' => 'Y', 'exif-componentsconfiguration-2' => 'Cb', 'exif-componentsconfiguration-3' => 'Cr', 'exif-componentsconfiguration-4' => 'R', 'exif-componentsconfiguration-5' => 'G', 'exif-componentsconfiguration-6' => 'B', 'exif-exposureprogram-0' => 'Not defined', 'exif-exposureprogram-1' => 'Manual', 'exif-exposureprogram-2' => 'Normal program', 'exif-exposureprogram-3' => 'Aperture priority', 'exif-exposureprogram-4' => 'Shutter priority', 'exif-exposureprogram-5' => 'Creative program (biased toward depth of field)', 'exif-exposureprogram-6' => 'Action program (biased toward fast shutter speed)', 'exif-exposureprogram-7' => 'Portrait mode (for closeup photos with the background out of focus)', 'exif-exposureprogram-8' => 'Landscape mode (for landscape photos with the background in focus)', 'exif-subjectdistance-value' => '$1 metres', 'exif-meteringmode-0' => 'Unknown', 'exif-meteringmode-1' => 'Average', 'exif-meteringmode-2' => 'CenterWeightedAverage', 'exif-meteringmode-3' => 'Spot', 'exif-meteringmode-4' => 'MultiSpot', 'exif-meteringmode-5' => 'Pattern', 'exif-meteringmode-6' => 'Partial', 'exif-meteringmode-255' => 'Other', 'exif-lightsource-0' => 'Unknown', 'exif-lightsource-1' => 'Daylight', 'exif-lightsource-2' => 'Fluorescent', 'exif-lightsource-3' => 'Tungsten (incandescent light)', 'exif-lightsource-4' => 'Flash', 'exif-lightsource-9' => 'Fine weather', 'exif-lightsource-10' => 'Cloudy weather', 'exif-lightsource-11' => 'Shade', 'exif-lightsource-12' => 'Daylight fluorescent (D 5700 – 7100K)', 'exif-lightsource-13' => 'Day white fluorescent (N 4600 – 5400K)', 'exif-lightsource-14' => 'Cool white fluorescent (W 3900 – 4500K)', 'exif-lightsource-15' => 'White fluorescent (WW 3200 – 3700K)', 'exif-lightsource-17' => 'Standard light A', 'exif-lightsource-18' => 'Standard light B', 'exif-lightsource-19' => 'Standard light C', 'exif-lightsource-20' => 'D55', 'exif-lightsource-21' => 'D65', 'exif-lightsource-22' => 'D75', 'exif-lightsource-23' => 'D50', 'exif-lightsource-24' => 'ISO studio tungsten', 'exif-lightsource-255' => 'Other light source', 'exif-focalplaneresolutionunit-2' => 'inches', 'exif-sensingmethod-1' => 'Undefined', 'exif-sensingmethod-2' => 'One-chip color area sensor', 'exif-sensingmethod-3' => 'Two-chip color area sensor', 'exif-sensingmethod-4' => 'Three-chip color area sensor', 'exif-sensingmethod-5' => 'Color sequential area sensor', 'exif-sensingmethod-7' => 'Trilinear sensor', 'exif-sensingmethod-8' => 'Color sequential linear sensor', 'exif-filesource-3' => 'DSC', 'exif-scenetype-1' => 'A directly photographed image', 'exif-customrendered-0' => 'Normal process', 'exif-customrendered-1' => 'Custom process', 'exif-exposuremode-0' => 'Auto exposure', 'exif-exposuremode-1' => 'Manual exposure', 'exif-exposuremode-2' => 'Auto bracket', 'exif-whitebalance-0' => 'Auto white balance', 'exif-whitebalance-1' => 'Manual white balance', 'exif-scenecapturetype-0' => 'Standard', 'exif-scenecapturetype-1' => 'Landscape', 'exif-scenecapturetype-2' => 'Portrait', 'exif-scenecapturetype-3' => 'Night scene', 'exif-gaincontrol-0' => 'None', 'exif-gaincontrol-1' => 'Low gain up', 'exif-gaincontrol-2' => 'High gain up', 'exif-gaincontrol-3' => 'Low gain down', 'exif-gaincontrol-4' => 'High gain down', 'exif-contrast-0' => 'Normal', 'exif-contrast-1' => 'Soft', 'exif-contrast-2' => 'Hard', 'exif-saturation-0' => 'Normal', 'exif-saturation-1' => 'Low saturation', 'exif-saturation-2' => 'High saturation', 'exif-sharpness-0' => 'Normal', 'exif-sharpness-1' => 'Soft', 'exif-sharpness-2' => 'Hard', 'exif-subjectdistancerange-0' => 'Unknown', 'exif-subjectdistancerange-1' => 'Macro', 'exif-subjectdistancerange-2' => 'Close view', 'exif-subjectdistancerange-3' => 'Distant view', // Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef 'exif-gpslatitude-n' => 'North latitude', 'exif-gpslatitude-s' => 'South latitude', // Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef 'exif-gpslongitude-e' => 'East longitude', 'exif-gpslongitude-w' => 'West longitude', 'exif-gpsstatus-a' => 'Measurement in progress', 'exif-gpsstatus-v' => 'Measurement interoperability', 'exif-gpsmeasuremode-2' => '2-dimensional measurement', 'exif-gpsmeasuremode-3' => '3-dimensional measurement', // Pseudotags used for GPSSpeedRef and GPSDestDistanceRef 'exif-gpsspeed-k' => 'Kilometres per hour', 'exif-gpsspeed-m' => 'Miles per hour', 'exif-gpsspeed-n' => 'Knots', // Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef 'exif-gpsdirection-t' => 'True direction', 'exif-gpsdirection-m' => 'Magnetic direction', # external editor support 'edit-externally' => 'Edit this file using an external application', 'edit-externally-help' => 'See the [http://meta.wikimedia.org/wiki/Help:External_editors setup instructions] for more information.', # 'all' in various places, this might be different for inflected languages 'recentchangesall' => 'all', 'imagelistall' => 'all', 'watchlistall1' => 'all', 'watchlistall2' => 'all', 'namespacesall' => 'all', # E-mail address confirmation 'confirmemail' => 'Confirm E-mail address', 'confirmemail_text' => "This wiki requires that you validate your e-mail address before using e-mail features. Activate the button below to send a confirmation mail to your address. The mail will include a link containing a code; load the link in your browser to confirm that your e-mail address is valid.", 'confirmemail_send' => 'Mail a confirmation code', 'confirmemail_sent' => 'Confirmation e-mail sent.', 'confirmemail_sendfailed' => 'Could not send confirmation mail. Check address for invalid characters.', 'confirmemail_invalid' => 'Invalid confirmation code. The code may have expired.', 'confirmemail_needlogin' => 'You need to $1 to confirm your email address.', 'confirmemail_success' => 'Your e-mail address has been confirmed. You may now log in and enjoy the wiki.', 'confirmemail_loggedin' => 'Your e-mail address has now been confirmed.', 'confirmemail_error' => 'Something went wrong saving your confirmation.', 'confirmemail_subject' => '{{SITENAME}} e-mail address confirmation', 'confirmemail_body' => "Someone, probably you from IP address $1, has registered an account \"$2\" with this e-mail address on {{SITENAME}}. To confirm that this account really does belong to you and activate e-mail features on {{SITENAME}}, open this link in your browser: $3 If this is *not* you, don't follow the link. This confirmation code will expire at $4.", # Inputbox extension, may be useful in other contexts as well 'tryexact' => 'Try exact match', 'searchfulltext' => 'Search full text', 'createarticle' => 'Create article', # Scary transclusion 'scarytranscludedisabled' => '[Interwiki transcluding is disabled]', 'scarytranscludefailed' => '[Template fetch failed for $1; sorry]', 'scarytranscludetoolong' => '[URL is too long; sorry]', # Trackbacks 'trackbackbox' => '<div id="mw_trackbacks"> Trackbacks for this article:<br /> $1 </div>', 'trackback' => '; $4$5 : [$2 $1]', 'trackbackexcerpt' => '; $4$5 : [$2 $1]: <nowiki>$3</nowiki>', 'trackbackremove' => ' ([$1 Delete])', 'trackbacklink' => 'Trackback', 'trackbackdeleteok' => 'The trackback was successfully deleted.', # delete conflict 'deletedwhileediting' => 'Warning: This page has been deleted after you started editing!', 'confirmrecreate' => 'User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason: : \'\'$2\'\' Please confirm that really want to recreate this page.', 'recreate' => 'Recreate', 'tooltip-recreate' => 'Recreate the page despite it has been deleted', 'unit-pixel' => 'px', # HTML dump 'redirectingto' => 'Redirecting to [[$1]]...', # action=purge 'confirm_purge' => "Clear the cache of this page?\n\n$1", 'confirm_purge_button' => 'OK', 'youhavenewmessagesmulti' => "You have new messages on $1", 'newtalkseperator' => ',_', 'searchcontaining' => "Search for articles containing ''$1''.", 'searchnamed' => "Search for articles named ''$1''.", 'articletitles' => "Articles starting with ''$1''", 'hideresults' => 'Hide results', # DISPLAYTITLE 'displaytitle' => '(Link to this page as [[$1]])', # Separator for categories in page lists # Please don't localise this 'catseparator' => '|', 'loginlanguagelabel' => 'Language: $1', # Don't duplicate this in translations; defaults should remain consistent 'loginlanguagelinks' => "* Deutsch|de * English|en * Esperanto|eo * Français|fr * Español|es * Italiano|it * Nederlands|nl", ); ?>