Merge "Improved rate limit log to mention IP"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 13 May 2014 19:33:19 +0000 (19:33 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 13 May 2014 19:33:19 +0000 (19:33 +0000)
392 files changed:
.gitattributes [new file with mode: 0644]
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
composer-example.json [deleted file]
composer.json [new file with mode: 0644]
docs/hooks.txt
img_auth.php
includes/Article.php
includes/AutoLoader.php
includes/Collation.php
includes/DefaultSettings.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/ImageQueryPage.php
includes/Init.php
includes/Licenses.php
includes/Linker.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Pager.php
includes/Preferences.php
includes/PrefixSearch.php
includes/RevisionList.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinTemplate.php
includes/SquidPurgeClient.php
includes/StatCounter.php
includes/StreamFile.php
includes/StubObject.php
includes/TimestampException.php
includes/Title.php
includes/TitleArrayFromResult.php
includes/User.php
includes/UserArrayFromResult.php
includes/UserMailer.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/WikiFilePage.php
includes/WikiPage.php
includes/Xml.php
includes/api/ApiBase.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiRollback.php
includes/cache/LinkCache.php
includes/changes/RecentChange.php
includes/content/AbstractContent.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/JavaScriptContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLHiddenField.php
includes/installer/Installer.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/ca.json
includes/installer/i18n/id.json
includes/installer/i18n/ksh.json
includes/installer/i18n/mk.json
includes/installer/i18n/ms.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/ro.json
includes/installer/i18n/sco.json
includes/installer/i18n/sk.json
includes/installer/i18n/zh-hant.json
includes/libs/JavaScriptMinifier.php
includes/libs/jsminplus.php
includes/libs/lessc.inc.php
includes/media/Bitmap.php
includes/media/Jpeg.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerStub.php
includes/rcfeed/IRCColourfulRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchSqlite.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteList.php
includes/site/SiteSQLStore.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php
includes/utils/Cdb.php
includes/utils/CdbPHP.php
includes/utils/ConfEditor.php [deleted file]
includes/utils/UIDGenerator.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/aeb.json
languages/i18n/af.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/li.json
languages/i18n/lmo.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/nah.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sdc.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/xal.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/generateJsonI18n.php
maintenance/install.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc [deleted file]
maintenance/language/rebuildLanguage.php [deleted file]
maintenance/language/writeMessagesArray.inc [deleted file]
maintenance/oracle/archives/patch-page_links_updated.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-rc_source.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-user_password_expire.sql
maintenance/oracle/tables.sql
maintenance/pageExists.php [new file with mode: 0644]
maintenance/update.php [changed mode: 0644->0755]
resources/Resources.php
resources/lib/jquery/jquery.migrate.js [new file with mode: 0644]
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/src/mediawiki.api/mediawiki.api.js
resources/src/mediawiki.api/mediawiki.api.watch.js
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki/mediawiki.toc.js
resources/src/mediawiki/mediawiki.util.js
skins/common/commonContent.css
skins/common/commonPrint.css
skins/common/shared.css
skins/common/wikibits.js
skins/vector/components/thumbnails.less [new file with mode: 0644]
skins/vector/screen.less
tests/parser/parserTest.inc
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/install-phpunit.sh
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
thumb.php

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..50ca329
--- /dev/null
@@ -0,0 +1 @@
+*.sh eol=lf
index 37e304d..575fdc3 100644 (file)
@@ -39,9 +39,12 @@ production.
 * $wgPasswordSenderName has been removed and is no longer functional. To set a
   custom mailer name, the system message 'emailsender' should be modified
   (default: "{{SITENAME}}").
-* If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
+* (bug 63269) Email notifications were not correctly handling the
+  [[MediaWiki:Helppage]] message being set to a full URL (the default).
+  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
   you'll need to edit it locally to include the URL via the new variable
-  $HELPPAGE instead of the parser functions fullurl and canonicalurl.
+  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
+  you don't have to do anything.
 * $wgDBAhandler was removed as the only class using it was also removed
 * The 'max threads' setting was removed from $wgDBservers.
 * Support for AdminSettings.php has been completely removed. All configuration
@@ -513,7 +516,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
index 7cca5ef..439e5f5 100644 (file)
@@ -9,16 +9,23 @@ MediaWiki 1.24 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.24 ===
+* The server's canonical hostname is available as $wgServerName, which is
+  exposed in both mw.config and ApiQuerySiteInfo.
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
   WhatLinksHere entries.
+* Added a new hook, "ContentGetParserOutput", to customize parser output for
+  a given content object.
+* Deprecated the hook "ShowRawCssJs", use "ContentGetParserOutput" instead.
 * HTMLForm's HTMLTextField now supports the 'url' type.
 * HTMLForm fields may now be dynamically hidden based on the values of other
   fields in the form.
 * HTMLForm now supports multiple copies of an input field or set of input
   fields, e.g. the form may request "one or more usernames" without having to
   have the user enter delimited list of names into a text field.
+* Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
+  the sidebar just before its display.
 
 === Bug fixes in 1.24 ===
 * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
@@ -30,8 +37,11 @@ production.
   which used to collapse some sidebar elements by default.
 * (bug 890) Links in Special:RecentChanges and Special:Watchlist no longer
   follow redirects to their target pages.
+* Parser now dies early if called recursively, instead of producing subtle bugs.
 
 === Web API changes in 1.24 ===
+* action=parse API now supports prop=modules, which provides the list of
+  ResourceLoader modules that should be used to enhance the parsed content.
 
 === Languages updated in 1.24 ===
 
@@ -54,6 +64,24 @@ changes to languages because of Bugzilla reports.
 * CLDRPluralRuleConverter_Operator to CLDRPluralRuleConverterOperator
 * CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
 * CSSJanus_Tokenizer to CSSJanusTokenizer
+* MediaWiki_I18N to MediaWikiI18N
+* RevDel_ArchiveItem to RevDelArchiveItem
+* RevDel_ArchiveList to RevDelArchiveList
+* RevDel_ArchivedFileItem to RevDelArchivedFileItem
+* RevDel_ArchivedFileList to RevDelArchivedFileList
+* RevDel_ArchivedRevisionItem to RevDelArchivedRevisionItem
+* RevDel_FileItem to RevDelFileItem
+* RevDel_FileList to RevDelFileList
+* RevDel_Item to RevDelItem
+* RevDel_List to RevDelList
+* RevDel_LogItem to RevDelLogItem
+* RevDel_LogList to RevDelLogList
+* RevDel_RevisionItem to RevDelRevisionItem
+* RevDel_RevisionList to RevDelRevisionList
+
+==== Removed classes ====
+* IPBlockForm - Use SpecialBlock directly
+* WatchlistEditor - Use SpecialEditWatchlist directly
 
 == Compatibility ==
 
@@ -73,7 +101,7 @@ The supported versions are:
 
 == Upgrading ==
 
-1.24 has several database changes since 1.22, and will not work without schema
+1.24 has several database changes since 1.23, and will not work without schema
 updates. Note that due to changes to some very large tables like the revision
 table, the schema update may take quite long (minutes on a medium sized site,
 many hours on a large site).
@@ -93,7 +121,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
diff --git a/composer-example.json b/composer-example.json
deleted file mode 100644 (file)
index 85304c1..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-       "require": {
-               "php": ">=5.3.2"
-       },
-       "suggest": {
-               "ext-fileinfo": "More accurate file type detection for uploaded files",
-               "ext-mbstring": "Faster unicode handling",
-               "ext-wikidiff2": "Faster diff generation",
-               "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
-       },
-       "autoload": {
-               "psr-0": {
-                       "ComposerHookHandler": "includes/composer"
-               }
-       },
-       "scripts": {
-               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
-               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
-       }
-}
diff --git a/composer.json b/composer.json
new file mode 100644 (file)
index 0000000..ded3365
--- /dev/null
@@ -0,0 +1,30 @@
+{
+       "name": "mediawiki/core",
+       "description": "Free software wiki application developed by the Wikimedia Foundation and others",
+       "keywords": ["mediawiki", "wiki"],
+       "homepage": "https://www.mediawiki.org/",
+       "authors": [
+               {
+                       "name": "MediaWiki Community",
+                       "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
+               }
+       ],
+       "license": "GPL-2.0",
+       "support": {
+               "issues": "https://bugzilla.wikimedia.org/",
+               "irc": "irc://irc.freenode.net/mediawiki",
+               "wiki": "https://www.mediawiki.org/"
+       },
+       "require": {
+               "php": ">=5.3.2"
+       },
+       "require-dev": {
+               "phpunit/phpunit": "*"
+       },
+       "suggest": {
+               "ext-fileinfo": "*",
+               "ext-mbstring": "*",
+               "ext-wikidiff2": "*",
+               "ext-apc": "*"
+       }
+}
index 688e0cd..966afd8 100644 (file)
@@ -250,6 +250,7 @@ $block: The block from which the autoblock is coming.
 'AbortEmailNotification': Can be used to cancel email notifications for an edit.
 $editor: The User who made the change.
 $title: The Title of the page that was edited.
+$rc: The current RecentChange object.
 
 'AbortLogin': Return false to cancel account login.
 $user: the User object being authenticated against
@@ -280,7 +281,7 @@ $title: the page title
 'SendWatchlistEmailNotification': Return true to send watchlist email notification
 $targetUser: the user whom to send watchlist email notification
 $title: the page title
-$this: EmailNotification object
+$enotif: EmailNotification object
 
 'AbortChangePassword': Return false to cancel password change.
 $user: the User object to which the password change is occuring
@@ -887,6 +888,19 @@ $title: the Title in question.
 Handler functions that modify $ok should generally return false to prevent further
 hooks from further modifying $ok.
 
+'ContentGetParserOutput': Customize parser output for a given content object,
+called by AbstractContent::getParserOutput. May be used to override the normal
+model-specific rendering of page content.
+$content: The Content to render
+$title: Title of the page, as context
+$revId: The revision ID, as context
+$options: ParserOptions for rendering. To avoid confusing the parser cache,
+the output can only depend on parameters provided to this hook function, not on global state.
+$generateHtml: boolean, indicating whether full HTML should be generated. If false,
+generation of HTML may be skipped, but other information should still be present in the
+ParserOutput object.
+&$output: ParserOutput, to manipulate or replace
+
 'ConvertContent': Called by AbstractContent::convert when a conversion to another
 content model is requested.
 $content: The Content object to be converted.
@@ -2171,7 +2185,7 @@ $title : Current Title object being displayed in search results.
 $article: The article object corresponding to the page
 
 'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
-DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
+DEPRECATED, use the ContentGetParserOutput hook instead!
 $text: Text being shown
 $title: Title of the custom script/stylesheet page
 $output: Current OutputPage object
@@ -2226,6 +2240,12 @@ $skin: Skin object
 &$bar: Sidebar contents
 Modify $bar to add or modify sidebar portlets.
 
+'SidebarBeforeOutput': Allows to edit sidebar just before its output by skins.
+$skin Skin object
+&$bar: Sidebar content
+Modify $bar to add or modify sidebar portlets.
+Warning: This hook is run on each display. You should consider to use 'SkinBuildSidebar' that is aggressively cached.
+
 'SkinCopyrightFooter': Allow for site and per-namespace customization of
 copyright notice.
 $title: displayed page title
@@ -2596,7 +2616,7 @@ $user: Current user object
 &$whitelisted: Boolean value of whether this title is whitelisted
 
 'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
-$this: Title object to purge
+$title: Title object to purge
 &$urls: An array of URLs to purge from the caches, to be manipulated.
 
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
index a3485df..6f449c6 100644 (file)
@@ -106,14 +106,15 @@ function wfImageAuthMain() {
 
        // Get the local file repository
        $repo = RepoGroup::singleton()->getRepo( 'local' );
+       $zone = strstr( ltrim( $path, '/' ), '/', true );
 
        // Get the full file storage path and extract the source file name.
        // (e.g. 120px-Foo.png => Foo.png or page2-120px-Foo.png => Foo.png).
-       // This only applies to thumbnails, and all thumbnails should
+       // This only applies to thumbnails/transcoded, and each of them should
        // be under a folder that has the source file name.
-       if ( strpos( $path, '/thumb/' ) === 0 ) {
-               $name = wfBaseName( dirname( $path ) ); // file is a thumbnail
-               $filename = $repo->getZonePath( 'thumb' ) . substr( $path, 6 ); // strip "/thumb"
+       if ( $zone === 'thumb' || $zone === 'transcoded' ) {
+               $name = wfBaseName( dirname( $path ) );
+               $filename = $repo->getZonePath( $zone ) . substr( $path, strlen( "/".$zone ) );
                // Check to see if the file exists
                if ( !$repo->fileExists( $filename ) ) {
                        wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
index 0a4b5ee..3bb1563 100644 (file)
@@ -832,8 +832,9 @@ class Article implements Page {
         * Show a page view for a page formatted as CSS or JavaScript. To be called by
         * Article::view() only.
         *
-        * This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
-        * page views.
+        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+        * more flexibility.
         *
         * @param bool $showCacheHint Whether to show a message telling the user
         *   to clear the browser cache (default: true).
index bfee420..6c413c0 100644 (file)
@@ -135,7 +135,7 @@ $wgAutoloadLocalClasses = array(
        'MagicWordArray' => 'includes/MagicWord.php',
        'MailAddress' => 'includes/UserMailer.php',
        'MediaWiki' => 'includes/Wiki.php',
-       'MediaWiki_I18N' => 'includes/SkinTemplate.php',
+       'MediaWikiI18N' => 'includes/SkinTemplate.php',
        'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
@@ -876,19 +876,19 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
 
        # includes/revisiondelete
-       'RevDel_ArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_Item' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_List' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_LogItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelItem' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelList' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelLogItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelLogList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionList' => 'includes/revisiondelete/RevisionDelete.php',
        'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
        'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
 
@@ -952,7 +952,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLBlockedUsersItemSelect' => 'includes/specials/SpecialBlockList.php',
        'ImageListPager' => 'includes/specials/SpecialListfiles.php',
        'ImportReporter' => 'includes/specials/SpecialImport.php',
-       'IPBlockForm' => 'includes/specials/SpecialBlock.php',
        'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
        'ListredirectsPage' => 'includes/specials/SpecialListredirects.php',
        'ListDuplicatedFilesPage' => 'includes/specials/SpecialListDuplicatedFiles.php',
@@ -1063,7 +1062,6 @@ $wgAutoloadLocalClasses = array(
        'WantedFilesPage' => 'includes/specials/SpecialWantedfiles.php',
        'WantedPagesPage' => 'includes/specials/SpecialWantedpages.php',
        'WantedTemplatesPage' => 'includes/specials/SpecialWantedtemplates.php',
-       'WatchlistEditor' => 'includes/specials/SpecialEditWatchlist.php',
        'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
 
        # includes/templates
@@ -1107,9 +1105,6 @@ $wgAutoloadLocalClasses = array(
        'CdbWriter' => 'includes/utils/Cdb.php',
        'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
        'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
-       'ConfEditor' => 'includes/utils/ConfEditor.php',
-       'ConfEditorParseError' => 'includes/utils/ConfEditor.php',
-       'ConfEditorToken' => 'includes/utils/ConfEditor.php',
        'DoubleReplacer' => 'includes/utils/StringUtils.php',
        'ExplodeIterator' => 'includes/utils/StringUtils.php',
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
@@ -1168,7 +1163,6 @@ $wgAutoloadLocalClasses = array(
        'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
        'ExtensionLanguages' => 'maintenance/language/languages.inc',
        'Languages' => 'maintenance/language/languages.inc',
-       'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
        'StatsOutput' => 'maintenance/language/StatOutputs.php',
        'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
        'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
index 071a278..4c85e52 100644 (file)
@@ -208,10 +208,15 @@ class IcuCollation extends Collation {
                // Verified by native speakers
                'be' => array( "Ё" ),
                'be-tarask' => array( "Ё" ),
+               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'en' => array(),
+               'fa' => array( "آ", "ء", "ه" ),
                'fi' => array( "Å", "Ä", "Ö" ),
+               'fr' => array(),
                'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
+               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'it' => array(),
+               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
                'pt' => array(),
                'ru' => array(),
@@ -229,7 +234,6 @@ class IcuCollation extends Collation {
                'ca' => array(),
                'co' => array(),
                'cs' => array( "Č", "Ch", "Ř", "Š", "Ž" ),
-               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'da' => array( "Æ", "Ø", "Å" ),
                'de' => array(),
                'dsb' => array( "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
@@ -238,9 +242,7 @@ class IcuCollation extends Collation {
                'es' => array( "Ñ" ),
                'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
                'eu' => array( "Ñ" ),
-               'fa' => array( "آ", "ء", "ه" ),
                'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
-               'fr' => array(),
                'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
                'fy' => array(),
                'ga' => array(),
@@ -248,7 +250,6 @@ class IcuCollation extends Collation {
                'gl' => array( "Ch", "Ll", "Ñ" ),
                'hr' => array( "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ),
                'hsb' => array( "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
-               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'kk' => array( "Ү", "І" ),
                'kl' => array( "Æ", "Ø", "Å" ),
                'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
@@ -256,7 +257,6 @@ class IcuCollation extends Collation {
                'la' => array(),
                'lb' => array(),
                'lt' => array( "Č", "Š", "Ž" ),
-               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'mk' => array(),
                'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
                'mt' => array( "Ċ", "Ġ", "Għ", "Ħ", "Ż" ),
index 2b8aec3..64512c8 100644 (file)
@@ -104,6 +104,13 @@ $wgServer = WebRequest::detectServer();
  */
 $wgCanonicalServer = false;
 
+/**
+ * Server name. This is automatically computed by parsing the bare
+ * hostname out of $wgCanonicalServer. It should not be customized.
+ * @since 1.24
+ */
+$wgServerName = false;
+
 /************************************************************************//**
  * @name   Script path settings
  * @{
@@ -1304,21 +1311,22 @@ $wgDjvuOutputExtension = 'jpg';
  * @{
  */
 
-$serverName = substr( $wgServer, strrpos( $wgServer, '/' ) + 1 );
 
 /**
  * Site admin email address.
+ *
+ * Defaults to "wikiadmin@{$wgServerName}".
  */
-$wgEmergencyContact = 'wikiadmin@' . $serverName;
+$wgEmergencyContact = false;
 
 /**
  * Password reminder email address.
  *
  * The address we should use as sender when a user is requesting his password.
+ *
+ * Defaults to "apache@{$wgServerName}".
  */
-$wgPasswordSender = 'apache@' . $serverName;
-
-unset( $serverName ); # Don't leak local variables to global scope
+$wgPasswordSender = false;
 
 /**
  * Password reminder name
@@ -2885,11 +2893,6 @@ $wgShowIPinHeader = true;
  */
 $wgSiteNotice = '';
 
-/**
- * A subtitle to add to the tagline, for skins that have it/
- */
-$wgExtraSubtitle = '';
-
 /**
  * If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
  */
@@ -3605,6 +3608,9 @@ $wgNamespacesWithSubpages = array(
  * Tracking categories allow pages with certain characteristics to be tracked.
  * It works by adding any such page to a category automatically.
  *
+ * A message with the suffix '-desc' should be added as a description message
+ * to have extra information on Special:TrackingCategories.
+ *
  * @since 1.23
  */
 $wgTrackingCategories = array(
@@ -3615,6 +3621,8 @@ $wgTrackingCategories = array(
        'post-expand-template-inclusion-category',
        'hidden-category-category',
        'broken-file-category',
+       'node-count-exceeded-category',
+       'expansion-depth-exceeded-category',
 );
 
 /**
@@ -4252,6 +4260,7 @@ $wgGroupPermissions['*']['editmyoptions'] = true;
 $wgGroupPermissions['user']['move'] = true;
 $wgGroupPermissions['user']['move-subpages'] = true;
 $wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
+$wgGroupPermissions['user']['move-categorypages'] = true;
 $wgGroupPermissions['user']['movefile'] = true;
 $wgGroupPermissions['user']['read'] = true;
 $wgGroupPermissions['user']['edit'] = true;
@@ -4299,6 +4308,7 @@ $wgGroupPermissions['sysop']['importupload'] = true;
 $wgGroupPermissions['sysop']['move'] = true;
 $wgGroupPermissions['sysop']['move-subpages'] = true;
 $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
+$wgGroupPermissions['sysop']['move-categorypages'] = true;
 $wgGroupPermissions['sysop']['patrol'] = true;
 $wgGroupPermissions['sysop']['autopatrol'] = true;
 $wgGroupPermissions['sysop']['protect'] = true;
@@ -4818,7 +4828,7 @@ $wgProxyKey = false;
  */
 
 /**
- * Default cookie expiration time. Setting to 0 makes all cookies session-only.
+ * Default cookie lifetime, in seconds. Setting to 0 makes all cookies session-only.
  */
 $wgCookieExpiration = 180 * 86400;
 
index d407a0e..83ce755 100644 (file)
@@ -102,7 +102,9 @@ class FeedUtils {
         * @param string $actiontext Text of the action; in case of log event
         * @return string
         */
-       public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext = '' ) {
+       public static function formatDiffRow( $title, $oldid, $newid, $timestamp,
+               $comment, $actiontext = ''
+       ) {
                global $wgFeedDiffCutoff, $wgLang;
                wfProfileIn( __METHOD__ );
 
@@ -245,9 +247,15 @@ class FeedUtils {
                        'diff'             => 'background-color: white; color:black;',
                        'diff-otitle'      => 'background-color: white; color:black; text-align: center;',
                        'diff-ntitle'      => 'background-color: white; color:black; text-align: center;',
-                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;',
-                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;',
-                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
+                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; '
+                               . 'border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; '
+                               . 'border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
                        'diffchange'       => 'font-weight: bold; text-decoration: none;',
                );
 
index 44aaeb4..b4e2458 100644 (file)
@@ -83,7 +83,10 @@ class FileDeleteForm {
                $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
                if ( $this->oldimage ) {
-                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
+                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName(
+                               $this->title,
+                               $this->oldimage
+                       );
                }
 
                if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
@@ -107,11 +110,20 @@ class FileDeleteForm {
                                $reason = $deleteReasonList;
                        }
 
-                       $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
+                       $status = self::doDelete(
+                               $this->title,
+                               $this->file,
+                               $this->oldimage,
+                               $reason,
+                               $suppress,
+                               $wgUser
+                       );
 
                        if ( !$status->isGood() ) {
                                $wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
-                               $wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
+                               $wgOut->addWikiText( '<div class="error">' .
+                                       $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' )
+                                       . '</div>' );
                        }
                        if ( $status->ok ) {
                                $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
@@ -141,7 +153,9 @@ class FileDeleteForm {
         * @throws MWException
         * @return bool|Status
         */
-       public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
+       public static function doDelete( &$title, &$file, &$oldimage, $reason,
+               $suppress, User $user = null
+       ) {
                if ( $user === null ) {
                        global $wgUser;
                        $user = $wgUser;
@@ -149,7 +163,7 @@ class FileDeleteForm {
 
                if ( $oldimage ) {
                        $page = null;
-                       $status = $file->deleteOld( $oldimage, $reason, $suppress );
+                       $status = $file->deleteOld( $oldimage, $reason, $suppress, $user );
                        if ( $status->ok ) {
                                // Need to do a log item
                                $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
@@ -180,7 +194,7 @@ class FileDeleteForm {
                                // doDeleteArticleReal() returns a non-fatal error status if the page
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
-                                       $status = $file->delete( $reason, $suppress );
+                                       $status = $file->delete( $reason, $suppress, $user );
                                        if ( $status->isOK() ) {
                                                $dbw->commit( __METHOD__ );
                                        } else {
@@ -188,7 +202,8 @@ class FileDeleteForm {
                                        }
                                }
                        } catch ( MWException $e ) {
-                               // rollback before returning to prevent UI from displaying incorrect "View or restore N deleted edits?"
+                               // Rollback before returning to prevent UI from displaying
+                               // incorrect "View or restore N deleted edits?"
                                $dbw->rollback( __METHOD__ );
                                throw $e;
                        }
@@ -266,8 +281,14 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMessage( 'filedelete-submit' )->text(),
-                                               array( 'name' => 'mw-filedelete-submit', 'id' => 'mw-filedelete-submit', 'tabindex' => '4' ) ) .
+                                       Xml::submitButton(
+                                               wfMessage( 'filedelete-submit' )->text(),
+                                               array(
+                                                       'name' => 'mw-filedelete-submit',
+                                                       'id' => 'mw-filedelete-submit',
+                                                       'tabindex' => '4'
+                                               )
+                                       ) .
                                "</td>
                        </tr>" .
                        Xml::closeElement( 'table' ) .
@@ -309,8 +330,10 @@ class FileDeleteForm {
        private function prepareMessage( $message ) {
                global $wgLang;
                if ( $this->oldimage ) {
+                       # Message keys used:
+                       # 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
                        return wfMessage(
-                               "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
+                               "{$message}-old",
                                wfEscapeWikiText( $this->title->getText() ),
                                $wgLang->date( $this->getTimestamp(), true ),
                                $wgLang->time( $this->getTimestamp(), true ),
index dc2fff1..304c1bc 100644 (file)
@@ -195,7 +195,10 @@ class GitInfo {
 
                if ( !isset( $this->cache['headCommitDate'] ) ) {
                        $date = false;
-                       if ( is_file( $wgGitBin ) && is_executable( $wgGitBin ) ) {
+                       if ( is_file( $wgGitBin ) &&
+                               is_executable( $wgGitBin ) &&
+                               $this->getHead() !== false
+                       ) {
                                $environment = array( "GIT_DIR" => $this->basedir );
                                $cmd = wfEscapeShellArg( $wgGitBin ) .
                                        " show -s --format=format:%ct HEAD";
index d94d2f1..ed99aa9 100644 (file)
@@ -2922,8 +2922,10 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
                $readyPipes = $pipes;
 
                // Clear last error
+               // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
                @trigger_error( '' );
                if ( @stream_select( $readyPipes, $emptyArray, $emptyArray, null ) === false ) {
+                       // @codingStandardsIgnoreEnd
                        $error = error_get_last();
                        if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
                                continue;
@@ -3407,9 +3409,11 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
                        $decimal = bcadd( $decimal, $baseChars[$char] );
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
                        $result .= $baseChars[bcmod( $decimal, $destBase )];
                }
+               // @codingStandardsIgnoreEnd
 
                $result = strrev( $result );
        } else {
index 785e717..89457e8 100644 (file)
@@ -27,7 +27,8 @@
 /**
  * @since 1.18
  */
-class MWHookException extends MWException {}
+class MWHookException extends MWException {
+}
 
 /**
  * Hooks class.
@@ -37,7 +38,6 @@ class MWHookException extends MWException {}
  * @since 1.18
  */
 class Hooks {
-
        /**
         * Array of events mapped to an array of callbacks to be run
         * when that event is triggered.
index 2a8c9b1..5262ffe 100644 (file)
@@ -695,16 +695,20 @@ class Html {
         *
         * @param array $params Params to set.
         * - selected: [optional] Id of namespace which should be pre-selected
-        * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces
-        * - label: text for label to add before the field
-        * - exclude: [optional] Array of namespace ids to exclude
-        * - disable: [optional] Array of namespace ids for which the option should be disabled in the selector
+        * - all: [optional] Value of item for "all namespaces". If null or unset,
+        *   no "<option>" is generated to select all namespaces.
+        * - label: text for label to add before the field.
+        * - exclude: [optional] Array of namespace ids to exclude.
+        * - disable: [optional] Array of namespace ids for which the option should
+        *   be disabled in the selector.
         * @param array $selectAttribs HTML attributes for the generated select element.
-        * - id:   [optional], default: 'namespace'
-        * - name: [optional], default: 'namespace'
+        * - id:   [optional], default: 'namespace'.
+        * - name: [optional], default: 'namespace'.
         * @return string HTML code to select a namespace.
         */
-       public static function namespaceSelector( array $params = array(), array $selectAttribs = array() ) {
+       public static function namespaceSelector( array $params = array(),
+               array $selectAttribs = array()
+       ) {
                global $wgContLang;
 
                ksort( $selectAttribs );
index 987a683..b2209c3 100644 (file)
@@ -259,7 +259,8 @@ class HtmlFormatter {
         * specify the $element in the method it'll change the underlying dom and you won't be able to get
         * it back.
         *
-        * @param DOMElement|string|null $element ID of element to get HTML from or false to get it from the whole tree
+        * @param DOMElement|string|null $element ID of element to get HTML from or
+        *   false to get it from the whole tree
         * @return string Processed HTML
         */
        public function getText( $element = null ) {
index 75f7ba6..b0266cb 100644 (file)
@@ -47,12 +47,17 @@ abstract class ImageQueryPage extends QueryPage {
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
-                       for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+                       $i = 0;
+                       foreach ( $res as $row ) {
+                               $i++;
                                $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
                                $title = Title::makeTitleSafe( $namespace, $row->title );
                                if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
                                        $gallery->add( $title, $this->getCellHtml( $row ) );
                                }
+                               if ( $i === $num ) {
+                                       break;
+                               }
                        }
 
                        $out->addHTML( $gallery->toHtml() );
@@ -60,7 +65,8 @@ abstract class ImageQueryPage extends QueryPage {
        }
 
        // Gotta override this since it's abstract
-       function formatResult( $skin, $result ) { }
+       function formatResult( $skin, $result ) {
+       }
 
        /**
         * Get additional HTML to be shown in a results' cell
index 5b1dc83..d9aeb7b 100644 (file)
@@ -31,7 +31,7 @@
  * deprecated.
  */
 class MWInit {
-       static $compilerVersion;
+       private static $compilerVersion;
 
        /**
         * @deprecated since 1.22
index e3db5b4..54b779e 100644 (file)
  * A License class for use on Special:Upload
  */
 class Licenses extends HTMLFormField {
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $msg;
 
-       /**
-        * @var array
-        */
+       /** @var array */
        protected $licenses = array();
 
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $html;
        /**#@-*/
 
        /**
-        * Constructor
-        *
         * @param array $params
         */
        public function __construct( $params ) {
                parent::__construct( $params );
 
-               $this->msg = empty( $params['licenses'] ) ? wfMessage( 'licenses' )->inContentLanguage()->plain() : $params['licenses'];
+               $this->msg = empty( $params['licenses'] )
+                       ? wfMessage( 'licenses' )->inContentLanguage()->plain()
+                       : $params['licenses'];
                $this->selected = null;
 
                $this->makeLicenses();
@@ -198,19 +192,13 @@ class Licenses extends HTMLFormField {
  * A License class for use on Special:Upload (represents a single type of license).
  */
 class License {
-       /**
-        * @var string
-        */
-       var $template;
+       /** @var string */
+       public $template;
 
-       /**
-        * @var string
-        */
-       var $text;
+       /** @var string */
+       public $text;
 
        /**
-        * Constructor
-        *
         * @param string $str license name??
         */
        function __construct( $str ) {
index 6433d19..a912fde 100644 (file)
@@ -530,7 +530,7 @@ class Linker {
         *
         * @param array $handlerParams Associative array of media handler parameters, to be passed
         *       to transform(). Typical keys are "width" and "page".
-        * @param string $time Timestamp of the file, set as false for current
+        * @param string|bool $time Timestamp of the file, set as false for current
         * @param string $query Query params for desc url
         * @param int|null $widthOption Used by the parser to remember the user preference thumbnailsize
         * @since 1.20
index 56786f1..4781667 100644 (file)
@@ -270,7 +270,7 @@ class MagicWord {
         * Allow external reads of TTL array
         *
         * @param int $id
-        * @return array
+        * @return int
         */
        static function getCacheTTL( $id ) {
                if ( array_key_exists( $id, self::$mCacheTTLs ) ) {
index 31fbb07..8d4058e 100644 (file)
@@ -960,7 +960,14 @@ class Message {
         * @return string Wikitext parsed into HTML.
         */
        protected function parseText( $string ) {
-               $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
+               $out = MessageCache::singleton()->parse(
+                       $string,
+                       $this->title,
+                       /*linestart*/true,
+                       $this->interface,
+                       $this->language
+               );
+
                return $out instanceof ParserOutput ? $out->getText() : $out;
        }
 
@@ -974,7 +981,12 @@ class Message {
         * @return string Wikitext with {{-constructs replaced with their values.
         */
        protected function transformText( $string ) {
-               return MessageCache::singleton()->transform( $string, $this->interface, $this->language, $this->title );
+               return MessageCache::singleton()->transform(
+                       $string,
+                       $this->interface,
+                       $this->language,
+                       $this->title
+               );
        }
 
        /**
index f5b346c..5725898 100644 (file)
@@ -32,7 +32,6 @@
  * constituent messages or the resource itself is changed.
  */
 class MessageBlobStore {
-
        /**
         * Get the message blobs for a set of modules
         *
@@ -128,7 +127,8 @@ class MessageBlobStore {
         * @param string $name Module name
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for the given module/language pair
+        * @return string Regenerated message blob, or null if there was no blob for
+        *   the given module/language pair.
         */
        public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -331,6 +331,7 @@ class MessageBlobStore {
         */
        private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
                global $wgCacheEpoch;
+
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -345,10 +346,14 @@ class MessageBlobStore {
                                // This shouldn't be possible
                                throw new MWException( __METHOD__ . ' passed an invalid module name' );
                        }
+
                        // Update the module's blobs if the set of messages changed or if the blob is
                        // older than $wgCacheEpoch
-                       if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== array_values( array_unique( $module->getMessages() ) ) ||
-                                       wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch ) {
+                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
+                       $values = array_values( array_unique( $module->getMessages() ) );
+                       if ( $keys !== $values
+                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch
+                       ) {
                                $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
index 45c2da9..4edddbc 100644 (file)
@@ -67,7 +67,7 @@ class MWNamespace {
        public static function isMovable( $index ) {
                global $wgAllowImageMoving;
 
-               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
+               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) );
 
                /**
                 * @since 1.20
index c783fd3..b3b3b88 100644 (file)
@@ -164,7 +164,10 @@ function wfMangleFlashPolicy( $s ) {
  * @param int $length
  */
 function wfDoContentLength( $length ) {
-       if ( !headers_sent() && isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' ) {
+       if ( !headers_sent()
+               && isset( $_SERVER['SERVER_PROTOCOL'] )
+               && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0'
+       ) {
                header( "Content-Length: $length" );
        }
 }
index 76f0aab..16e070c 100644 (file)
  * @todo document
  */
 class OutputPage extends ContextSource {
-       /// Should be private. Used with addMeta() which adds "<meta>"
-       var $mMetatags = array();
+       /** @var array Should be private. Used with addMeta() which adds "<meta>" */
+       protected $mMetatags = array();
 
-       var $mLinktags = array();
-       var $mCanonicalUrl = false;
+       /** @var array */
+       protected $mLinktags = array();
 
-       /// Additional stylesheets. Looks like this is for extensions. Might be replaced by resource loader.
-       var $mExtStyles = array();
+       /** @var bool */
+       protected $mCanonicalUrl = false;
 
-       /// Should be private - has getter and setter. Contains the HTML title
-       var $mPagetitle = '';
+       /**
+        * @var array Additional stylesheets. Looks like this is for extensions.
+        *   Might be replaced by resource loader.
+        */
+       protected $mExtStyles = array();
+
+       /**
+        * @var string Should be private - has getter and setter. Contains
+        *   the HTML title */
+       public $mPagetitle = '';
 
-       /// Contains all of the "<body>" content. Should be private we got set/get accessors and the append() method.
-       var $mBodytext = '';
+       /**
+        * @var string Contains all of the "<body>" content. Should be private we
+        *   got set/get accessors and the append() method.
+        */
+       public $mBodytext = '';
 
        /**
         * Holds the debug lines that will be output as comments in page source if
@@ -58,43 +69,43 @@ class OutputPage extends ContextSource {
         */
        public $mDebugtext = '';
 
-       /// Should be private. Stores contents of "<title>" tag
-       var $mHTMLtitle = '';
-
-       /// Should be private. Is the displayed content related to the source of the corresponding wiki article.
-       var $mIsarticle = false;
+       /** @var string Stores contents of "<title>" tag */
+       private $mHTMLtitle = '';
 
        /**
-        * Should be private. Has get/set methods properly documented.
-        * Stores "article flag" toggle.
+        * @var bool Is the displayed content related to the source of the
+        *   corresponding wiki article.
         */
-       var $mIsArticleRelated = true;
+       private $mIsarticle = false;
+
+       /** @var bool Stores "article flag" toggle. */
+       private $mIsArticleRelated = true;
 
        /**
-        * Should be private. We have to set isPrintable(). Some pages should
+        * @var bool We have to set isPrintable(). Some pages should
         * never be printed (ex: redirections).
         */
-       var $mPrintable = false;
+       private $mPrintable = false;
 
        /**
-        * Should be private. We have set/get/append methods.
-        *
-        * Contains the page subtitle. Special pages usually have some links here.
-        * Don't confuse with site subtitle added by skins.
+        * @var array Contains the page subtitle. Special pages usually have some
+        *   links here. Don't confuse with site subtitle added by skins.
         */
        private $mSubtitle = array();
 
-       var $mRedirect = '';
-       var $mStatusCode;
+       /** @var string */
+       public $mRedirect = '';
+
+       /** @var int */
+       protected $mStatusCode;
 
        /**
-        * mLastModified and mEtag are used for sending cache control.
-        * The whole caching system should probably be moved into its own class.
+        * @ var string mLastModified and mEtag are used for sending cache control.
+        *   The whole caching system should probably be moved into its own class.
         */
-       var $mLastModified = '';
+       protected $mLastModified = '';
 
        /**
-        * Should be private. No getter but used in sendCacheControl();
         * Contains an HTTP Entity Tags (see RFC 2616 section 3.13) which is used
         * as a unique identifier for the content. It is later used by the client
         * to compare its cached version with the server version. Client sends
@@ -103,70 +114,93 @@ class OutputPage extends ContextSource {
         * To get more information, you will have to look at HTTP/1.1 protocol which
         * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616
         */
-       var $mETag = false;
+       private $mETag = false;
+
+       /** @var array */
+       protected $mCategoryLinks = array();
 
-       var $mCategoryLinks = array();
-       var $mCategories = array();
+       /** @var array */
+       protected $mCategories = array();
 
-       /// Should be private. Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
-       var $mLanguageLinks = array();
+       /** @var array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page') */
+       private $mLanguageLinks = array();
 
        /**
-        * Should be private. Used for JavaScript (pre resource loader)
-        * We should split js / css.
+        * Used for JavaScript (pre resource loader)
+        * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
-        * contains either a link to a stylesheet or inline css.
+        * contain either a link to a stylesheet or inline CSS.
         */
-       var $mScripts = '';
+       private $mScripts = '';
 
-       /**
-        * Inline CSS styles. Use addInlineStyle() sparingly
-        */
-       var $mInlineStyles = '';
+       /** @var string Inline CSS styles. Use addInlineStyle() sparingly */
+       protected $mInlineStyles = '';
 
-       //
-       var $mLinkColours;
+       /** @todo Unused? */
+       private $mLinkColours;
 
        /**
-        * Used by skin template.
+        * @var string Used by skin template.
         * Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
         */
-       var $mPageLinkTitle = '';
+       public $mPageLinkTitle = '';
+
+       /** @var array Array of elements in "<head>". Parser might add its own headers! */
+       protected $mHeadItems = array();
+
+       // @todo FIXME: Next 5 variables probably come from the resource loader
+
+       /** @var array */
+       protected $mModules = array();
+
+       /** @var array */
+       protected $mModuleScripts = array();
+
+       /** @var array */
+       protected $mModuleStyles = array();
 
-       /// Array of elements in "<head>". Parser might add its own headers!
-       var $mHeadItems = array();
+       /** @var array */
+       protected $mModuleMessages = array();
 
-       // @todo FIXME: Next variables probably comes from the resource loader
-       var $mModules = array(), $mModuleScripts = array(), $mModuleStyles = array(), $mModuleMessages = array();
-       var $mResourceLoader;
-       var $mJsConfigVars = array();
+       /** @var ResourceLoader */
+       protected $mResourceLoader;
 
-       /** @todo FIXME: Is this still used ?*/
-       var $mInlineMsg = array();
+       /** @var array */
+       protected $mJsConfigVars = array();
 
-       var $mTemplateIds = array();
-       var $mImageTimeKeys = array();
+       /** @var array */
+       protected $mTemplateIds = array();
 
-       var $mRedirectCode = '';
+       /** @var array */
+       protected $mImageTimeKeys = array();
 
-       var $mFeedLinksAppendQuery = null;
+       /** @var string */
+       public $mRedirectCode = '';
 
-       # What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
-       # @see ResourceLoaderModule::$origin
-       # ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+       protected $mFeedLinksAppendQuery = null;
+
+       /** @var array
+        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+        * @see ResourceLoaderModule::$origin
+        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+        */
        protected $mAllowedModules = array(
                ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
        );
 
+       /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
+       protected $mDoNothing = false;
+
+       // Parser related.
+
        /**
-        * Whether output is disabled.  If this is true, the 'output' method will do nothing.
-        *
-        * @var bool $mDoNothing
+        * @var int
+        * @todo Unused?
         */
-       var $mDoNothing = false;
+       private $mContainsOldMagic = 0;
 
-       // Parser related.
-       var $mContainsOldMagic = 0, $mContainsNewMagic = 0;
+       /** @var int */
+       protected $mContainsNewMagic = 0;
 
        /**
         * lazy initialised, use parserOptions()
@@ -175,57 +209,64 @@ class OutputPage extends ContextSource {
        protected $mParserOptions = null;
 
        /**
-        * Handles the atom / rss links.
-        * We probably only support atom in 2011.
-        * Looks like a private variable.
+        * Handles the Atom / RSS links.
+        * We probably only support Atom in 2011.
         * @see $wgAdvertisedFeedTypes
         */
-       var $mFeedLinks = array();
+       private $mFeedLinks = array();
 
        // Gwicke work on squid caching? Roughly from 2003.
-       var $mEnableClientCache = true;
+       protected $mEnableClientCache = true;
 
-       /**
-        * Flag if output should only contain the body of the article.
-        * Should be private.
-        */
-       var $mArticleBodyOnly = false;
+       /** @var bool Flag if output should only contain the body of the article. */
+       private $mArticleBodyOnly = false;
+
+       /** @var bool */
+       protected $mNewSectionLink = false;
 
-       var $mNewSectionLink = false;
-       var $mHideNewSectionLink = false;
+       /** @var bool */
+       protected $mHideNewSectionLink = false;
 
        /**
-        * Comes from the parser. This was probably made to load CSS/JS only
-        * if we had "<gallery>". Used directly in CategoryPage.php
+        * @var bool Comes from the parser. This was probably made to load CSS/JS
+        * only if we had "<gallery>". Used directly in CategoryPage.php.
         * Looks like resource loader can replace this.
         */
-       var $mNoGallery = false;
+       public $mNoGallery = false;
+
+       /** @var string */
+       private $mPageTitleActionText = '';
 
-       // should be private.
-       var $mPageTitleActionText = '';
-       var $mParseWarnings = array();
+       /** @var array */
+       private $mParseWarnings = array();
 
-       // Cache stuff. Looks like mEnableClientCache
-       var $mSquidMaxage = 0;
+       /** @var int Cache stuff. Looks like mEnableClientCache */
+       protected $mSquidMaxage = 0;
 
-       // @todo document
-       var $mPreventClickjacking = true;
+       /**
+        * @var bool
+        * @todo Document
+        */
+       protected $mPreventClickjacking = true;
+
+       /** @var int To include the variable {{REVISIONID}} */
+       private $mRevisionId = null;
 
-       /// should be private. To include the variable {{REVISIONID}}
-       var $mRevisionId = null;
+       /** @var string */
        private $mRevisionTimestamp = null;
 
-       var $mFileVersion = null;
+       /** @var array */
+       protected $mFileVersion = null;
 
        /**
-        * An array of stylesheet filenames (relative from skins path), with options
-        * for CSS media, IE conditions, and RTL/LTR direction.
+        * @var array An array of stylesheet filenames (relative from skins path),
+        * with options for CSS media, IE conditions, and RTL/LTR direction.
         * For internal use; add settings in the skin via $this->addStyle()
         *
         * Style again! This seems like a code duplication since we already have
-        * mStyles. This is what makes OpenSource amazing.
+        * mStyles. This is what makes Open Source amazing.
         */
-       var $styles = array();
+       protected $styles = array();
 
        /**
         * Whether jQuery is already handled.
@@ -445,7 +486,9 @@ class OutputPage extends ContextSource {
         * @param string $type
         * @return array
         */
-       protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
+       protected function filterModules( $modules, $position = null,
+               $type = ResourceLoaderModule::TYPE_COMBINED
+       ) {
                $resourceLoader = $this->getResourceLoader();
                $filteredModules = array();
                foreach ( $modules as $val ) {
@@ -724,7 +767,8 @@ class OutputPage extends ContextSource {
                $clientHeaderTime = strtotime( $clientHeader );
                wfRestoreWarnings();
                if ( !$clientHeaderTime ) {
-                       wfDebug( __METHOD__ . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
+                       wfDebug( __METHOD__
+                               . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
                        return false;
                }
                $clientHeaderTime = wfTimestamp( TS_MW, $clientHeaderTime );
@@ -875,10 +919,12 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML fragment.
-        * This function allows good tags like \<sup\> in the \<h1\> tag, but not bad tags like \<script\>.
-        * This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed.
-        * Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely.
+        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML
+        * fragment. This function allows good tags like \<sup\> in the \<h1\> tag,
+        * but not bad tags like \<script\>. This function automatically sets
+        * \<title\> to the same content as \<h1\> but with all tags removed. Bad
+        * tags that were escaped in \<h1\> will still be escaped in \<title\>, and
+        * good tags like \<i\> will be dropped entirely.
         *
         * @param string|Message $name
         */
@@ -960,7 +1006,8 @@ class OutputPage extends ContextSource {
                if ( $title->isRedirect() ) {
                        $query['redirect'] = 'no';
                }
-               $this->addSubtitle( $this->msg( 'backlinksubtitle' )->rawParams( Linker::link( $title, null, array(), $query ) ) );
+               $this->addSubtitle( $this->msg( 'backlinksubtitle' )
+                       ->rawParams( Linker::link( $title, null, array(), $query ) ) );
        }
 
        /**
@@ -1203,11 +1250,15 @@ class OutputPage extends ContextSource {
                # Fetch existence plus the hiddencat property
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( array( 'page', 'page_props' ),
-                       array( 'page_id', 'page_namespace', 'page_title', 'page_len', 'page_is_redirect', 'page_latest', 'pp_value' ),
+                       array( 'page_id', 'page_namespace', 'page_title', 'page_len',
+                               'page_is_redirect', 'page_latest', 'pp_value' ),
                        $lb->constructSet( 'page', $dbr ),
                        __METHOD__,
                        array(),
-                       array( 'page_props' => array( 'LEFT JOIN', array( 'pp_propname' => 'hiddencat', 'pp_page = page_id' ) ) )
+                       array( 'page_props' => array( 'LEFT JOIN', array(
+                               'pp_propname' => 'hiddencat',
+                               'pp_page = page_id'
+                       ) ) )
                );
 
                # Add the results to the link cache
@@ -1227,7 +1278,10 @@ class OutputPage extends ContextSource {
                }
 
                # Add the remaining categories to the skin
-               if ( wfRunHooks( 'OutputPageMakeCategoryLinks', array( &$this, $categories, &$this->mCategoryLinks ) ) ) {
+               if ( wfRunHooks(
+                       'OutputPageMakeCategoryLinks',
+                       array( &$this, $categories, &$this->mCategoryLinks ) )
+               ) {
                        foreach ( $categories as $category => $type ) {
                                $origcategory = $category;
                                $title = Title::makeTitleSafe( NS_CATEGORY, $category );
@@ -1294,7 +1348,8 @@ class OutputPage extends ContextSource {
         */
        public function isUserJsAllowed() {
                wfDeprecated( __METHOD__, '1.18' );
-               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >= ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
+               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >=
+                       ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
        }
 
        /**
@@ -1537,7 +1592,9 @@ class OutputPage extends ContextSource {
         * @param bool $interface Whether it is an interface message
         *   (for example disables conversion)
         */
-       public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
+       public function addWikiTextTitle( $text, Title $title, $linestart,
+               $tidy = false, $interface = false
+       ) {
                global $wgParser;
 
                wfProfileIn( __METHOD__ );
@@ -1931,7 +1988,8 @@ class OutputPage extends ContextSource {
                                        wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
-                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
+                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage
+                                               . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
                                        # We'll purge the proxy cache for anons explicitly, but require end user agents
@@ -1941,7 +1999,8 @@ class OutputPage extends ContextSource {
                                        wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
-                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0' );
+                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage
+                                               . ', must-revalidate, max-age=0' );
                                }
                        } else {
                                # We do want clients to cache if they can, but they *must* check for updates
@@ -2161,7 +2220,9 @@ class OutputPage extends ContextSource {
 
                if ( $msg instanceof Message ) {
                        if ( $params !== array() ) {
-                               trigger_error( 'Argument ignored: $params. The message parameters argument is discarded when the $msg argument is a Message object instead of a string.', E_USER_NOTICE );
+                               trigger_error( 'Argument ignored: $params. The message parameters argument '
+                                       . 'is discarded when the $msg argument is a Message object instead of '
+                                       . 'a string.', E_USER_NOTICE );
                        }
                        $this->addHTML( $msg->parseAsBlock() );
                } else {
@@ -2329,11 +2390,14 @@ class OutputPage extends ContextSource {
         *
         * @param string $source Source code to show (or null).
         * @param bool $protected Is this a permissions error?
-        * @param array $reasons List of reasons for this error, as returned by Title::getUserPermissionsErrors().
+        * @param array $reasons List of reasons for this error, as returned by
+        *   Title::getUserPermissionsErrors().
         * @param string $action Action that was denied or null if unknown
         * @throws ReadOnlyError
         */
-       public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
+       public function readOnlyPage( $source = null, $protected = false,
+               $reasons = array(), $action = null
+       ) {
                $this->setRobotPolicy( 'noindex,nofollow' );
                $this->setArticleRelated( false );
 
@@ -2556,7 +2620,8 @@ $templates
 
                $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
                $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
-               $bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+               $bodyClasses[] =
+                       'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
 
                $bodyAttrs = array();
                // While the implode() is not strictly needed, it's used for backwards compatibility
@@ -2585,15 +2650,19 @@ $templates
        }
 
        /**
-        * TODO: Document
+        * @todo Document
         * @param array|string $modules One or more module names
         * @param string $only ResourceLoaderModule TYPE_ class constant
         * @param bool $useESI
-        * @param array $extraQuery Array with extra query parameters to add to each request. array( param => value )
-        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
+        * @param array $extraQuery Array with extra query parameters to add to each
+        *   request. array( param => value ).
+        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load()
+        *   call rather than a "<script src='...'>" tag.
         * @return string The html "<script>", "<link>" and "<style>" tags
         */
-       protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
+       protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
+               array $extraQuery = array(), $loadCall = false
+       ) {
                global $wgResourceLoaderUseESI;
 
                $modules = (array)$modules;
@@ -2607,7 +2676,6 @@ $templates
                        return $links;
                }
 
-
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
                        $modules = array_unique( $modules );
@@ -2837,8 +2905,14 @@ $templates
 
                // Scripts and messages "only" requests marked for top inclusion
                // Messages should go first
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleMessages( true, 'top' ),
+                       ResourceLoaderModule::TYPE_MESSAGES
+               );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleScripts( true, 'top' ),
+                       ResourceLoaderModule::TYPE_SCRIPTS
+               );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
@@ -2859,12 +2933,14 @@ $templates
        }
 
        /**
-        * JS stuff to put at the 'bottom', which can either be the bottom of the "<body>"
-        * or the bottom of the "<head>" depending on $wgResourceLoaderExperimentalAsyncLoading:
-        * modules marked with position 'bottom', legacy scripts ($this->mScripts),
-        * user preferences, site JS and user JS.
+        * JS stuff to put at the 'bottom', which can either be the bottom of the
+        * "<body>" or the bottom of the "<head>" depending on
+        * $wgResourceLoaderExperimentalAsyncLoading: modules marked with position
+        * 'bottom', legacy scripts ($this->mScripts), user preferences, site JS
+        * and user JS.
         *
-        * @param bool $inHead If true, this HTML goes into the "<head>", if false it goes into the "<body>"
+        * @param bool $inHead If true, this HTML goes into the "<head>",
+        *   if false it goes into the "<body>".
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
@@ -2903,7 +2979,12 @@ $templates
                );
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() && $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+               if ( $wgAllowUserJs
+                       && $this->getUser()->isLoggedIn()
+                       && $this->getTitle()
+                       && $this->getTitle()->isJsSubpage()
+                       && $this->userCanPreview()
+               ) {
                        # XXX: additional security check/prompt?
                        // We're on a preview of a JS subpage
                        // Exclude this page from the user module in case it's in there (bug 26283)
@@ -2911,7 +2992,8 @@ $templates
                                array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
                        );
                        // Load the previewed JS
-                       $links[] = Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+                       $links[] = Html::inlineScript( "\n"
+                                       . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
 
                        // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
                        // asynchronously and may arrive *after* the inline script here. So the previewed code
@@ -2999,7 +3081,9 @@ $templates
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
-               $canonicalNamespace = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
+               $canonicalNamespace = MWNamespace::exists( $ns )
+                       ? MWNamespace::getCanonicalName( $ns )
+                       : $title->getNsText();
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
@@ -3008,7 +3092,8 @@ $templates
                $relevantUser = $sk->getRelevantUser();
 
                if ( $ns == NS_SPECIAL ) {
-                       list( $canonicalSpecialPageName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+                       list( $canonicalSpecialPageName, /*...*/ ) =
+                               SpecialPageFactory::resolveAlias( $title->getDBkey() );
                } elseif ( $this->canUseWikiPage() ) {
                        $wikiPage = $this->getWikiPage();
                        $curRevisionId = $wikiPage->getLatest();
@@ -3058,6 +3143,7 @@ $templates
                        'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
                        'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
                );
+
                if ( $user->isLoggedIn() ) {
                        $vars['wgUserId'] = $user->getId();
                        $vars['wgUserEditCount'] = $user->getEditCount();
@@ -3068,20 +3154,26 @@ $templates
                        // the client side.
                        $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
                }
+
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
                }
                // Same test as SkinTemplate
-               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user )
+                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+
                foreach ( $title->getRestrictionTypes() as $type ) {
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
+
                if ( $title->isMainPage() ) {
                        $vars['wgIsMainPage'] = true;
                }
+
                if ( $this->mRedirectedFrom ) {
                        $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBkey();
                }
+
                if ( $relevantUser ) {
                        $vars['wgRelevantUserName'] = $relevantUser->getName();
                }
@@ -3199,11 +3291,17 @@ $templates
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
                if ( $wgAppleTouchIcon !== false ) {
-                       $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+                       $tags['apple-touch-icon'] = Html::element( 'link', array(
+                               'rel' => 'apple-touch-icon',
+                               'href' => $wgAppleTouchIcon
+                       ) );
                }
 
                if ( $wgFavicon !== false ) {
-                       $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+                       $tags['favicon'] = Html::element( 'link', array(
+                               'rel' => 'shortcut icon',
+                               'href' => $wgFavicon
+                       ) );
                }
 
                # OpenSearch description link
@@ -3224,7 +3322,11 @@ $templates
                                'type' => 'application/rsd+xml',
                                // Output a protocol-relative URL here if $wgServer is protocol-relative
                                // Whether RSD accepts relative or protocol-relative URLs is completely undocumented, though
-                               'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ), PROTO_RELATIVE ),
+                               'href' => wfExpandUrl( wfAppendQuery(
+                                       wfScript( 'api' ),
+                                       array( 'action' => 'rsd' ) ),
+                                       PROTO_RELATIVE
+                               ),
                        ) );
                }
 
@@ -3309,7 +3411,8 @@ $templates
                                        $tags[] = $this->feedLink(
                                                $format,
                                                $rctitle->getLocalURL( array( 'feed' => $format ) ),
-                                               $this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
+                                               # For grep: 'site-rss-feed', 'site-atom-feed'
+                                               $this->msg( "site-{$format}-feed", $wgSitename )->text()
                                        );
                                }
                        }
@@ -3410,7 +3513,13 @@ $templates
 
                // Add ResourceLoader styles
                // Split the styles into these groups
-               $styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array(), 'noscript' => array() );
+               $styles = array(
+                       'other' => array(),
+                       'user' => array(),
+                       'site' => array(),
+                       'private' => array(),
+                       'noscript' => array()
+               );
                $links = array();
                $otherTags = ''; // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
@@ -3458,16 +3567,20 @@ $templates
                        $styles[ isset( $styles[$group] ) ? $group : 'other' ][] = $name;
                }
 
-               // We want site, private and user styles to override dynamically added styles from modules, but we want
-               // dynamically added styles to override statically added styles from other modules. So the order
-               // has to be other, dynamic, site, private, user
-               // Add statically added styles for other modules
+               // We want site, private and user styles to override dynamically added
+               // styles from modules, but we want dynamically added styles to override
+               // statically added styles from other modules. So the order has to be
+               // other, dynamic, site, private, user. Add statically added styles for
+               // other modules
                $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
                // Add normal styles added through addStyle()/addInlineStyle() here
                $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
                // Add marker tag to mark the place where the client-side loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
-               $links[] = Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) ) . "\n";
+               $links[] = Html::element(
+                       'meta',
+                       array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' )
+               ) . "\n";
 
                // Add site, private and user styles
                // 'private' at present only contains user.options, so put that before 'user'
@@ -3569,8 +3682,10 @@ $templates
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
                                        // This regex will not attempt to understand a comma-separated media_query_list
                                        //
-                                       // Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media: '3d-glasses, screen, print and resolution > 90dpi'
+                                       // Example supported values for $media:
+                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                       // Example NOT supported value for $media:
+                                       // '3d-glasses, screen, print and resolution > 90dpi'
                                        //
                                        // If it's a print request, we never want any kind of screen stylesheets
                                        // If it's a handheld request (currently the only other choice with a switch),
@@ -3628,7 +3743,8 @@ $templates
         *
         * Is equivalent to:
         *
-        *    $wgOut->addWikiText( "<div class='error'>\n" . wfMessage( 'some-error' )->plain() . "\n</div>" );
+        *    $wgOut->addWikiText( "<div class='error'>\n"
+        *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
         * The newline after opening div is needed in some wikitext. See bug 19226.
         *
index 9b5373b..0fb3952 100644 (file)
@@ -43,10 +43,13 @@ function wfPHPVersionError( $type ) {
 
        $phpVersion = phpversion();
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
-       $message = "MediaWiki $mwVersion requires at least PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+       $message = "MediaWiki $mwVersion requires at least "
+               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+
        if ( $type == 'cli' ) {
-               $finalOutput = "You are using PHP version $phpVersion but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n" .
-               "Check if you have a newer php executable with a different name, such as php5.\n";
+               $finalOutput = "You are using PHP version $phpVersion "
+                       . "but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n"
+                       . "Check if you have a newer php executable with a different name, such as php5.\n";
        } elseif ( $type == 'index.php' ) {
                $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
                $encLogo = htmlspecialchars(
index 33bf067..5f05460 100644 (file)
@@ -365,7 +365,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @return ResultWrapper
         */
        public function reallyDoQuery( $offset, $limit, $descending ) {
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $descending );
+
                return $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
        }
 
@@ -409,7 +411,8 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @param ResultWrapper $result
         */
-       protected function preprocessResults( $result ) {}
+       protected function preprocessResults( $result ) {
+       }
 
        /**
         * Get the formatted result list. Calls getStartBody(), formatRow() and
@@ -491,7 +494,8 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return void
         */
-       protected function doBatchLookups() {}
+       protected function doBatchLookups() {
+       }
 
        /**
         * Hook into getBody(), allows text to be inserted at the start. This
@@ -924,8 +928,9 @@ abstract class ReverseChronologicalPager extends IndexPager {
  * @ingroup Pager
  */
 abstract class TablePager extends IndexPager {
-       var $mSort;
-       var $mCurrentRow;
+       protected $mSort;
+
+       protected $mCurrentRow;
 
        public function __construct( IContextSource $context = null ) {
                if ( $context ) {
@@ -995,7 +1000,10 @@ abstract class TablePager extends IndexPager {
                }
 
                $tableClass = $this->getTableClass();
-               $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+               $ret = Html::openElement( 'table', array(
+                       'style' => 'border:1px;',
+                       'class' => "mw-datatable $tableClass" )
+               );
                $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
                $ret .= Html::openElement( 'tbody' ) . "\n";
 
index 493626a..1f1b7dd 100644 (file)
  * over to the tryUISubmit static method of this class.
  */
 class Preferences {
-       static $defaultPreferences = null;
-       static $saveFilters = array(
-                       'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
-                       'cols' => array( 'Preferences', 'filterIntval' ),
-                       'rows' => array( 'Preferences', 'filterIntval' ),
-                       'rclimit' => array( 'Preferences', 'filterIntval' ),
-                       'wllimit' => array( 'Preferences', 'filterIntval' ),
-                       'searchlimit' => array( 'Preferences', 'filterIntval' ),
+       /** @var array */
+       protected static $defaultPreferences = null;
+
+       /** @var array */
+       protected static $saveFilters = array(
+               'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
+               'cols' => array( 'Preferences', 'filterIntval' ),
+               'rows' => array( 'Preferences', 'filterIntval' ),
+               'rclimit' => array( 'Preferences', 'filterIntval' ),
+               'wllimit' => array( 'Preferences', 'filterIntval' ),
+               'searchlimit' => array( 'Preferences', 'filterIntval' ),
        );
 
        // Stuff that shouldn't be saved as a preference.
@@ -210,13 +213,6 @@ class Preferences {
                        'section' => 'personal/info',
                );
 
-               $defaultPreferences['userid'] = array(
-                       'type' => 'info',
-                       'label-message' => array( 'uid', $userName ),
-                       'default' => $user->getId(),
-                       'section' => 'personal/info',
-               );
-
                # Get groups to which the user belongs
                $userEffectiveGroups = $user->getEffectiveGroups();
                $userGroups = $userMembers = array();
@@ -1401,7 +1397,10 @@ class Preferences {
 
                // Fortunately, the realname field is MUCH simpler
                // (not really "private", but still shouldn't be edited without permission)
-               if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->isAllowed( 'editmyprivateinfo' ) && array_key_exists( 'realname', $formData ) ) {
+               if ( !in_array( 'realname', $wgHiddenPrefs )
+                       && $user->isAllowed( 'editmyprivateinfo' )
+                       && array_key_exists( 'realname', $formData )
+               ) {
                        $realName = $formData['realname'];
                        $user->setRealName( $realName );
                }
index c5dd698..a796d35 100644 (file)
@@ -121,7 +121,7 @@ abstract class PrefixSearch {
         * @param array $titles
         * @return array
         */
-       protected abstract function titles( array $titles );
+       abstract protected function titles( array $titles );
 
        /**
         * When implemented in a descendant class, receives an array of titles as strings and returns
@@ -131,7 +131,7 @@ abstract class PrefixSearch {
         *
         * @return array
         */
-       protected abstract function strings( array $strings );
+       abstract protected function strings( array $strings );
 
        /**
         * Do a prefix search of titles and return a list of matching page names.
@@ -296,7 +296,9 @@ class TitlePrefixSearch extends PrefixSearch {
 class StringPrefixSearch extends PrefixSearch {
 
        protected function titles( array $titles ) {
-               return array_map( function( Title $t ) { return $t->getPrefixedText(); }, $titles );
+               return array_map( function ( Title $t ) {
+                       return $t->getPrefixedText();
+               }, $titles );
        }
 
        protected function strings( array $strings ) {
index 506ac4c..7c39617 100644 (file)
@@ -326,7 +326,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -347,7 +347,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
index 59ac046..1ea6523 100644 (file)
@@ -358,7 +358,7 @@ class Sanitizer {
         * @param string $text
         * @param callable $processCallback Callback to do any variable or parameter
         *   replacements in HTML attribute values
-        * @param array $args Arguments for the processing callback
+        * @param array|bool $args Arguments for the processing callback
         * @param array $extratags For any extra tags to include
         * @param array $removetags For any tags (default or extra) to exclude
         * @return string
@@ -459,7 +459,10 @@ class Sanitizer {
                                                $badtag = true;
                                        } elseif ( $slash ) {
                                                # Closing a tag... is it the one we just opened?
-                                               $ot = @array_pop( $tagstack );
+                                               wfSuppressWarnings();
+                                               $ot = array_pop( $tagstack );
+                                               wfRestoreWarnings();
+
                                                if ( $ot != $t ) {
                                                        if ( isset( $htmlsingleallowed[$ot] ) ) {
                                                                # Pop all elements with an optional close tag
@@ -489,7 +492,10 @@ class Sanitizer {
                                                                        }
                                                                }
                                                        } else {
-                                                               @array_push( $tagstack, $ot );
+                                                               wfSuppressWarnings();
+                                                               array_push( $tagstack, $ot );
+                                                               wfRestoreWarnings();
+
                                                                # <li> can be nested in <ul> or <ol>, skip those cases:
                                                                if ( !isset( $htmllist[$ot] ) || !isset( $listtags[$t] ) ) {
                                                                        $badtag = true;
@@ -567,9 +573,16 @@ class Sanitizer {
                } else {
                        # this might be possible using tidy itself
                        foreach ( $bits as $x ) {
-                               preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
-                               $x, $regs );
-                               @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               preg_match(
+                                       '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
+                                       $x,
+                                       $regs
+                               );
+
+                               wfSuppressWarnings();
+                               list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               wfRestoreWarnings();
+
                                $badtag = false;
                                if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
                                        if ( is_callable( $processCallback ) ) {
index b155f90..a1bca22 100644 (file)
@@ -43,6 +43,7 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
+
 if ( $wgScript === false ) {
        $wgScript = "$wgScriptPath/index$wgScriptExtension";
 }
@@ -122,7 +123,8 @@ if ( isset( $wgFooterIcons['poweredby'] )
        && isset( $wgFooterIcons['poweredby']['mediawiki'] )
        && $wgFooterIcons['poweredby']['mediawiki']['src'] === null
 ) {
-       $wgFooterIcons['poweredby']['mediawiki']['src'] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
+       $wgFooterIcons['poweredby']['mediawiki']['src'] =
+               "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
 }
 
 /**
@@ -251,7 +253,10 @@ if ( $wgRCFilterByAge ) {
        // as determined by $wgRCMaxAge.
        // Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
        sort( $wgRCLinkDays );
+
+       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
        for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) {
+               // @codingStandardsIgnoreEnd
                if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
                        $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i + 1, false );
                        break;
@@ -366,7 +371,9 @@ if ( $wgArticleCountMethod === null ) {
 }
 
 if ( $wgInvalidateCacheOnLocalSettingsChange ) {
+       // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged - No GlobalFunction here yet.
        $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
+       // @codingStandardsIgnoreEnd
 }
 
 if ( $wgNewUserLog ) {
@@ -420,9 +427,34 @@ require_once "$IP/includes/normal/UtfNormalDefines.php";
 wfProfileOut( $fname . '-includes' );
 
 wfProfileIn( $fname . '-defaults2' );
+
+if ( $wgCanonicalServer === false ) {
+       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
+}
+
+// Set server name
+$serverParts = wfParseUrl( $wgCanonicalServer );
+if ( $wgServerName !== false ) {
+       wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
+               . 'not customized. Overwriting $wgServerName.' );
+}
+$wgServerName = $serverParts['host'];
+unset( $serverParts );
+
+// Set defaults for configuration variables
+// that are derived from the server name by default
+if ( $wgEmergencyContact === false ) {
+       $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
+}
+
+if ( $wgPasswordSender === false ) {
+       $wgPasswordSender = 'apache@' . $wgServerName;
+}
+
 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
        $wgSecureLogin = false;
-       wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' );
+       wfWarn( 'Secure login was enabled on a server that only supports '
+               . 'HTTP or HTTPS. Disabling secure login.' );
 }
 
 // Now that GlobalFunctions is loaded, set defaults that depend
@@ -433,10 +465,6 @@ if ( $wgTmpDirectory === false ) {
        wfProfileOut( $fname . '-tempDir' );
 }
 
-if ( $wgCanonicalServer === false ) {
-       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
-}
-
 // $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22
 // ensure back compatibility.
 if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) {
@@ -531,13 +559,10 @@ if ( !wfIniGetBool( 'session.auto_start' ) ) {
        session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
 }
 
-if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
-       if ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) ) {
-               wfSetupSession();
-               $wgSessionStarted = true;
-       } else {
-               $wgSessionStarted = false;
-       }
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode &&
+       ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) )
+) {
+       wfSetupSession();
 }
 
 wfProfileOut( $fname . '-session' );
index 2f28e7b..b99840f 100644 (file)
  * extract( $globals );
  * @endcode
  *
- * TODO: give examples for,
+ * @todo Give examples for,
  * suffixes:
  * $conf->suffixes = array( 'wiki' );
  * localVHosts
@@ -176,7 +176,9 @@ class SiteConfiguration {
         * @param array $wikiTags The tags assigned to the wiki.
         * @return mixed The value of the setting requested.
         */
-       public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function get( $settingName, $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                return $this->getSetting( $settingName, $wiki, $params );
        }
@@ -228,7 +230,9 @@ class SiteConfiguration {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting )
+                                               && is_array( $thisSetting["+$suffix"] )
+                                       ) {
                                                if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
@@ -338,7 +342,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractVar( $setting, $wiki, $suffix, &$var, $params = array(), $wikiTags = array() ) {
+       public function extractVar( $setting, $wiki, $suffix, &$var,
+               $params = array(), $wikiTags = array()
+       ) {
                $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
                if ( !is_null( $value ) ) {
                        $var = $value;
@@ -353,7 +359,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractGlobal( $setting, $wiki, $suffix = null,
+               $params = array(), $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                $this->extractGlobalSetting( $setting, $wiki, $params );
        }
@@ -386,7 +394,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractAllGlobals( $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                foreach ( $this->settings as $varName => $setting ) {
                        $this->extractGlobalSetting( $varName, $wiki, $params );
@@ -574,12 +584,14 @@ class SiteConfiguration {
         */
        static function arrayMerge( $array1/* ... */ ) {
                $out = $array1;
-               for ( $i = 1; $i < func_num_args(); $i++ ) {
+               $argsCount = func_num_args();
+               for ( $i = 1; $i < $argsCount; $i++ ) {
                        foreach ( func_get_arg( $i ) as $key => $value ) {
                                if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
                                        $out[$key] = self::arrayMerge( $out[$key], $value );
                                } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
-                                       // Values that evaluate to true given precedence, for the primary purpose of merging permissions arrays.
+                                       // Values that evaluate to true given precedence, for the
+                                       // primary purpose of merging permissions arrays.
                                        $out[$key] = $value;
                                } elseif ( is_numeric( $key ) ) {
                                        $out[] = $value;
index 4685c3e..4e737d1 100644 (file)
  * Static accessor class for site_stats and related things
  */
 class SiteStats {
-       static $row, $loaded = false;
-       static $jobs;
-       static $pageCount = array();
-       static $groupMemberCounts = array();
+       /** @var bool|ResultWrapper */
+       private static $row;
+
+       /** @var bool */
+       private static $loaded = false;
+
+       /** @var int */
+       private static $jobs;
+
+       /** @var int[] */
+       private static $pageCount = array();
+
+       /** @var int[] */
+       private static $groupMemberCounts = array();
 
        static function recache() {
                self::load( true );
@@ -190,7 +200,10 @@ class SiteStats {
                if ( !isset( self::$jobs ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
-                       /* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
+                       /**
+                        * Zero rows still do single row read for row that doesn't exist,
+                        * but people are annoyed by that
+                        */
                        if ( self::$jobs == 1 ) {
                                self::$jobs = 0;
                        }
index 8300da7..9d1034b 100644 (file)
@@ -678,12 +678,15 @@ abstract class Skin extends ContextSource {
        function printSource() {
                $oldid = $this->getRevisionId();
                if ( $oldid ) {
-                       $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ) ) );
+                       $canonicalUrl = $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid );
+                       $url = htmlspecialchars( wfExpandIRI( $canonicalUrl ) );
                } else {
                        // oldid not available for non existing pages
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
-               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url . '">' . $url . '</a>' )->text();
+
+               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url
+                       . '">' . $url . '</a>' )->text();
        }
 
        /**
@@ -799,7 +802,9 @@ abstract class Skin extends ContextSource {
                global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
 
                if ( $type == 'detect' ) {
-                       if ( !$this->isRevisionCurrent() && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() ) {
+                       if ( !$this->isRevisionCurrent()
+                               && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled()
+                       ) {
                                $type = 'history';
                        } else {
                                $type = 'normal';
@@ -827,14 +832,21 @@ abstract class Skin extends ContextSource {
                // Allow for site and per-namespace customization of copyright notice.
                $forContent = true;
 
-               wfRunHooks( 'SkinCopyrightFooter', array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) );
+               wfRunHooks(
+                       'SkinCopyrightFooter',
+                       array( $this->getTitle(), $type, &$msg, &$link, &$forContent )
+               );
 
                $msgObj = $this->msg( $msg )->rawParams( $link );
                if ( $forContent ) {
                        $msg = $msgObj->inContentLanguage()->text();
                        if ( $this->getLanguage()->getCode() !== $wgContLang->getCode() ) {
-                               $msg = Html::rawElement( 'span', array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $msg );
+                               $msg = Html::rawElement( 'span', array(
+                                       'lang' => $wgContLang->getHtmlCode(),
+                                       'dir' => $wgContLang->getDir()
+                               ), $msg );
                        }
+
                        return $msg;
                } else {
                        return $msgObj->text();
@@ -878,7 +890,8 @@ abstract class Skin extends ContextSource {
                global $wgStylePath;
 
                $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
-               $text = '<a href="//www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+               $text = '<a href="//www.mediawiki.org/"><img src="' . $url
+                       . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
                wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
                return $text;
        }
@@ -934,8 +947,10 @@ abstract class Skin extends ContextSource {
 
        /**
         * Renders a $wgFooterIcons icon according to the method's arguments
-        * @param array $icon The icon to build the html for, see $wgFooterIcons for the format of this array
-        * @param bool|string $withImage Whether to use the icon's image or output a text-only footericon
+        * @param array $icon The icon to build the html for, see $wgFooterIcons
+        *   for the format of this array.
+        * @param bool|string $withImage Whether to use the icon's image or output
+        *   a text-only footericon.
         * @return string HTML
         */
        function makeFooterIcon( $icon, $withImage = 'withImage' ) {
@@ -945,7 +960,8 @@ abstract class Skin extends ContextSource {
                        $url = isset( $icon["url"] ) ? $icon["url"] : null;
                        unset( $icon["url"] );
                        if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
-                               $html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
+                               // do this the lazy way, just pass icon data as an attribute array
+                               $html = Html::element( 'img', $icon );
                        } else {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
@@ -1044,8 +1060,11 @@ abstract class Skin extends ContextSource {
                } else {
                        $targetUser = User::newFromId( $id );
                }
-               return $this->getUser()->canSendEmail() && # the sending user must have a confirmed email address
-                       $targetUser->canReceiveEmail(); # the target user must have a confirmed email address and allow emails from users
+
+               # The sending user must have a confirmed email address and the target
+               # user must have a confirmed email address and allow emails from users.
+               return $this->getUser()->canSendEmail() &&
+                       $targetUser->canReceiveEmail();
        }
 
        /**
@@ -1244,6 +1263,8 @@ abstract class Skin extends ContextSource {
                if ( $wgEnableSidebarCache ) {
                        $cachedsidebar = $wgMemc->get( $key );
                        if ( $cachedsidebar ) {
+                               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
+
                                wfProfileOut( __METHOD__ );
                                return $cachedsidebar;
                        }
@@ -1257,6 +1278,8 @@ abstract class Skin extends ContextSource {
                        $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry );
                }
 
+               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$bar ) );
+
                wfProfileOut( __METHOD__ );
                return $bar;
        }
index b186447..e8fa944 100644 (file)
  * @private
  * @ingroup Skins
  */
-class MediaWiki_I18N {
-       var $_context = array();
+class MediaWikiI18N {
+       private $context = array();
 
        function set( $varName, $value ) {
-               $this->_context[$varName] = $value;
+               $this->context[$varName] = $value;
        }
 
        function translate( $value ) {
@@ -46,7 +46,7 @@ class MediaWiki_I18N {
                while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
                        list( $src, $var ) = $m;
                        wfSuppressWarnings();
-                       $varValue = $this->_context[$var];
+                       $varValue = $this->context[$var];
                        wfRestoreWarnings();
                        $value = str_replace( $src, $varValue, $value );
                }
@@ -68,35 +68,29 @@ class MediaWiki_I18N {
  * @ingroup Skins
  */
 class SkinTemplate extends Skin {
-       /**#@+
-        * @private
-        */
-
        /**
-        * Name of our skin, it probably needs to be all lower case.  Child classes
-        * should override the default.
+        * @var string Name of our skin, it probably needs to be all lower case.
+        *   Child classes should override the default.
         */
-       var $skinname = 'monobook';
+       public $skinname = 'monobook';
 
        /**
-        * Stylesheets set to use.  Subdirectory in skins/ where various stylesheets
-        * are located.  Child classes should override the default.
+        * @var string Stylesheets set to use. Subdirectory in skins/ where various
+        *   stylesheets are located.  Child classes should override the default.
         */
-       var $stylename = 'monobook';
+       public $stylename = 'monobook';
 
        /**
-        * For QuickTemplate, the name of the subclass which will actually fill the
-        * template.  Child classes should override the default.
+        * @var string For QuickTemplate, the name of the subclass which will
+        *   actually fill the template.  Child classes should override the default.
         */
-       var $template = 'QuickTemplate';
+       public $template = 'QuickTemplate';
 
        /**
-        * Whether this skin use OutputPage::headElement() to generate the "<head>"
-        * tag
+        * @var bool Whether this skin use OutputPage::headElement() to generate
+        *   the "<head>" tag.
         */
-       var $useHeadElement = false;
-
-       /**#@-*/
+       public $useHeadElement = false;
 
        /**
         * Add specific styles for this skin
@@ -187,7 +181,10 @@ class SkinTemplate extends Skin {
                                        'lang' => $ilInterwikiCodeBCP47,
                                        'hreflang' => $ilInterwikiCodeBCP47,
                                );
-                               wfRunHooks( 'SkinTemplateGetLanguageLink', array( &$languageLink, $languageLinkTitle, $this->getTitle() ) );
+                               wfRunHooks(
+                                       'SkinTemplateGetLanguageLink',
+                                       array( &$languageLink, $languageLinkTitle, $this->getTitle() )
+                               );
                                $languageLinks[] = $languageLink;
                        }
                }
@@ -402,7 +399,8 @@ class SkinTemplate extends Skin {
                // that interface elements are in a different language.
                $tpl->set( 'userlangattributes', '' );
                $tpl->set( 'specialpageattributes', '' ); # obsolete
-               // Used by VectorBeta to insert HTML before content but after the heading for the page title. Defaults to empty string.
+               // Used by VectorBeta to insert HTML before content but after the
+               // heading for the page title. Defaults to empty string.
                $tpl->set( 'prebodyhtml', '' );
 
                if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
@@ -561,9 +559,14 @@ class SkinTemplate extends Skin {
                // and output printfooter and debughtml separately
                $tpl->set( 'bodycontent', $tpl->data['bodytext'] );
 
-               // Append printfooter and debughtml onto bodytext so that skins that were already
-               // using bodytext before they were split out don't suddenly start not outputting information
-               $tpl->data['bodytext'] .= Html::rawElement( 'div', array( 'class' => 'printfooter' ), "\n{$tpl->data['printfooter']}" ) . "\n";
+               // Append printfooter and debughtml onto bodytext so that skins that
+               // were already using bodytext before they were split out don't suddenly
+               // start not outputting information.
+               $tpl->data['bodytext'] .= Html::rawElement(
+                       'div',
+                       array( 'class' => 'printfooter' ),
+                       "\n{$tpl->data['printfooter']}"
+               ) . "\n";
                $tpl->data['bodytext'] .= $tpl->data['debughtml'];
 
                // allow extensions adding stuff after the page content.
@@ -733,7 +736,8 @@ class SkinTemplate extends Skin {
                        $login_url = array(
                                'text' => $this->msg( $loginlink )->text(),
                                'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
+                               'active' => $title->isSpecial( 'Userlogin' )
+                                       && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
                        );
                        $createaccount_url = array(
                                'text' => $this->msg( 'pt-createaccount' )->text(),
@@ -875,9 +879,10 @@ class SkinTemplate extends Skin {
         * links, however these are usually automatically generated by SkinTemplate
         * itself and are not necessary when using a hook. The only things these may
         * matter to are people modifying content_navigation after it's initial creation:
-        * - id: A "preferred" id, most skins are best off outputting this preferred id for best compatibility
+        * - id: A "preferred" id, most skins are best off outputting this preferred
+        *   id for best compatibility.
         * - tooltiponly: This is set to true for some tabs in cases where the system
-        *                believes that the accesskey should not be added to the tab.
+        *   believes that the accesskey should not be added to the tab.
         *
         * @return array
         */
@@ -974,7 +979,9 @@ class SkinTemplate extends Skin {
                                wfProfileIn( __METHOD__ . '-edit' );
 
                                // Checks if user can edit the current page if it exists or create it otherwise
-                               if ( $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) ) {
+                               if ( $title->quickUserCan( 'edit', $user )
+                                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) )
+                               ) {
                                        // Builds CSS class for talk page links
                                        $isTalkClass = $isTalk ? ' istalk' : '';
                                        // Whether the user is editing the page
@@ -985,14 +992,22 @@ class SkinTemplate extends Skin {
                                                && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() );
                                        $section = $request->getVal( 'section' );
 
-                                       if ( $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ) {
+                                       if ( $title->exists()
+                                               || ( $title->getNamespace() == NS_MEDIAWIKI
+                                                       && $title->getDefaultMessageText() !== false
+                                               )
+                                       ) {
                                                $msgKey = $isForeignFile ? 'edit-local' : 'edit';
                                        } else {
                                                $msgKey = $isForeignFile ? 'create-local' : 'create';
                                        }
                                        $content_navigation['views']['edit'] = array(
-                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
-                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
+                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection )
+                                                       ? 'selected'
+                                                       : ''
+                                               ) . $isTalkClass,
+                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => !$isForeignFile, // don't collapse this in vector
                                        );
@@ -1003,7 +1018,8 @@ class SkinTemplate extends Skin {
                                                //$content_navigation['actions']['addsection']
                                                $content_navigation['views']['addsection'] = array(
                                                        'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=edit&section=new' )
                                                );
                                        }
@@ -1012,7 +1028,8 @@ class SkinTemplate extends Skin {
                                        // Adds view source view link
                                        $content_navigation['views']['viewsource'] = array(
                                                'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => true, // don't collapse this in vector
                                        );
@@ -1025,7 +1042,8 @@ class SkinTemplate extends Skin {
                                        // Adds history view link
                                        $content_navigation['views']['history'] = array(
                                                'class' => ( $onPage && $action == 'history' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( 'action=history' ),
                                                'rel' => 'archives',
                                        );
@@ -1033,7 +1051,8 @@ class SkinTemplate extends Skin {
                                        if ( $title->quickUserCan( 'delete', $user ) ) {
                                                $content_navigation['actions']['delete'] = array(
                                                        'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=delete' )
                                                );
                                        }
@@ -1042,7 +1061,8 @@ class SkinTemplate extends Skin {
                                                $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() );
                                                $content_navigation['actions']['move'] = array(
                                                        'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $moveTitle->getLocalURL()
                                                );
                                        }
@@ -1052,7 +1072,8 @@ class SkinTemplate extends Skin {
                                                $n = $title->isDeleted();
                                                if ( $n ) {
                                                        $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
-                                                       // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
+                                                       // If the user can't undelete but can view deleted
+                                                       // history show them a "View .. deleted" tab instead.
                                                        $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
                                                        $content_navigation['actions']['undelete'] = array(
                                                                'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false,
@@ -1070,7 +1091,8 @@ class SkinTemplate extends Skin {
                                        $mode = $title->isProtected() ? 'unprotect' : 'protect';
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( "action=$mode" )
                                        );
                                }
@@ -1375,7 +1397,7 @@ abstract class QuickTemplate {
         */
        function __construct() {
                $this->data = array();
-               $this->translator = new MediaWiki_I18N();
+               $this->translator = new MediaWikiI18N();
        }
 
        /**
@@ -1411,7 +1433,7 @@ abstract class QuickTemplate {
        }
 
        /**
-        * @param MediaWiki_I18N $t
+        * @param MediaWikiI18N $t
         */
        public function setTranslator( &$t ) {
                $this->translator = &$t;
@@ -1556,11 +1578,15 @@ abstract class BaseTemplate extends QuickTemplate {
                wfProfileIn( __METHOD__ );
 
                $toolbox = array();
-               if ( isset( $this->data['nav_urls']['whatlinkshere'] ) && $this->data['nav_urls']['whatlinkshere'] ) {
+               if ( isset( $this->data['nav_urls']['whatlinkshere'] )
+                       && $this->data['nav_urls']['whatlinkshere']
+               ) {
                        $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere'];
                        $toolbox['whatlinkshere']['id'] = 't-whatlinkshere';
                }
-               if ( isset( $this->data['nav_urls']['recentchangeslinked'] ) && $this->data['nav_urls']['recentchangeslinked'] ) {
+               if ( isset( $this->data['nav_urls']['recentchangeslinked'] )
+                       && $this->data['nav_urls']['recentchangeslinked']
+               ) {
                        $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
                        $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
                        $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
@@ -1576,7 +1602,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
                        }
                }
-               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'userrights', 'upload', 'specialpages' ) as $special ) {
+               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser',
+                       'userrights', 'upload', 'specialpages' ) as $special
+               ) {
                        if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
                                $toolbox[$special] = $this->data['nav_urls'][$special];
                                $toolbox[$special]['id'] = "t-$special";
@@ -1844,7 +1872,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        }
                        while ( count( $wrapper ) > 0 ) {
                                $element = array_pop( $wrapper );
-                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] ) ? $element['attributes'] : null, $html );
+                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
+                                       ? $element['attributes']
+                                       : null, $html );
                        }
                }
 
@@ -1880,7 +1910,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                        $attrs['class'] = $options['link-class'];
                                }
                        }
-                       $html = Html::rawElement( isset( $attrs['href'] ) ? 'a' : $options['link-fallback'], $attrs, $html );
+                       $html = Html::rawElement( isset( $attrs['href'] )
+                               ? 'a'
+                               : $options['link-fallback'], $attrs, $html );
                }
 
                return $html;
@@ -1916,10 +1948,11 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        function makeListItem( $key, $item, $options = array() ) {
                if ( isset( $item['links'] ) ) {
-                       $html = '';
+                       $links = array();
                        foreach ( $item['links'] as $linkKey => $link ) {
-                               $html .= $this->makeLink( $linkKey, $link, $options );
+                               $links[] = $this->makeLink( $linkKey, $link, $options );
                        }
+                       $html = implode( ' ', $links );
                } else {
                        $link = $item;
                        // These keys are used by makeListItem and shouldn't be passed on to the link
index 6cd7828..c790bb7 100644 (file)
  * Could be replaced by curl_multi_exec() or some such.
  */
 class SquidPurgeClient {
-       var $host, $port, $ip;
+       /** @var string */
+       protected $host;
 
-       var $readState = 'idle';
-       var $writeBuffer = '';
-       var $requests = array();
-       var $currentRequestIndex;
+       /** @var int */
+       protected $port;
+
+       /** @var string|bool */
+       protected $ip;
+
+       /** @var string */
+       protected $readState = 'idle';
+
+       /** @var string */
+       protected $writeBuffer = '';
+
+       /** @var array */
+       protected $requests = array();
+
+       /** @var mixed */
+       protected $currentRequestIndex;
 
        const EINTR = 4;
        const EAGAIN = 11;
@@ -41,13 +55,16 @@ class SquidPurgeClient {
        const BUFFER_SIZE = 8192;
 
        /**
-        * The socket resource, or null for unconnected, or false for disabled due to error
+        * @var resource|null The socket resource, or null for unconnected, or false
+        *   for disabled due to error.
         */
-       var $socket;
+       protected $socket;
 
-       var $readBuffer;
+       /** @var string */
+       protected $readBuffer;
 
-       var $bodyRemaining;
+       /** @var int */
+       protected $bodyRemaining;
 
        /**
         * @param string $server
@@ -380,12 +397,11 @@ class SquidPurgeClient {
 }
 
 class SquidPurgeClientPool {
+       /** @var array of SquidPurgeClient */
+       protected $clients = array();
 
-       /**
-        * @var array of SquidPurgeClient
-        */
-       var $clients = array();
-       var $timeout = 5;
+       /** @var int */
+       protected $timeout = 5;
 
        /**
         * @param array $options
index a429c36..102fffd 100644 (file)
@@ -39,7 +39,8 @@ class StatCounter {
        /** @var array */
        protected $deltas = array(); // (key => count)
 
-       protected function __construct() {}
+       protected function __construct() {
+       }
 
        /**
         * @return StatCounter
index ef82705..2503150 100644 (file)
@@ -158,10 +158,14 @@ class StreamFile {
                # used for thumbnails (thumb.php)
                if ( $wgTrivialMimeDetection ) {
                        switch ( $ext ) {
-                               case 'gif': return 'image/gif';
-                               case 'png': return 'image/png';
-                               case 'jpg': return 'image/jpeg';
-                               case 'jpeg': return 'image/jpeg';
+                               case 'gif':
+                                       return 'image/gif';
+                               case 'png':
+                                       return 'image/png';
+                               case 'jpg':
+                                       return 'image/jpeg';
+                               case 'jpeg':
+                                       return 'image/jpeg';
                        }
 
                        return 'unknown/unknown';
index bb173e7..64df81b 100644 (file)
  * which refers to it should be kept to a minimum.
  */
 class StubObject {
-       var $mGlobal, $mClass, $mParams;
+       /** @var null|string */
+       protected $mGlobal;
+
+       /** @var null|string */
+       protected $mClass;
+
+       /** @var array */
+       protected $mParams;
 
        /**
         * Constructor.
@@ -142,9 +149,11 @@ class StubObject {
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
                                wfProfileOut( $fname );
-                               throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
+                               throw new MWException( "Unstub loop detected on call of "
+                                       . "\${$this->mGlobal}->$name from $caller\n" );
                        }
-                       wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
+                       wfDebug( "Unstubbing \${$this->mGlobal} on call of "
+                               . "\${$this->mGlobal}::$name from $caller\n" );
                        $GLOBALS[$this->mGlobal] = $this->_newObject();
                        --$recursionLevel;
                        wfProfileOut( $fname );
index 4345a73..b9c0c35 100644 (file)
@@ -3,4 +3,5 @@
 /**
  * @since 1.20
  */
-class TimestampException extends MWException {}
+class TimestampException extends MWException {
+}
index 70d2baa..67958ff 100644 (file)
@@ -56,38 +56,102 @@ class Title {
         */
        // @{
 
-       var $mTextform = '';              // /< Text form (spaces not underscores) of the main part
-       var $mUrlform = '';               // /< URL-encoded form of the main part
-       var $mDbkeyform = '';             // /< Main part with underscores
-       var $mUserCaseDBKey;              // /< DB key with the initial letter in the case specified by the user
-       var $mNamespace = NS_MAIN;        // /< Namespace index, i.e. one of the NS_xxxx constants
-       var $mInterwiki = '';             // /< Interwiki prefix
-       var $mFragment = '';              // /< Title fragment (i.e. the bit after the #)
-       var $mArticleID = -1;             // /< Article ID, fetched from the link cache on demand
-       var $mLatestID = false;           // /< ID of most recent revision
-       var $mContentModel = false;       // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
-       private $mEstimateRevisions;      // /< Estimated number of revisions; null of not loaded
-       var $mRestrictions = array();     // /< Array of groups allowed to edit this article
-       var $mOldRestrictions = false;
-       var $mCascadeRestriction;         ///< Cascade restrictions on this page to included templates and images?
-       var $mCascadingRestrictions;      // Caching the results of getCascadeProtectionSources
-       var $mRestrictionsExpiry = array(); ///< When do the restrictions on this page expire?
-       var $mHasCascadingRestrictions;   ///< Are cascading restrictions in effect on this page?
-       var $mCascadeSources;             ///< Where are the cascading restrictions coming from on this page?
-       var $mRestrictionsLoaded = false; ///< Boolean for initialisation on demand
-       var $mPrefixedText = null;        ///< Text form including namespace/interwiki, initialised on demand
-       var $mTitleProtection;            ///< Cached value for getTitleProtection (create protection)
-       # Don't change the following default, NS_MAIN is hardcoded in several
-       # places.  See bug 696.
-       # Zero except in {{transclusion}} tags
-       var $mDefaultNamespace = NS_MAIN; // /< Namespace index when there is no namespace
-       var $mWatched = null;             // /< Is $wgUser watching this page? null if unfilled, accessed through userIsWatching()
-       var $mLength = -1;                // /< The page length, 0 for special pages
-       var $mRedirect = null;            // /< Is the article at this title a redirect?
-       var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
-       var $mHasSubpage;                 // /< Whether a page has any subpages
-       private $mPageLanguage = false;   // /< The (string) language code of the page's language and content code.
-       private $mTitleValue = null;      // /< A corresponding TitleValue object
+       /** @var string Text form (spaces not underscores) of the main part */
+       public $mTextform = '';
+
+       /** @var string URL-encoded form of the main part */
+       public $mUrlform = '';
+
+       /** @var string Main part with underscores */
+       public $mDbkeyform = '';
+
+       /** @var string Database key with the initial letter in the case specified by the user */
+       protected $mUserCaseDBKey;
+
+       /** @var int Namespace index, i.e. one of the NS_xxxx constants */
+       public $mNamespace = NS_MAIN;
+
+       /** @var string Interwiki prefix */
+       public $mInterwiki = '';
+
+       /** @var string Title fragment (i.e. the bit after the #) */
+       public $mFragment = '';
+
+       /** @var int Article ID, fetched from the link cache on demand */
+       public $mArticleID = -1;
+
+       /** @var bool|int ID of most recent revision */
+       protected $mLatestID = false;
+
+       /**
+        * @var bool|string ID of the page's content model, i.e. one of the
+        *   CONTENT_MODEL_XXX constants
+        */
+       public $mContentModel = false;
+
+       /** @var int Estimated number of revisions; null of not loaded */
+       private $mEstimateRevisions;
+
+       /** @var array Array of groups allowed to edit this article */
+       public $mRestrictions = array();
+
+       /** @var bool  */
+       protected $mOldRestrictions = false;
+
+       /** @var bool Cascade restrictions on this page to included templates and images? */
+       public $mCascadeRestriction;
+
+       /** Caching the results of getCascadeProtectionSources */
+       public $mCascadingRestrictions;
+
+       /** @var array When do the restrictions on this page expire? */
+       protected $mRestrictionsExpiry = array();
+
+       /** @var bool Are cascading restrictions in effect on this page? */
+       protected $mHasCascadingRestrictions;
+
+       /** @var array Where are the cascading restrictions coming from on this page? */
+       public $mCascadeSources;
+
+       /** @var bool Boolean for initialisation on demand */
+       public $mRestrictionsLoaded = false;
+
+       /** @var string Text form including namespace/interwiki, initialised on demand */
+       protected $mPrefixedText = null;
+
+       /** @var mixed Cached value for getTitleProtection (create protection) */
+       public $mTitleProtection;
+
+       /**
+        * @var int Namespace index when there is no namespace. Don't change the
+        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   Zero except in {{transclusion}} tags.
+        */
+       public $mDefaultNamespace = NS_MAIN;
+
+       /**
+        * @var bool Is $wgUser watching this page? null if unfilled, accessed
+        * through userIsWatching()
+        */
+       protected $mWatched = null;
+
+       /** @var int The page length, 0 for special pages */
+       protected $mLength = -1;
+
+       /** @var null Is the article at this title a redirect? */
+       public $mRedirect = null;
+
+       /** @var array Associative array of user ID -> timestamp/false */
+       private $mNotificationTimestamp = array();
+
+       /** @var bool Whether a page has any subpages */
+       private $mHasSubpages;
+
+       /** @var bool The (string) language code of the page's language and content code. */
+       private $mPageLanguage = false;
+
+       /** @var TitleValue A corresponding TitleValue object */
+       private $mTitleValue = null;
        // @}
 
        /**
@@ -115,7 +179,11 @@ class Title {
                }
 
                if ( !$titleCodec ) {
-                       $titleCodec = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton(), $wgLocalInterwikis );
+                       $titleCodec = new MediaWikiTitleCodec(
+                               $wgContLang,
+                               GenderCache::singleton(),
+                               $wgLocalInterwikis
+                       );
                        $titleCodecFingerprint = $fingerprint;
                }
 
@@ -136,10 +204,8 @@ class Title {
                return self::getTitleParser();
        }
 
-       /**
-        * Constructor
-        */
-       /*protected*/ function __construct() { }
+       function __construct() {
+       }
 
        /**
         * Create a new Title from a prefixed DB key
@@ -218,8 +284,7 @@ class Title {
                        }
                        return $t;
                } else {
-                       $ret = null;
-                       return $ret;
+                       return null;
                }
        }
 
@@ -267,8 +332,9 @@ class Title {
        }
 
        /**
-        * Returns a list of fields that are to be selected for initializing Title objects or LinkCache entries.
-        * Uses $wgContentHandlerUseDB to determine whether to include page_content_model.
+        * Returns a list of fields that are to be selected for initializing Title
+        * objects or LinkCache entries. Uses $wgContentHandlerUseDB to determine
+        * whether to include page_content_model.
         *
         * @return array
         */
@@ -1137,9 +1203,11 @@ class Title {
         * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
         * or CONTENT_MODEL_JAVASCRIPT.
         *
-        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage() for that!
+        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage()
+        * for that!
         *
-        * Note that this method should not return true for pages that contain and show "inactive" CSS or JS.
+        * Note that this method should not return true for pages that contain and
+        * show "inactive" CSS or JS.
         *
         * @return bool
         */
@@ -1148,8 +1216,9 @@ class Title {
                        && ( $this->hasContentModel( CONTENT_MODEL_CSS )
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
-               #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
-               #      hook functions can force this method to return true even outside the mediawiki namespace.
+               # @note This hook is also called in ContentHandler::getDefaultModel.
+               #   It's called here again to make sure hook functions can force this
+               #   method to return true even outside the mediawiki namespace.
 
                wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
 
@@ -1858,7 +1927,9 @@ class Title {
                        global $wgUser;
                        $user = $wgUser;
                }
-               return !count( $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries, true ) );
+
+               return !count( $this->getUserPermissionsErrorsInternal(
+                       $action, $user, $doExpensiveQueries, true ) );
        }
 
        /**
@@ -1874,7 +1945,9 @@ class Title {
         *   whose corresponding errors may be ignored.
         * @return array Array of arguments to wfMessage to explain permissions problems.
         */
-       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) {
+       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true,
+               $ignoreErrors = array()
+       ) {
                $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
 
                // Remove the errors being ignored.
@@ -1900,8 +1973,12 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+       private function checkQuickPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
+               if ( !wfRunHooks( 'TitleQuickPermissions',
+                       array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) )
+               ) {
                        return $errors;
                }
 
@@ -1924,6 +2001,11 @@ class Title {
                                $errors[] = array( 'movenotallowedfile' );
                        }
 
+                       // Check if user is allowed to move category pages if it's a category page
+                       if ( $this->mNamespace == NS_CATEGORY && !$user->isAllowed( 'move-categorypages' ) ) {
+                               $errors[] = array( 'cant-move-category-page' );
+                       }
+
                        if ( !$user->isAllowed( 'move' ) ) {
                                // User can't move anything
                                $userCanMove = User::groupHasPermission( 'user', 'move' );
@@ -1943,6 +2025,10 @@ class Title {
                                        && $this->mNamespace == NS_USER && !$this->isSubpage() ) {
                                // Show user page-specific message only if the user can move other pages
                                $errors[] = array( 'cant-move-to-user-page' );
+                       } elseif ( !$user->isAllowed( 'move-categorypages' )
+                                       && $this->mNamespace == NS_CATEGORY ) {
+                               // Show category page-specific message only if the user can move other pages
+                               $errors[] = array( 'cant-move-to-category-page' );
                        }
                } elseif ( !$user->isAllowed( $action ) ) {
                        $errors[] = $this->missingPermissionError( $action, $short );
@@ -2020,7 +2106,9 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkSpecialsAndNSPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                # Only 'createaccount' can be performed on special pages,
                # which don't actually exist in the DB.
                if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
@@ -2119,7 +2207,9 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkCascadingSourcesRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkCascadingSourcesRestrictions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
                        # We /could/ use the protection level on the source page, but it's
                        # fairly ugly as we have to establish a precedence hierarchy for pages
@@ -2166,11 +2256,15 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkActionPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                global $wgDeleteRevisionsLimit, $wgLang;
 
                if ( $action == 'protect' ) {
-                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $doExpensiveQueries, true ) ) ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit',
+                               $user, $doExpensiveQueries, true ) )
+                       ) {
                                // If they can't edit, they shouldn't protect.
                                $errors[] = array( 'protect-cantedit' );
                        }
@@ -2186,7 +2280,11 @@ class Title {
                                if ( $title_protection['pt_create_perm'] == ''
                                        || !$user->isAllowed( $title_protection['pt_create_perm'] )
                                ) {
-                                       $errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
+                                       $errors[] = array(
+                                               'titleprotected',
+                                               User::whoIs( $title_protection['pt_user'] ),
+                                               $title_protection['pt_reason']
+                                       );
                                }
                        }
                } elseif ( $action == 'move' ) {
@@ -2367,7 +2465,9 @@ class Title {
         * @param bool $short Set this to true to stop after the first permission error.
         * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
-       protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
+       protected function getUserPermissionsErrorsInternal( $action, $user,
+               $doExpensiveQueries = true, $short = false
+       ) {
                wfProfileIn( __METHOD__ );
 
                # Read has special handling
@@ -3372,7 +3472,15 @@ class Title {
                $namespaceFiled = "{$prefix}_namespace";
                $titleField = "{$prefix}_title";
 
-               $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               $fields = array(
+                       $namespaceFiled,
+                       $titleField,
+                       'page_id',
+                       'page_len',
+                       'page_is_redirect',
+                       'page_latest'
+               );
+
                if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'page_content_model';
                }
@@ -3383,7 +3491,10 @@ class Title {
                        array( "{$prefix}_from" => $id ),
                        __METHOD__,
                        $options,
-                       array( 'page' => array( 'LEFT JOIN', array( "page_namespace=$namespaceFiled", "page_title=$titleField" ) ) )
+                       array( 'page' => array(
+                               'LEFT JOIN',
+                               array( "page_namespace=$namespaceFiled", "page_title=$titleField" )
+                       ) )
                );
 
                $retVal = array();
@@ -3419,9 +3530,11 @@ class Title {
        }
 
        /**
-        * Get an array of Title objects referring to non-existent articles linked from this page
+        * Get an array of Title objects referring to non-existent articles linked
+        * from this page.
         *
-        * @todo check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case)
+        * @todo check if needed (used only in SpecialBrokenRedirects.php, and
+        *   should use redirect table in this case).
         * @return Title[] Array of Title the Title objects
         */
        public function getBrokenLinksFrom() {
@@ -3758,7 +3871,13 @@ class Title {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
                        // @todo FIXME: $params?
-                       $logId = $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
+                       $logId = $log->addEntry(
+                               'move_prot',
+                               $nt,
+                               $comment,
+                               array( $this->getPrefixedText() ),
+                               $wgUser
+                       );
 
                        // reread inserted pr_ids for log relation
                        $insertedPrIds = $dbw->select(
@@ -3812,9 +3931,17 @@ class Title {
                }
 
                if ( $createRedirect ) {
-                       $contentHandler = ContentHandler::getForTitle( $this );
-                       $redirectContent = $contentHandler->makeRedirectContent( $nt,
-                               wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       if ( $this->getNamespace() == NS_CATEGORY
+                               && !wfMessage( 'category-move-redirect-override' )->isDisabled()
+                       ) {
+                               $redirectContent = new WikitextContent(
+                                       wfMessage( 'category-move-redirect-override' )
+                                               ->params( $nt->getPrefixedText() )->inContentLanguage()->plain() );
+                       } else {
+                               $contentHandler = ContentHandler::getForTitle( $this );
+                               $redirectContent = $contentHandler->makeRedirectContent( $nt,
+                                       wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       }
 
                        // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
                } else {
@@ -4025,7 +4152,10 @@ class Title {
                $this->mArticleID = $row ? intval( $row->page_id ) : 0;
                $this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
                $this->mLatestID = $row ? intval( $row->page_latest ) : false;
-               $this->mContentModel = $row && isset( $row->page_content_model ) ? strval( $row->page_content_model ) : false;
+               $this->mContentModel = $row && isset( $row->page_content_model )
+                       ? strval( $row->page_content_model )
+                       : false;
+
                if ( !$this->mRedirect ) {
                        return false;
                }
@@ -4554,7 +4684,9 @@ class Title {
                        // Use always content language to avoid loading hundreds of languages
                        // to get the link color.
                        global $wgContLang;
-                       list( $name, ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+                       list( $name, ) = MessageCache::singleton()->figureMessage(
+                               $wgContLang->lcfirst( $this->getText() )
+                       );
                        $message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false );
                        return $message->exists();
                }
@@ -4574,7 +4706,9 @@ class Title {
                        return false;
                }
 
-               list( $name, $lang ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+               list( $name, $lang ) = MessageCache::singleton()->figureMessage(
+                       $wgContLang->lcfirst( $this->getText() )
+               );
                $message = wfMessage( $name )->inLanguage( $lang )->useDatabase( false );
 
                if ( $message->exists() ) {
@@ -4837,9 +4971,12 @@ class Title {
                }
 
                if ( !$this->mPageLanguage || $this->mPageLanguage[1] !== $wgLanguageCode ) {
-                       // Note that this may depend on user settings, so the cache should be only per-request.
-                       // NOTE: ContentHandler::getPageLanguage() may need to load the content to determine the page language!
-                       // Checking $wgLanguageCode hasn't changed for the benefit of unit tests.
+                       // Note that this may depend on user settings, so the cache should
+                       // be only per-request.
+                       // NOTE: ContentHandler::getPageLanguage() may need to load the
+                       // content to determine the page language!
+                       // Checking $wgLanguageCode hasn't changed for the benefit of unit
+                       // tests.
                        $contentHandler = ContentHandler::getForTitle( $this );
                        $langObj = wfGetLangObj( $contentHandler->getPageLanguage( $this ) );
                        $this->mPageLanguage = array( $langObj->getCode(), $wgLanguageCode );
@@ -4872,8 +5009,9 @@ class Title {
                        return $wgLang;
                }
 
-               //NOTE: can't be cached persistently, depends on user settings
-               //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language!
+               // @note Can't be cached persistently, depends on user settings.
+               // @note ContentHandler::getPageViewLanguage() may need to load the
+               //   content to determine the page language!
                $contentHandler = ContentHandler::getForTitle( $this );
                $pageLang = $contentHandler->getPageViewLanguage( $this );
                return $pageLang;
index 4fcb2eb..668ea54 100644 (file)
  */
 
 class TitleArrayFromResult extends TitleArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       public $key;
+
+       public $current;
 
        function __construct( $res ) {
                $this->res = $res;
index a1a4b24..6578341 100644 (file)
@@ -76,7 +76,7 @@ class User {
         * corresponding database fields must call a cache-clearing function.
         * @showinitializer
         */
-       static $mCacheVars = array(
+       protected static $mCacheVars = array(
                // user table
                'mId',
                'mName',
@@ -105,7 +105,7 @@ class User {
         * "right-$right".
         * @showinitializer
         */
-       static $mCoreRights = array(
+       protected static $mCoreRights = array(
                'apihighlimits',
                'autoconfirmed',
                'autopatrol',
@@ -143,6 +143,7 @@ class User {
                'minoredit',
                'move',
                'movefile',
+               'move-categorypages',
                'move-rootuserpages',
                'move-subpages',
                'nominornewtalk',
@@ -175,17 +176,45 @@ class User {
                'viewmywatchlist',
                'writeapi',
        );
+
        /**
         * String Cached results of getAllRights()
         */
-       static $mAllRights = false;
+       protected static $mAllRights = false;
 
        /** @name Cache variables */
        //@{
-       var $mId, $mName, $mRealName, $mPassword, $mNewpassword, $mNewpassTime,
-               $mEmail, $mTouched, $mToken, $mEmailAuthenticated,
-               $mEmailToken, $mEmailTokenExpires, $mRegistration, $mEditCount,
-               $mGroups, $mOptionOverrides;
+       public $mId;
+
+       public $mName;
+
+       public $mRealName;
+
+       public $mPassword;
+
+       public $mNewpassword;
+
+       public $mNewpassTime;
+
+       public $mEmail;
+
+       public $mTouched;
+
+       protected $mToken;
+
+       public $mEmailAuthenticated;
+
+       protected $mEmailToken;
+
+       protected $mEmailTokenExpires;
+
+       protected $mRegistration;
+
+       protected $mEditCount;
+
+       public $mGroups;
+
+       protected $mOptionOverrides;
 
        protected $mPasswordExpires;
        //@}
@@ -194,12 +223,12 @@ class User {
         * Bool Whether the cache variables have been loaded.
         */
        //@{
-       var $mOptionsLoaded;
+       public $mOptionsLoaded;
 
        /**
         * Array with already loaded items or true if all items have been loaded.
         */
-       private $mLoadedItems = array();
+       protected $mLoadedItems = array();
        //@}
 
        /**
@@ -211,41 +240,55 @@ class User {
         *
         * Use the User::newFrom*() family of functions to set this.
         */
-       var $mFrom;
+       public $mFrom;
 
        /**
         * Lazy-initialized variables, invalidated with clearInstanceCache
         */
-       var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
-               $mBlockreason, $mEffectiveGroups, $mImplicitGroups, $mFormerGroups, $mBlockedGlobally,
-               $mLocked, $mHideName, $mOptions;
+       protected $mNewtalk;
+
+       protected $mDatePreference;
+
+       public $mBlockedby;
+
+       protected $mHash;
+
+       public $mRights;
+
+       protected $mBlockreason;
+
+       protected $mEffectiveGroups;
+
+       protected $mImplicitGroups;
+
+       protected $mFormerGroups;
+
+       protected $mBlockedGlobally;
+
+       protected $mLocked;
+
+       public $mHideName;
+
+       public $mOptions;
 
        /**
         * @var WebRequest
         */
        private $mRequest;
 
-       /**
-        * @var Block
-        */
-       var $mBlock;
+       /** @var Block */
+       public $mBlock;
 
-       /**
-        * @var bool
-        */
-       var $mAllowUsertalk;
+       /** @var bool */
+       protected $mAllowUsertalk;
 
-       /**
-        * @var Block
-        */
+       /** @var Block */
        private $mBlockedFromCreateAccount = false;
 
-       /**
-        * @var array
-        */
+       /** @var array */
        private $mWatchedItems = array();
 
-       static $idCacheByName = array();
+       public static $idCacheByName = array();
 
        /**
         * Lightweight constructor for an anonymous user.
@@ -516,7 +559,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_SLAVE );
-               $s = $dbr->selectRow( 'user', array( 'user_id' ), array( 'user_name' => $nt->getText() ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       array( 'user_id' ),
+                       array( 'user_name' => $nt->getText() ),
+                       __METHOD__
+               );
 
                if ( $s === false ) {
                        $result = null;
@@ -557,7 +605,8 @@ class User {
         * @return bool
         */
        public static function isIP( $name ) {
-               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
+               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name )
+                       || IP::isIPv6( $name );
        }
 
        /**
@@ -755,7 +804,9 @@ class User {
                        } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                $status->error( 'password-name-match' );
                                return $status;
-                       } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
+                       } elseif ( isset( $blockedLogins[$this->getName()] )
+                               && $password == $blockedLogins[$this->getName()]
+                       ) {
                                $status->error( 'password-login-forbidden' );
                                return $status;
                        } else {
@@ -954,7 +1005,8 @@ class User {
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
-               // Decide the final password length based on our min password length, stopping at a minimum of 10 chars
+               // Decide the final password length based on our min password length,
+               // stopping at a minimum of 10 chars.
                $length = max( 10, $wgMinimalPasswordLength );
                // Multiply by 1.25 to get the number of hex characters we need
                $length = $length * 1.25;
@@ -1085,14 +1137,16 @@ class User {
                }
 
                if ( $request->getSessionData( 'wsToken' ) ) {
-                       $passwordCorrect = ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
+                       $passwordCorrect =
+                               ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
                        $from = 'session';
                } elseif ( $request->getCookie( 'Token' ) ) {
                        # Get the token from DB/cache and clean it up to remove garbage padding.
                        # This deals with historical problems with bugs and the default column value.
                        $token = rtrim( $proposedUser->getToken( false ) ); // correct token
                        // Make comparison in constant time (bug 61346)
-                       $passwordCorrect = strlen( $token ) && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
+                       $passwordCorrect = strlen( $token )
+                               && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        // No session or persistent login cookie
@@ -1122,11 +1176,13 @@ class User {
                        $passwordCorrect = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $answer ); $i++ ) {
+                       $answerLength = strlen( $answer );
+                       for ( $i = 0; $i < $answerLength; $i++ ) {
                                $result |= ord( $answer[$i] ) ^ ord( $test[$i] );
                        }
                        $passwordCorrect = ( $result == 0 );
                }
+
                return $passwordCorrect;
        }
 
@@ -1147,7 +1203,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_MASTER );
-               $s = $dbr->selectRow( 'user', self::selectFields(), array( 'user_id' => $this->mId ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       self::selectFields(),
+                       array( 'user_id' => $this->mId ),
+                       __METHOD__
+               );
 
                wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
@@ -1722,10 +1783,11 @@ class User {
        /**
         * Check if user is blocked
         *
-        * @param bool $bFromSlave Whether to check the slave database instead of the master
+        * @param bool $bFromSlave Whether to check the slave database instead of
+        *   the master. Hacked from false due to horrible probs on site.
         * @return bool True if blocked, false otherwise
         */
-       public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
+       public function isBlocked( $bFromSlave = true ) {
                return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
        }
 
@@ -2082,7 +2144,8 @@ class User {
        /**
         * Update the 'You have new messages!' status.
         * @param bool $val Whether the user has new messages
-        * @param Revision $curRev New, as yet unseen revision of the user talk page. Ignored if null or !$val.
+        * @param Revision $curRev New, as yet unseen revision of the user talk
+        *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
                if ( wfReadOnly() ) {
@@ -2266,7 +2329,8 @@ class User {
 
        /**
         * Get the user's current token.
-        * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
+        * @param bool $forceCreation Force the generation of a new token if the
+        *   user doesn't have one (default=true for backwards compatibility).
         * @return string Token
         */
        public function getToken( $forceCreation = true ) {
@@ -2603,7 +2667,8 @@ class User {
         *
         * @see User::listOptionKinds
         * @param IContextSource $context
-        * @param array $options Assoc. array with options keys to check as keys. Defaults to $this->mOptions.
+        * @param array $options Assoc. array with options keys to check as keys.
+        *   Defaults to $this->mOptions.
         * @return array the key => kind mapping data
         */
        public function getOptionKinds( IContextSource $context, $options = null ) {
@@ -3478,17 +3543,20 @@ class User {
         * Add a user to the database, return the user object
         *
         * @param string $name Username to add
-        * @param array $params Array of Strings Non-default parameters to save to the database as user_* fields:
-        *   - password             The user's password hash. Password logins will be disabled if this is omitted.
-        *   - newpassword          Hash for a temporary password that has been mailed to the user
-        *   - email                The user's email address
-        *   - email_authenticated  The email authentication timestamp
-        *   - real_name            The user's real name
-        *   - options              An associative array of non-default options
-        *   - token                Random authentication token. Do not set.
-        *   - registration         Registration timestamp. Do not set.
-        *
-        * @return User|null User object, or null if the username already exists
+        * @param array $params Array of Strings Non-default parameters to save to
+        *   the database as user_* fields:
+        *   - password: The user's password hash. Password logins will be disabled
+        *     if this is omitted.
+        *   - newpassword: Hash for a temporary password that has been mailed to
+        *     the user.
+        *   - email: The user's email address.
+        *   - email_authenticated: The email authentication timestamp.
+        *   - real_name: The user's real name.
+        *   - options: An associative array of non-default options.
+        *   - token: Random authentication token. Do not set.
+        *   - registration: Registration timestamp. Do not set.
+        *
+        * @return User|null User object, or null if the username already exists.
         */
        public static function createNew( $name, $params = array() ) {
                $user = new User;
@@ -3659,7 +3727,8 @@ class User {
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
                        $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
                }
-               return $this->mBlockedFromCreateAccount instanceof Block && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
+               return $this->mBlockedFromCreateAccount instanceof Block
+                       && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
                        ? $this->mBlockedFromCreateAccount
                        : false;
        }
@@ -3818,7 +3887,8 @@ class User {
         * Generate a looking random token for various uses.
         *
         * @return string The new random token
-        * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+        * @deprecated since 1.20: Use MWCryptRand for secure purposes or
+        *   wfRandomString for pseudo-randomness.
         */
        public static function generateToken() {
                return MWCryptRand::generateHex( 32 );
@@ -3840,6 +3910,7 @@ class User {
                if ( $val != $sessionToken ) {
                        wfDebug( "User::matchEditToken: broken session data\n" );
                }
+
                return $val == $sessionToken;
        }
 
@@ -3898,7 +3969,8 @@ class User {
         *
         * @param string $subject Message subject
         * @param string $body Message body
-        * @param string $from Optional From address; if unspecified, default $wgPasswordSender will be used
+        * @param string $from Optional From address; if unspecified, default
+        *   $wgPasswordSender will be used.
         * @param string $replyto Reply-To address
         * @return Status
         */
@@ -4284,8 +4356,11 @@ class User {
         */
        public static function getImplicitGroups() {
                global $wgImplicitGroups;
+
                $groups = $wgImplicitGroups;
-               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );       #deprecated, use $wgImplictGroups instead
+               # Deprecated, use $wgImplictGroups instead
+               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );
+
                return $groups;
        }
 
@@ -4359,7 +4434,13 @@ class User {
        public static function changeableByGroup( $group ) {
                global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
-               $groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
+               $groups = array(
+                       'add' => array(),
+                       'remove' => array(),
+                       'add-self' => array(),
+                       'remove-self' => array()
+               );
+
                if ( empty( $wgAddGroups[$group] ) ) {
                        // Don't add anything to $groups
                } elseif ( $wgAddGroups[$group] === true ) {
index 0012b44..dd67acd 100644 (file)
  */
 
 class UserArrayFromResult extends UserArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       /** @var int */
+       public $key;
+
+       /** @var  */
+       public $current;
 
        /**
         * @param ResultWrapper $res
index 1ec2792..d3e8cb8 100644 (file)
@@ -58,7 +58,7 @@ class MailAddress {
                if ( $this->address ) {
                        if ( $this->name != '' && !wfIsWindows() ) {
                                global $wgEnotifUseRealName;
-                               $name = ( $wgEnotifUseRealName && $this->realName ) ? $this->realName : $this->name;
+                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
                                $quoted = UserMailer::quotedPrintable( $name );
                                if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
                                        $quoted = '"' . $quoted . '"';
@@ -81,7 +81,7 @@ class MailAddress {
  * Collection of static functions for sending mail
  */
 class UserMailer {
-       static $mErrorString;
+       private static $mErrorString;
 
        /**
         * Send mail using a PEAR mailer
@@ -160,7 +160,9 @@ class UserMailer {
         * @throws MWException
         * @return Status
         */
-       public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
+       public static function send( $to, $from, $subject, $body, $replyto = null,
+               $contentType = 'text/plain; charset=UTF-8'
+       ) {
                global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
                $mime = null;
                if ( !is_array( $to ) ) {
@@ -268,7 +270,11 @@ class UserMailer {
                                        $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
                                        $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
                                }
-                               $mime = new Mail_mime( array( 'eol' => $endl, 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8' ) );
+                               $mime = new Mail_mime( array(
+                                       'eol' => $endl,
+                                       'text_charset' => 'UTF-8',
+                                       'html_charset' => 'UTF-8'
+                               ) );
                                $mime->setTXTBody( $body['text'] );
                                $mime->setHTMLBody( $body['html'] );
                                $body = $mime->get(); // must call get() before headers()
@@ -360,7 +366,13 @@ class UserMailer {
                                        if ( $safeMode ) {
                                                $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
                                        } else {
-                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+                                               $sent = mail(
+                                                       $recip,
+                                                       self::quotedPrintable( $subject ),
+                                                       $body,
+                                                       $headers,
+                                                       $wgAdditionalMailParams
+                                               );
                                        }
                                }
                        } catch ( Exception $e ) {
@@ -501,7 +513,9 @@ class EmailNotification {
         * @param bool $oldid (default: false)
         * @param string $pageStatus (default: 'changed')
         */
-       public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false, $pageStatus = 'changed' ) {
+       public function notifyOnPageChange( $editor, $title, $timestamp, $summary,
+               $minorEdit, $oldid = false, $pageStatus = 'changed'
+       ) {
                global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
                        $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
 
@@ -555,7 +569,10 @@ class EmailNotification {
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
                        if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
                                $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
-                               if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+                               if ( $wgEnotifUserTalk
+                                       && $isUserTalkPage
+                                       && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                               ) {
                                        $sendEmail = true;
                                }
                        }
@@ -564,6 +581,7 @@ class EmailNotification {
                if ( !$sendEmail ) {
                        return;
                }
+
                if ( $wgEnotifUseJobQ ) {
                        $params = array(
                                'editor' => $editor->getName(),
@@ -578,7 +596,16 @@ class EmailNotification {
                        $job = new EnotifNotifyJob( $title, $params );
                        JobQueueGroup::singleton()->push( $job );
                } else {
-                       $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers, $pageStatus );
+                       $this->actuallyNotifyOnPageChange(
+                               $editor,
+                               $title,
+                               $timestamp,
+                               $summary,
+                               $minorEdit,
+                               $oldid,
+                               $watchers,
+                               $pageStatus
+                       );
                }
        }
 
@@ -632,8 +659,10 @@ class EmailNotification {
                $userTalkId = false;
 
                if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
-
-                       if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+                       if ( $wgEnotifUserTalk
+                               && $isUserTalkPage
+                               && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                       ) {
                                $targetUser = User::newFromName( $title->getText() );
                                $this->compose( $targetUser );
                                $userTalkId = $targetUser->getId();
@@ -761,13 +790,16 @@ class EmailNotification {
                        $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
 
                } else {
-                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
+                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName && $this->editor->getRealName() !== ''
+                               ? $this->editor->getRealName() : $this->editor->getName();
                        $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
                        $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
                }
 
                $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
-               $keys['$HELPPAGE'] = wfExpandUrl( Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ) );
+               $keys['$HELPPAGE'] = wfExpandUrl(
+                       Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
+               );
 
                # Replace this after transforming the message, bug 35019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
@@ -857,8 +889,9 @@ class EmailNotification {
        function sendPersonalised( $watchingUser ) {
                global $wgContLang, $wgEnotifUseRealName;
                // From the PHP manual:
-               //     Note:  The to parameter cannot be an address in the form of "Something <someone@example.com>".
-               //     The mail command will not parse this properly while talking with the MTA.
+               //   Note: The to parameter cannot be an address in the form of
+               //   "Something <someone@example.com>". The mail command will not parse
+               //   this properly while talking with the MTA.
                $to = new MailAddress( $watchingUser );
 
                # $PAGEEDITDATE is the time and date of the page change
@@ -868,7 +901,8 @@ class EmailNotification {
                        array( '$WATCHINGUSERNAME',
                                '$PAGEEDITDATE',
                                '$PAGEEDITTIME' ),
-                       array( $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName(),
+                       array( $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
+                                       ? $watchingUser->getRealName() : $watchingUser->getName(),
                                $wgContLang->userDate( $this->timestamp, $watchingUser ),
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
index 9f2b498..f69fe63 100644 (file)
@@ -41,8 +41,23 @@ class WatchedItem {
         */
        const CHECK_USER_RIGHTS = 1;
 
-       var $mTitle, $mUser, $mCheckRights;
-       private $loaded = false, $watched, $timestamp;
+       /** @var Title */
+       public $mTitle;
+
+       /** @var User */
+       public $mUser;
+
+       /** @var int */
+       public $mCheckRights;
+
+       /** @var bool */
+       private $loaded = false;
+
+       /** @var bool */
+       private $watched;
+
+       /** @var string */
+       private $timestamp;
 
        /**
         * Create a WatchedItem object with the given user and title
@@ -53,7 +68,9 @@ class WatchedItem {
         *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
         * @return WatchedItem
         */
-       public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+       public static function fromUserTitle( $user, $title,
+               $checkRights = WatchedItem::CHECK_USER_RIGHTS
+       ) {
                $wl = new WatchedItem;
                $wl->mUser = $user;
                $wl->mTitle = $title;
@@ -389,7 +406,13 @@ class WatchedItem {
                # Perform replace
                # Note that multi-row replace is very efficient for MySQL but may be inefficient for
                # some other DBMSes, mostly due to poor simulation by us
-               $dbw->replace( 'watchlist', array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ), $values, __METHOD__ );
+               $dbw->replace(
+                       'watchlist',
+                       array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ),
+                       $values,
+                       __METHOD__
+               );
+
                return true;
        }
 }
index 12cf0d9..ac8e159 100644 (file)
@@ -696,7 +696,9 @@ class WebRequest {
        public function getRequestURL() {
                if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
-               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
+               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+                       && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+               ) {
                        // Probably IIS; doesn't set REQUEST_URI
                        $base = $_SERVER['HTTP_X_ORIGINAL_URL'];
                } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
@@ -1010,9 +1012,9 @@ class WebRequest {
 We can't serve non-HTML content from the URL you have requested, because
 Internet Explorer would interpret it as an incorrect and potentially dangerous
 content type.</p>
-<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the URL you have requested, except that
-"&amp;*" is appended. This prevents Internet Explorer from seeing a bogus file
-extension.
+<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the
+URL you have requested, except that "&amp;*" is appended. This prevents Internet
+Explorer from seeing a bogus file extension.
 </p>
 </body>
 </html>
@@ -1023,14 +1025,16 @@ HTML;
 
        /**
         * Parse the Accept-Language header sent by the client into an array
-        * @return array array( languageCode => q-value ) sorted by q-value in descending order then
-        *                                                appearing time in the header in ascending order.
+        *
+        * @return array array( languageCode => q-value ) sorted by q-value in
+        *   descending order then appearing time in the header in ascending order.
         * May contain the "language" '*', which applies to languages other than those explicitly listed.
         * This is aligned with rfc2616 section 14.4
         * Preference for earlier languages appears in rfc3282 as an extension to HTTP/1.1.
         */
        public function getAcceptLang() {
-               // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
+               // Modified version of code found at
+               // http://www.thefutureoftheweb.com/blog/use-accept-language-header
                $acceptLang = $this->getHeader( 'Accept-Language' );
                if ( !$acceptLang ) {
                        return array();
@@ -1041,8 +1045,11 @@ HTML;
 
                // Break up string into pieces (languages and q factors)
                $lang_parse = null;
-               preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
-                       $acceptLang, $lang_parse );
+               preg_match_all(
+                       '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
+                       $acceptLang,
+                       $lang_parse
+               );
 
                if ( !count( $lang_parse[1] ) ) {
                        return array();
@@ -1084,7 +1091,8 @@ HTML;
                }
 
                if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
-                       throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+                       throw new MWException( __METHOD__
+                               . " : Could not determine the remote IP address due to multiple values." );
                } else {
                        $ipchain = $_SERVER['REMOTE_ADDR'];
                }
@@ -1303,7 +1311,9 @@ class FauxRequest extends WebRequest {
         * @param string $protocol 'http' or 'https'
         * @throws MWException
         */
-       public function __construct( $data = array(), $wasPosted = false, $session = null, $protocol = 'http' ) {
+       public function __construct( $data = array(), $wasPosted = false,
+               $session = null, $protocol = 'http'
+       ) {
                if ( is_array( $data ) ) {
                        $this->data = $data;
                } else {
index 766b3bf..09f01c0 100644 (file)
 # This must be done before any globals are set by the code
 if ( ini_get( 'register_globals' ) ) {
        if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
-               die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>' );
+               die( '<a href="http://www.hardened-php.net/globals-problem">'
+                       . '$GLOBALS overwrite vulnerability</a>' );
        }
+
        $verboten = array(
                'GLOBALS',
                '_SERVER',
@@ -50,6 +52,7 @@ if ( ini_get( 'register_globals' ) ) {
                '_SESSION',
                'HTTP_SESSION_VARS'
        );
+
        foreach ( $_REQUEST as $name => $value ) {
                if ( in_array( $name, $verboten ) ) {
                        header( "HTTP/1.1 500 Internal Server Error" );
index aed1f65..eff251f 100644 (file)
@@ -26,9 +26,8 @@
  * @internal documentation reviewed 15 Mar 2010
  */
 class MediaWiki {
-
        /**
-        * TODO: fold $output, etc, into this
+        * @todo Fold $output, etc, into this
         * @var IContextSource
         */
        private $context;
@@ -117,7 +116,11 @@ class MediaWiki {
                }
 
                // Use the main page as default title if nothing else has been provided
-               if ( $ret === null && strval( $title ) === '' && !$request->getCheck( 'curid' ) && $action !== 'delete' ) {
+               if ( $ret === null
+                       && strval( $title ) === ''
+                       && !$request->getCheck( 'curid' )
+                       && $action !== 'delete'
+               ) {
                        $ret = Title::newMainPage();
                }
 
index 44f0599..34f15c3 100644 (file)
@@ -180,7 +180,8 @@ class WikiFilePage extends WikiPage {
                        $this->mFile->upgradeRow();
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
                } else {
-                       wfDebug( 'ImagePage::doPurge no image for ' . $this->mFile->getName() . "; limiting purge to cache only\n" );
+                       wfDebug( 'ImagePage::doPurge no image for '
+                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
                        // even if the file supposedly doesn't exist, force any cached information
                        // to be updated (in case the cached information is wrong)
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
index d53acd0..9a26c15 100644 (file)
@@ -352,10 +352,11 @@ class WikiPage implements Page, IDBAccessObject {
         * some source.
         *
         * @param object|string|int $from One of the following:
-        *        - A DB query result object
-        *        - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB using SELECT FOR UPDATE
+        *   - A DB query result object.
+        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
+        *     using SELECT FOR UPDATE.
         *
         * @return void
         */
@@ -688,7 +689,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return string|bool The text of the current revision
         * @deprecated since 1.21, getContent() should be used instead.
         */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
                $this->loadLastEdit();
@@ -1291,9 +1292,10 @@ class WikiPage implements Page, IDBAccessObject {
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
         * @return bool true on success, false on failure
-        * @private
         */
-       public function updateRevisionOn( $dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
+       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+               $lastRevIsRedirect = null
+       ) {
                global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
@@ -1477,10 +1479,13 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.21, use replaceSectionContent() instead
         */
-       public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
+       public function replaceSection( $section, $text, $sectionTitle = '',
+               $edittime = null
+       ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               if ( strval( $section ) == '' ) { //NOTE: keep condition in sync with condition in replaceSectionContent!
+               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
                        return $text;
                }
@@ -1504,8 +1509,10 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return bool
         *
-        * @todo The skin should check this and not offer section functionality if sections are not supported.
-        * @todo The EditPage should check this and not offer section functionality if sections are not supported.
+        * @todo The skin should check this and not offer section functionality if
+        *   sections are not supported.
+        * @todo The EditPage should check this and not offer section functionality
+        *   if sections are not supported.
         */
        public function supportsSections() {
                return $this->getContentHandler()->supportsSections();
@@ -1606,10 +1613,11 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
         * @param bool|int $baseRevId The revision ID this edit was based off, if any
@@ -1617,19 +1625,21 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *     set the fatal flag of $status
+        *   edit-gone-missing: In update mode, but the article didn't exist.
+        *   edit-conflict: In update mode, the article changed unexpectedly.
+        *   edit-no-change: Warning that the text was the same as before.
+        *   edit-already-exists: In creation mode, but the article already exists.
         *
-        *  Extensions may define additional errors.
+        * Extensions may define additional errors.
         *
-        *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        * $return->value will contain an associative array with members as follows:
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
-        *  Compatibility note: this function previously returned a boolean value indicating success/failure
+        * Compatibility note: this function previously returned a boolean value
+        * indicating success/failure
         *
         * @deprecated since 1.21: use doEditContent() instead.
         */
@@ -1663,29 +1673,32 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
         * @param bool|int $baseRevId The revision ID this edit was based off, if any
         * @param User $user The user doing the edit
-        * @param string $serialisation_format Format for storing the content in the database
+        * @param string $serialisation_format Format for storing the content in the
+        *   database.
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *       set the fatal flag of $status.
+        *     edit-gone-missing: In update mode, but the article didn't exist.
+        *     edit-conflict: In update mode, the article changed unexpectedly.
+        *     edit-no-change: Warning that the text was the same as before.
+        *     edit-already-exists: In creation mode, but the article already exists.
         *
         *  Extensions may define additional errors.
         *
         *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
         * @since 1.21
         */
@@ -2020,7 +2033,8 @@ class WikiPage implements Page, IDBAccessObject {
                $options = $this->getContentHandler()->makeParserOptions( $context );
 
                if ( $this->getTitle()->isConversionTable() ) {
-                       // @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
+                       // @todo ConversionTable should become a separate content model, so
+                       // we don't need special cases like this one.
                        $options->disableContentConversion();
                }
 
@@ -2087,7 +2101,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                $edit->format = $serialization_format;
                $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) : null;
+               $edit->output = $edit->pstContent
+                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+                       : null;
 
                $edit->newContent = $content;
                $edit->oldContent = $this->getContent( Revision::RAW );
@@ -2298,7 +2314,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @param User $user The user updating the restrictions
         * @return Status
         */
-       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
+       public function doUpdateRestrictions( array $limit, array $expiry,
+               &$cascade, $reason, User $user
+       ) {
                global $wgCascadingRestrictionLevels, $wgContLang;
 
                if ( wfReadOnly() ) {
@@ -2384,7 +2402,9 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Only certain restrictions can cascade...
-                       $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+                       $editrestriction = isset( $limit['edit'] )
+                               ? array( $limit['edit'] )
+                               : $this->mTitle->getRestrictions( 'edit' );
                        foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
                                $editrestriction[$key] = 'editprotected'; // backwards compatibility
                        }
@@ -2407,7 +2427,15 @@ class WikiPage implements Page, IDBAccessObject {
 
                        // insert null revision to identify the page protection change as edit summary
                        $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason, $user );
+                       $nullRevision = $this->insertProtectNullRevision(
+                               $revCommentMsg,
+                               $limit,
+                               $expiry,
+                               $cascade,
+                               $reason,
+                               $user
+                       );
+
                        if ( $nullRevision === null ) {
                                return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
                        }
@@ -2509,7 +2537,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @param User|null $user
         * @return Revision|null Null on error
         */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason, $user = null ) {
+       public function insertProtectNullRevision( $revCommentMsg, array $limit,
+               array $expiry, $cascade, $reason, $user = null
+       ) {
                global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
 
@@ -2526,7 +2556,8 @@ class WikiPage implements Page, IDBAccessObject {
                $protectDescription = $this->protectDescription( $limit, $expiry );
                if ( $protectDescription ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+                               ->inContentLanguage()->text();
                }
                if ( $cascade ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
@@ -2825,8 +2856,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Do some database updates after deletion
         *
         * @param int $id page_id value of the page being deleted
-        * @param Content $content Optional page content to be used when determining the required updates.
-        *   This may be needed because $this->getContent() may already return null when the page proper was deleted.
+        * @param Content $content Optional page content to be used when determining
+        *   the required updates. This may be needed because $this->getContent()
+        *   may already return null when the page proper was deleted.
         */
        public function doDeleteUpdates( $id, Content $content = null ) {
                // update site status
@@ -2963,7 +2995,9 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $s === false ) {
                        // No one else ever edited this page
                        return array( array( 'cantrollback' ) );
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT || $s->rev_deleted & Revision::DELETED_USER ) {
+               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+                       || $s->rev_deleted & Revision::DELETED_USER
+               ) {
                        // Only admins can see this text
                        return array( array( 'notvisiblerev' ) );
                }
@@ -3031,7 +3065,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Actually store the edit
-               $status = $this->doEditContent( $target->getContent(), $summary, $flags, $target->getId(), $guser );
+               $status = $this->doEditContent(
+                       $target->getContent(),
+                       $summary,
+                       $flags,
+                       $target->getId(),
+                       $guser
+               );
 
                if ( !$status->isOK() ) {
                        return $status->getErrorsArray();
@@ -3138,7 +3178,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Purge caches on page update etc
         *
         * @param Title $title
-        * @todo Verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
+        * @todo Verify that $title is always a Title object (and never false or
+        *   null), add Title hint to parameter $title.
         */
        public static function onArticleEdit( $title ) {
                // Invalidate caches of articles which include this page
@@ -3220,7 +3261,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
         */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
+               // NOTE: stub for backwards-compatibility. assumes the given text is
+               // wikitext. will break horribly if it isn't.
 
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
@@ -3370,7 +3412,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( count( $links_diff ) > 0 ) {
                        // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
+                       // Note: we are only interested in links here. We don't need to get
+                       // other DataUpdate items from the parser output.
                        $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
                        $u->doUpdate();
                }
@@ -3457,10 +3500,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Returns a list of updates to be performed when this page is deleted. The updates should remove any information
-        * about this page from secondary data stores such as links tables.
+        * Returns a list of updates to be performed when this page is deleted. The
+        * updates should remove any information about this page from secondary data
+        * stores such as links tables.
         *
-        * @param Content|null $content Optional Content object for determining the necessary updates
+        * @param Content|null $content Optional Content object for determining the
+        *   necessary updates.
         * @return array An array of DataUpdates objects
         */
        public function getDeletionUpdates( Content $content = null ) {
@@ -3483,57 +3528,42 @@ class WikiPage implements Page, IDBAccessObject {
 }
 
 class PoolWorkArticleView extends PoolCounterWork {
-
-       /**
-        * @var Page
-        */
+       /** @var Page */
        private $page;
 
-       /**
-        * @var string
-        */
+       /** @var string */
        private $cacheKey;
 
-       /**
-        * @var int
-        */
+       /** @var int */
        private $revid;
 
-       /**
-        * @var ParserOptions
-        */
+       /** @var ParserOptions */
        private $parserOptions;
 
-       /**
-        * @var Content|null
-        */
+       /** @var Content|null */
        private $content = null;
 
-       /**
-        * @var ParserOutput|bool
-        */
+       /** @var ParserOutput|bool */
        private $parserOutput = false;
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        private $isDirty = false;
 
-       /**
-        * @var Status|bool
-        */
+       /** @var Status|bool */
        private $error = false;
 
        /**
-        * Constructor
-        *
         * @param Page $page
-        * @param int $revid ID of the revision being parsed
-        * @param bool $useParserCache Whether to use the parser cache
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
-        * @param Content|string $content Content to parse or null to load it; may also be given as a wikitext string, for BC
-        */
-       public function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+        * @param int $revid ID of the revision being parsed.
+        * @param bool $useParserCache Whether to use the parser cache.
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse
+        *   operation.
+        * @param Content|string $content Content to parse or null to load it; may
+        *   also be given as a wikitext string, for BC.
+        */
+       public function __construct( Page $page, ParserOptions $parserOptions,
+               $revid, $useParserCache, $content = null
+       ) {
                if ( is_string( $content ) ) { // BC: old style call
                        $modelId = $page->getRevision()->getContentModel();
                        $format = $page->getRevision()->getContentFormat();
@@ -3611,7 +3641,11 @@ class PoolWorkArticleView extends PoolCounterWork {
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
-               $this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
+               $this->parserOutput = $content->getParserOutput(
+                       $this->page->getTitle(),
+                       $this->revid,
+                       $this->parserOptions
+               );
                $time += microtime( true );
 
                // Timing hack
index 6510eae..6fb5380 100644 (file)
@@ -36,7 +36,9 @@ class Xml {
         * @param bool $allowShortTag Whether '' in $contents will result in a contentless closed tag
         * @return string
         */
-       public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
+       public static function element( $element, $attribs = null, $contents = '',
+               $allowShortTag = true
+       ) {
                $out = '<' . $element;
                if ( !is_null( $attribs ) ) {
                        $out .= self::expandAttributes( $attribs );
@@ -142,7 +144,9 @@ class Xml {
         * @return string
         * @deprecated since 1.19
         */
-       public static function namespaceSelector( $selected = '', $all = null, $element_name = 'namespace', $label = null ) {
+       public static function namespaceSelector( $selected = '', $all = null,
+               $element_name = 'namespace', $label = null
+       ) {
                wfDeprecated( __METHOD__, '1.19' );
                return Html::namespaceSelector( array(
                        'selected' => $selected,
@@ -158,8 +162,9 @@ class Xml {
        /**
         * Create a date selector
         *
-        * @param string $selected The month which should be selected, default ''
-        * @param string $allmonths Value of a special item denoting all month. Null to not include (default)
+        * @param string $selected The month which should be selected, default ''.
+        * @param string $allmonths Value of a special item denoting all month.
+        *   Null to not include (default).
         * @param string $id Element identifier
         * @return string Html string containing the month selector
         */
@@ -170,12 +175,20 @@ class Xml {
                        $selected = '';
                }
                if ( !is_null( $allmonths ) ) {
-                       $options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
+                       $options[] = self::option(
+                               wfMessage( 'monthsall' )->text(),
+                               $allmonths,
+                               $selected === $allmonths
+                       );
                }
                for ( $i = 1; $i < 13; $i++ ) {
                        $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
                }
-               return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
+               return self::openElement( 'select', array(
+                       'id' => $id,
+                       'name' => 'month',
+                       'class' => 'mw-month-selector'
+               ) )
                        . implode( "\n", $options )
                        . self::closeElement( 'select' );
        }
@@ -222,7 +235,9 @@ class Xml {
         * @param Message|null $msg Label message key (since 1.20)
         * @return array containing 2 items: label HTML and select list HTML
         */
-       public static function languageSelector( $selected, $customisedOnly = true, $inLanguage = null, $overrideAttrs = array(), Message $msg = null ) {
+       public static function languageSelector( $selected, $customisedOnly = true,
+               $inLanguage = null, $overrideAttrs = array(), Message $msg = null
+       ) {
                global $wgLanguageCode;
 
                $include = $customisedOnly ? 'mwfile' : 'mw';
@@ -313,8 +328,11 @@ class Xml {
         * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function password( $name, $size = false, $value = false, $attribs = array() ) {
-               return self::input( $name, $size, $value, array_merge( $attribs, array( 'type' => 'password' ) ) );
+       public static function password( $name, $size = false, $value = false,
+               $attribs = array()
+       ) {
+               return self::input( $name, $size, $value,
+                       array_merge( $attribs, array( 'type' => 'password' ) ) );
        }
 
        /**
@@ -395,7 +413,9 @@ class Xml {
         * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function inputLabel( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabel( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
                return $label . '&#160;' . $input;
        }
@@ -412,7 +432,9 @@ class Xml {
         *
         * @return array
         */
-       public static function inputLabelSep( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabelSep( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                return array(
                        Xml::label( $label, $id, $attribs ),
                        self::input( $name, $size, $value, array( 'id' => $id ) + $attribs )
@@ -448,7 +470,9 @@ class Xml {
         *
         * @return string HTML
         */
-       public static function radioLabel( $label, $name, $value, $id, $checked = false, $attribs = array() ) {
+       public static function radioLabel( $label, $name, $value, $id,
+               $checked = false, $attribs = array()
+       ) {
                return self::radio( $name, $value, $checked, array( 'id' => $id ) + $attribs ) .
                        '&#160;' .
                        self::label( $label, $id, $attribs );
@@ -487,14 +511,17 @@ class Xml {
         * Build a drop-down box from a textual list.
         *
         * @param string $name Name and id for the drop-down
-        * @param string $list Correctly formatted text (newline delimited) to be used to generate the options
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
         * @param string $other Text for the "Other reasons" option
         * @param string $selected Option which should be pre-selected
         * @param string $class CSS classes for the drop-down
         * @param int $tabindex Value of the tabindex attribute
         * @return string
         */
-       public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+       public static function listDropDown( $name = '', $list = '', $other = '',
+               $selected = '', $class = '', $tabindex = null
+       ) {
                $optgroup = false;
 
                $options = self::option( $other, 'other', $selected === 'other' );
@@ -554,8 +581,10 @@ class Xml {
        /**
         * Shortcut for creating fieldsets.
         *
-        * @param string|bool $legend Legend of the fieldset. If evaluates to false, legend is not added.
-        * @param string $content Pre-escaped content for the fieldset. If false, only open fieldset is returned.
+        * @param string|bool $legend Legend of the fieldset. If evaluates to false,
+        *   legend is not added.
+        * @param string $content Pre-escaped content for the fieldset. If false,
+        *   only open fieldset is returned.
         * @param array $attribs Any attributes to fieldset-element.
         *
         * @return string
@@ -740,8 +769,11 @@ class Xml {
        /**
         * Generate a form (without the opening form element).
         * Output optionally includes a submit button.
-        * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
-        * @param string $submitLabel The name of a message containing a label for the submit button.
+        * @param array $fields Associative array, key is the name of a message that
+        *   contains a description for the field, value is an HTML string
+        *   containing the appropriate input.
+        * @param string $submitLabel The name of a message containing a label for
+        *   the submit button.
         * @param array $submitAttribs The attributes to add to the submit button
         * @return string HTML form.
         */
@@ -758,14 +790,17 @@ class Xml {
                        // the input somehow.
 
                        $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) )
+                               . $input . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
                if ( $submitLabel ) {
                        $form .= Xml::openElement( 'tr' );
                        $form .= Xml::tags( 'td', array(), '' );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) )
+                               . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs )
+                               . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
index e451f2a..a1e02ef 100644 (file)
@@ -720,9 +720,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if none or more than one of a certain set of parameters is set and not false.
-        * @param array $params Array of parameter names
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which exactly one must be set
         */
-       public function requireOnlyOneParameter( $params ) {
+       public function requireOnlyOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -766,10 +767,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if more than one of a certain set of parameters is set and not false.
-        *
-        * @param array $params
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at most one must be set
         */
-       public function requireMaxOneParameter( $params ) {
+       public function requireMaxOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -807,10 +808,10 @@ abstract class ApiBase extends ContextSource {
         * Die if none of a certain set of parameters is set and not false.
         *
         * @since 1.23
-        * @param array $params User provided set of parameters
-        * @param string ... List of parameter names to check
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at least one must be set
         */
-       public function requireAtLeastOneParameter( $params ) {
+       public function requireAtLeastOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
index 6f7121b..afd5a13 100644 (file)
@@ -112,7 +112,7 @@ class ApiFeedContributions extends ApiBase {
                        return new FeedItem(
                                $title->getPrefixedText(),
                                $this->feedItemDesc( $revision ),
-                               $title->getFullURL(),
+                               $title->getFullURL( array( 'diff' => $revision->getId() ) ),
                                $date,
                                $this->feedItemAuthor( $revision ),
                                $comments
index 545b94d..64c3eec 100644 (file)
@@ -34,7 +34,6 @@
 class ApiFeedWatchlist extends ApiBase {
 
        private $watchlistModule = null;
-       private $linkToDiffs = false;
        private $linkToSections = false;
 
        /**
@@ -73,7 +72,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'meta' => 'siteinfo',
                                'siprop' => 'general',
                                'list' => 'watchlist',
-                               'wlprop' => 'title|user|comment|timestamp',
+                               'wlprop' => 'title|user|comment|timestamp|ids',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
                                'wllimit' => min( 50, $wgFeedLimit )
@@ -95,12 +94,6 @@ class ApiFeedWatchlist extends ApiBase {
                                $fauxReqArr['wltype'] = $params['wltype'];
                        }
 
-                       // Support linking to diffs instead of article
-                       if ( $params['linktodiffs'] ) {
-                               $this->linkToDiffs = true;
-                               $fauxReqArr['wlprop'] .= '|ids';
-                       }
-
                        // Support linking directly to sections when possible
                        // (possible only if section name is present in comment)
                        if ( $params['linktosections'] ) {
@@ -173,7 +166,7 @@ class ApiFeedWatchlist extends ApiBase {
        private function createFeedItem( $info ) {
                $titleStr = $info['title'];
                $title = Title::newFromText( $titleStr );
-               if ( $this->linkToDiffs && isset( $info['revid'] ) ) {
+               if ( isset( $info['revid'] ) ) {
                        $titleUrl = $title->getFullURL( array( 'diff' => $info['revid'] ) );
                } else {
                        $titleUrl = $title->getFullURL();
@@ -225,7 +218,6 @@ class ApiFeedWatchlist extends ApiBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 72,
                        ),
-                       'linktodiffs' => false,
                        'linktosections' => false,
                );
                if ( $flags ) {
@@ -254,7 +246,6 @@ class ApiFeedWatchlist extends ApiBase {
                return array(
                        'feedformat' => 'The format of the feed',
                        'hours' => 'List pages modified within this many hours from now',
-                       'linktodiffs' => 'Link to change differences instead of article pages',
                        'linktosections' => 'Link directly to changed sections if possible',
                        'allrev' => $wldescr['allrev'],
                        'wlowner' => $wldescr['owner'],
@@ -279,7 +270,7 @@ class ApiFeedWatchlist extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=feedwatchlist',
-                       'api.php?action=feedwatchlist&allrev=&linktodiffs=&hours=6'
+                       'api.php?action=feedwatchlist&allrev=&hours=6'
                );
        }
 
index b0e9bd2..2124dc3 100644 (file)
@@ -180,6 +180,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
                if ( $git ) {
                        $data['git-hash'] = $git;
+                       $data['git-branch'] =
+                               SpecialVersion::getGitCurrentBranch( $GLOBALS['IP'] );
                } else {
                        $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
                        if ( $svn ) {
@@ -239,6 +241,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['script'] = $GLOBALS['wgScript'];
                $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
                $data['server'] = $GLOBALS['wgServer'];
+               $data['servername'] = $GLOBALS['wgServerName'];
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
index 70a2fec..fbe87d2 100644 (file)
@@ -43,12 +43,12 @@ class ApiRollback extends ApiBase {
                $params = $this->extractRequestParams();
 
                // User and title already validated in call to getTokenSalt from Main
-               $titleObj = $this->getRbTitle();
+               $titleObj = $this->getRbTitle( $params );
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
                $details = array();
                $retval = $pageObj->doRollback(
-                       $this->getRbUser(),
+                       $this->getRbUser( $params ),
                        $summary,
                        $params['token'],
                        $params['markbot'],
@@ -85,9 +85,9 @@ class ApiRollback extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'title' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                       'title' => null,
+                       'pageid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'user' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -112,8 +112,11 @@ class ApiRollback extends ApiBase {
        }
 
        public function getParamDescription() {
+               $p = $this->getModulePrefix();
+
                return array(
-                       'title' => 'Title of the page you want to rollback.',
+                       'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
+                       'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
                        'user' => 'Name of the user whose edits are to be rolled back. If ' .
                                'set incorrectly, you\'ll get a badtoken error.',
                        'token' => 'A rollback token previously retrieved through ' .
@@ -149,6 +152,7 @@ class ApiRollback extends ApiBase {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'invalidtitle', 'title' ),
                        array( 'notanarticle' ),
+                       array( 'nosuchpageid', 'pageid' ),
                        array( 'invaliduser', 'user' ),
                ) );
        }
@@ -158,16 +162,24 @@ class ApiRollback extends ApiBase {
        }
 
        public function getTokenSalt() {
-               return array( $this->getRbTitle()->getPrefixedText(), $this->getRbUser() );
+               $params = $this->extractRequestParams();
+
+               return array(
+                       $this->getRbTitle( $params )->getPrefixedText(),
+                       $this->getRbUser( $params )
+               );
        }
 
-       private function getRbUser() {
+       /**
+        * @param array $params
+        *
+        * @return string
+        */
+       private function getRbUser( array $params ) {
                if ( $this->mUser !== null ) {
                        return $this->mUser;
                }
 
-               $params = $this->extractRequestParams();
-
                // We need to be able to revert IPs, but getCanonicalName rejects them
                $this->mUser = User::isIP( $params['user'] )
                        ? $params['user']
@@ -180,20 +192,29 @@ class ApiRollback extends ApiBase {
        }
 
        /**
+        * @param array $params
+        *
         * @return Title
         */
-       private function getRbTitle() {
+       private function getRbTitle( array $params ) {
                if ( $this->mTitleObj !== null ) {
                        return $this->mTitleObj;
                }
 
-               $params = $this->extractRequestParams();
-
-               $this->mTitleObj = Title::newFromText( $params['title'] );
-
-               if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               if ( isset( $params['title'] ) ) {
+                       $this->mTitleObj = Title::newFromText( $params['title'] );
+                       if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                       }
+               } elseif ( isset( $params['pageid'] ) ) {
+                       $this->mTitleObj = Title::newFromID( $params['pageid'] );
+                       if ( !$this->mTitleObj ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+                       }
                }
+
                if ( !$this->mTitleObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
@@ -204,6 +225,7 @@ class ApiRollback extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
+                       'api.php?action=rollback&pageid=122&user=Catrope&token=123ABC',
                        'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&' .
                                'token=123ABC&summary=Reverting%20vandalism&markbot=1'
                );
index 95b15b8..e80dfb3 100644 (file)
@@ -87,7 +87,7 @@ class LinkCache {
 
        /**
         * @param string $title
-        * @return array|int
+        * @return int
         */
        public function getGoodLinkID( $title ) {
                if ( array_key_exists( $title, $this->mGoodLinks ) ) {
index bbf4ab6..f7beb0c 100644 (file)
@@ -279,7 +279,7 @@ class RecentChange {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
+                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
                                # @todo FIXME: This would be better as an extension hook
                                $enotif = new EmailNotification();
                                $enotif->notifyOnPageChange( $editor, $title,
index 77d3542..8ba43f6 100644 (file)
@@ -450,4 +450,69 @@ abstract class AbstractContent implements Content {
 
                return $result;
        }
+
+       /**
+        * Returns a ParserOutput object containing information derived from this content.
+        * Most importantly, unless $generateHtml was false, the return value contains an
+        * HTML representation of the content.
+        *
+        * Subclasses that want to control the parser output may override this, but it is
+        * preferred to override fillParserOutput() instead.
+        *
+        * Subclasses that override getParserOutput() itself should take care to call the
+        * ContentGetParserOutput hook.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        *
+        * @return ParserOutput Containing information derived from this content.
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               if ( $options === null ) {
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               $po = new ParserOutput();
+
+               if ( wfRunHooks( 'ContentGetParserOutput',
+                       array( $this, $title, $revId, $options, $generateHtml, &$po ) ) ) {
+
+                       $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
+               }
+
+               return $po;
+       }
+
+       /**
+        * Fills the provided ParserOutput with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content.
+        *
+        * This is called by getParserOutput() after consulting the ContentGetParserOutput hook.
+        * Subclasses are expected to override this method (or getParserOutput(), if need be).
+        * Subclasses of TextContent should generally override getHtml() instead.
+        *
+        * This placeholder implementation always throws an exception.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        *
+        * @throws MWException
+        */
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
+               // Don't make abstract, so subclasses that override getParserOutput() directly don't fail.
+               throw new MWException( 'Subclasses of AbstractContent must override fillParserOutput!' );
+       }
 }
index defa7da..dd7e27d 100644 (file)
@@ -454,7 +454,7 @@ abstract class ContentHandler {
 
        /**
         * Creates a new Content object that acts as a redirect to the given page,
-        * or null of redirects are not supported by this content model.
+        * or null if redirects are not supported by this content model.
         *
         * This default implementation always returns null. Subclasses supporting redirects
         * must override this method.
index 5fc2c9f..2673084 100644 (file)
@@ -67,7 +67,7 @@ class CssContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 11a470e..442b705 100644 (file)
@@ -66,7 +66,7 @@ class JavaScriptContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 0c6b06f..b772f17 100644 (file)
@@ -201,30 +201,30 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Returns a generic ParserOutput object, wrapping the HTML returned by
-        * getHtml().
+        * Fills the provided ParserOutput object with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content
+        * provided by getHtml().
+        *
+        * For content models listed in $wgTextModelsToParse, this method will call the MediaWiki
+        * wikitext parser on the text to extract any (wikitext) links, magic words, etc.
+        *
+        * Subclasses may override this to provide custom content processing.
+        * For custom HTML generation alone, it is sufficient to override getHtml().
         *
         * @param Title $title Context title for parsing
         * @param int $revId Revision ID (for {{REVISIONID}})
         * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
-        *
-        * @return ParserOutput Representing the HTML form of the text.
+        * @param ParserOutput $output The output object to fill (reference).
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser, $wgTextModelsToParse;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
-                       // parse just to get links etc into the database
-                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
-               } else {
-                       $po = new ParserOutput();
+                       // parse just to get links etc into the database, HTML is replaced below.
+                       $output = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
                }
 
                if ( $generateHtml ) {
@@ -233,19 +233,19 @@ class TextContent extends AbstractContent {
                        $html = '';
                }
 
-               $po->setText( $html );
-
-               return $po;
+               $output->setText( $html );
        }
 
        /**
         * Generates an HTML version of the content, for display. Used by
-        * getParserOutput() to construct a ParserOutput object.
+        * fillParserOutput() to provide HTML for the ParserOutput object.
+        *
+        * Subclasses may override this to provide a custom HTML rendering.
+        * If further information is to be derived from the content (such as
+        * categories), the fillParserOutput() method can be overridden instead.
         *
-        * This default implementation just calls getHighlightHtml(). Content
-        * models that have another mapping to HTML (as is the case for markup
-        * languages like wikitext) should override this method to generate the
-        * appropriate HTML.
+        * For backwards-compatibility, this default implementation just calls
+        * getHighlightHtml().
         *
         * @return string An HTML representation of the content
         */
@@ -254,13 +254,22 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Generates a syntax-highlighted version of the content, as HTML.
-        * Used by the default implementation of getHtml().
+        * Generates an HTML version of the content, for display.
+        *
+        * This default implementation returns an HTML-escaped version
+        * of the raw text content.
         *
-        * @return string A HTML representation of the content's markup
+        * @note: The functionality of this method should really be implemented
+        * in getHtml(), and subclasses should override getHtml() if needed.
+        * getHighlightHtml() is kept around for backward compatibility with
+        * extensions that already override it.
+        *
+        * @deprecated since 1.24. Use getHtml() instead. In particular, subclasses overriding
+        *     getHighlightHtml() should override getHtml() instead.
+        *
+        * @return string An HTML representation of the content
         */
        protected function getHighlightHtml() {
-               # TODO: make Highlighter interface, use highlighter here, if available
                return htmlspecialchars( $this->getNativeData() );
        }
 
index dba0205..ccea916 100644 (file)
@@ -311,41 +311,33 @@ class WikitextContent extends TextContent {
         * Returns a ParserOutput object resulting from parsing the content's text
         * using $wgParser.
         *
-        * @since 1.21
-        *
         * @param Title $title
         * @param int $revId Revision to pass to the parser (default: null)
         * @param ParserOptions $options (default: null)
         * @param bool $generateHtml (default: true)
-        *
-        * @return ParserOutput Representing the HTML form of the text
+        * @param &$output ParserOutput representing the HTML form of the text,
+        *           may be manipulated or replaced.
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                list( $redir, $text ) = $this->getRedirectTargetAndText();
-               $po = $wgParser->parse( $text, $title, $options, true, true, $revId );
+               $output = $wgParser->parse( $text, $title, $options, true, true, $revId );
 
                // Add redirect indicator at the top
                if ( $redir ) {
                        // Make sure to include the redirect link in pagelinks
-                       $po->addLink( $redir );
+                       $output->addLink( $redir );
                        if ( $generateHtml ) {
                                $chain = $this->getRedirectChain();
-                               $po->setText(
+                               $output->setText(
                                        Article::getRedirectHeaderHtml( $title->getPageLanguage(), $chain, false ) .
-                                       $po->getText()
+                                       $output->getText()
                                );
                        }
                }
-
-               return $po;
        }
 
        /**
index a9af1e8..5895dda 100644 (file)
@@ -1652,11 +1652,12 @@ abstract class File {
         *
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
+        * @param User|null $user
         * @return bool Boolean on success, false on some kind of failure
         * STUB
         * Overridden by LocalFile
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
index c5ff4a7..561ead7 100644 (file)
@@ -94,10 +94,11 @@ class ForeignDBFile extends LocalFile {
        /**
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @return FileRepoStatus
         * @throws MWException
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
index b3d5d5d..73ab04d 100644 (file)
@@ -1599,14 +1599,15 @@ class LocalFile extends File {
         *
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @return FileRepoStatus
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
-               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
+               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress, $user );
 
                $this->lock(); // begin
                $batch->addCurrent();
@@ -1656,16 +1657,17 @@ class LocalFile extends File {
         * @param string $archiveName
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @throws MWException Exception on database or file store failure
         * @return FileRepoStatus
         */
-       function deleteOld( $archiveName, $reason, $suppress = false ) {
+       function deleteOld( $archiveName, $reason, $suppress = false, $user = null ) {
                global $wgUseSquid;
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
-               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
+               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress, $user );
 
                $this->lock(); // begin
                $batch->addOld( $archiveName );
@@ -1964,15 +1966,25 @@ class LocalFileDeleteBatch {
        /** @var FileRepoStatus */
        private $status;
 
+       /** @var User */
+       private $user;
+
        /**
         * @param File $file
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         */
-       function __construct( File $file, $reason = '', $suppress = false ) {
+       function __construct( File $file, $reason = '', $suppress = false, $user = null ) {
                $this->file = $file;
                $this->reason = $reason;
                $this->suppress = $suppress;
+               if ( $user ) {
+                       $this->user = $user;
+               } else {
+                       global $wgUser;
+                       $this->user = $wgUser;
+               }
                $this->status = $file->repo->newGood();
        }
 
@@ -2086,11 +2098,9 @@ class LocalFileDeleteBatch {
        }
 
        function doDBInserts() {
-               global $wgUser;
-
                $dbw = $this->file->repo->getMasterDB();
                $encTimestamp = $dbw->addQuotes( $dbw->timestamp() );
-               $encUserId = $dbw->addQuotes( $wgUser->getId() );
+               $encUserId = $dbw->addQuotes( $this->user->getId() );
                $encReason = $dbw->addQuotes( $this->reason );
                $encGroup = $dbw->addQuotes( 'deleted' );
                $ext = $this->file->getExtension();
@@ -2116,7 +2126,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'image',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => $dbw->conditional( array( 'img_sha1' => '' ), $dbw->addQuotes( '' ), $concat ),
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'img_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
@@ -2148,7 +2162,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'oldimage',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => $dbw->conditional( array( 'oi_sha1' => '' ), $dbw->addQuotes( '' ), $concat ),
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'oi_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
index 42e8c03..39da597 100644 (file)
  * @ingroup Media
  */
 abstract class ImageGalleryBase extends ContextSource {
-       /** @var array Gallery images */
-       protected $mImages;
+       /**
+        * @var array Gallery images
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mImages;
 
-       /** @var bool Whether to show the filesize in bytes in categories */
-       protected $mShowBytes;
+       /**
+        * @var bool Whether to show the filesize in bytes in categories
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mShowBytes;
 
-       /** @var bool Whether to show the filename. Default: true */
-       protected $mShowFilename;
+       /**
+        * @var bool Whether to show the filename. Default: true
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mShowFilename;
 
-       /** @var string Gallery mode. Default: traditional */
-       protected $mMode;
+       /**
+        * @var string Gallery mode. Default: traditional
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mMode;
 
-       /** @var bool|string Gallery caption. Default: false */
-       protected $mCaption = false;
+       /**
+        * @var bool|string Gallery caption. Default: false
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mCaption = false;
 
        /**
         * @var bool Hide blacklisted images?
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
         */
-       protected $mHideBadImages;
+       public $mHideBadImages;
 
        /**
         * @var Parser Registered parser object for output callbacks
         */
-       protected $mParser;
+       public $mParser;
 
        /**
         * @var Title Contextual title, used when images are being screened against
index 003ccfe..6ea95ed 100644 (file)
@@ -5,7 +5,7 @@ class HTMLHiddenField extends HTMLFormField {
                parent::__construct( $params );
 
                # Per HTML5 spec, hidden fields cannot be 'required'
-               # http://dev.w3.org/html5/spec/states-of-the-type-attribute.html#hidden-state
+               # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
                unset( $this->mParams['required'] );
        }
 
index 372091a..85717c5 100644 (file)
@@ -200,7 +200,7 @@ abstract class Installer {
                '_NamespaceType' => 'site-name',
                '_AdminName' => '', // will be set later, when the user selects language
                '_AdminPassword' => '',
-               '_AdminPassword2' => '',
+               '_AdminPasswordConfirm' => '',
                '_AdminEmail' => '',
                '_Subscribe' => false,
                '_SkipOptional' => 'continue',
index 68a5519..0ef41fa 100644 (file)
@@ -97,6 +97,8 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
                        array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+                       array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
 
                        //1.24
 
index e7aab8a..8c81080 100644 (file)
@@ -406,7 +406,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'recentchanges', 'rc_source', "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'page', 'page_links_updated', "TIMESTAMPTZ NULL" ),
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
-                       array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea', "replace(lc_value,'\','\\\\')::bytea" ),
+                       array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
+                               "replace(lc_value,'\','\\\\')::bytea" ),
 
                        // 1.24
                        array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
index 3b3473b..4de7f06 100644 (file)
@@ -790,7 +790,7 @@ class WebInstaller_Name extends WebInstallerPage {
                                'label' => 'config-admin-password',
                        ) ) .
                        $this->parent->getPasswordBox( array(
-                               'var' => '_AdminPassword2',
+                               'var' => '_AdminPasswordConfirm',
                                'label' => 'config-admin-password-confirm'
                        ) ) .
                        $this->parent->getTextBox( array(
@@ -829,7 +829,7 @@ class WebInstaller_Name extends WebInstallerPage {
        public function submit() {
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
-                       '_AdminName', '_AdminPassword', '_AdminPassword2', '_AdminEmail',
+                       '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
                        '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ) );
 
                // Validate site name
@@ -911,7 +911,7 @@ class WebInstaller_Name extends WebInstallerPage {
                        # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
                        # This message is more specific and helpful.
                        $msg = 'config-admin-password-blank';
-               } elseif ( $pwd !== $this->getVar( '_AdminPassword2' ) ) {
+               } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
                } elseif ( $valid !== true ) {
                        $msg = $valid;
@@ -919,7 +919,7 @@ class WebInstaller_Name extends WebInstallerPage {
                if ( $msg !== false ) {
                        call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
                        $this->setVar( '_AdminPassword', '' );
-                       $this->setVar( '_AdminPassword2', '' );
+                       $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
                }
 
index b61f3d2..1710f0b 100644 (file)
@@ -5,7 +5,8 @@
                        "Mido",
                        "OsamaK",
                        "روخو",
-                       "Claw eg"
+                       "Claw eg",
+                       "Kuwaity26"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
@@ -46,6 +47,8 @@
        "config-restart": "نعم، إعادة التشغيل",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-env-php-toolow": "بي إتش بي $1 مثبت.\nومع ذلك، يتطلب ميدياويكي بي إتش بي $2 أو أعلى.",
+       "config-db-type": "نوع قاعدة البيانات:",
+       "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
+       "config-site-name": "اسم الويكي:",
+       "config-admin-password": "كلمة السر:",
        "config-admin-email": "عنوان البريد الإلكتروني:",
+       "config-profile-wiki": "افتح ويكي",
+       "config-profile-private": "ويكي خاص",
+       "config-license-pd": "ملكية عامة",
+       "config-email-settings": "إعدادات البريد الإلكتروني",
+       "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-upload-enable": "تمكين تحميل الملفات",
+       "config-cc-again": "اختر مجددًا",
+       "config-extensions": "امتدادات",
+       "config-install-step-done": "نفذ",
+       "config-install-step-failed": "فشل",
+       "config-help": "مساعدة",
        "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
        "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
index 86013ff..8d678e0 100644 (file)
@@ -16,7 +16,7 @@
        "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "El <code>LocalSettings.php</code> que hi ha sembla incomplet.\nLa variable $1 no està definida.\nCanvieu <code>LocalSettings.php</code> perquè la variable estigui definida i feu clic a «{{int:Config-continue}}».",
-       "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
+       "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
        "config-session-error": "Error en iniciar la sessió: $1",
        "config-your-language": "La vostra llengua:",
        "config-your-language-help": "Seleccioneu la llengua que s'utilitzarà durant el procés d'instal·lació.",
@@ -46,6 +46,8 @@
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
        "config-env-php-toolow": "El PHP $1 està instal·lat.\nMalauradament, el MediaWiki necessita el PHP $2 o superior.",
+       "config-memory-raised": "El <code>memory_limit</code> del PHP és $1 i s'ha aixecat a $2.",
+       "config-memory-bad": "<strong>Avís:</strong> El <code>memory_limit</code> del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!",
        "config-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
        "config-install-user": "S'està creant l'usuari de la base de dades",
        "config-install-user-alreadyexists": "L'usuari «$1» ja existeix",
        "config-install-user-create-failed": "La creació de l'usuari «$1» ha fallat: $2",
+       "config-install-user-grant-failed": "Ha fallat la concessió de permisos a l'usuari «$1»: $2",
        "config-install-user-missing": "L'usuari «$1» especificat no existeix.",
        "config-install-user-missing-create": "L'usuari «$1» especificat no existeix.\nFeu clic a la casella «Crea un compte» a continuació si voleu crear-lo.",
        "config-install-tables": "S'estan creant les taules",
        "config-install-keys": "S'estan generant les claus secretes",
        "config-install-sysop": "S'està creant un compte d'usuari d'administrador",
        "config-install-subscribe-fail": "No s'ha pogut subscriure a mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "El cURL no està instal·lat i <code>allow_url_fopen</code> no està disponible.",
        "config-install-mainpage": "S'està creant la pàgina principal amb el contingut per defecte",
        "config-install-extension-tables": "S'estan creant taules de les extensions habilitades",
        "config-install-mainpage-failed": "No s'ha pogut inserir la pàgina principal: $1",
index 26b45fa..ee0773b 100644 (file)
@@ -83,7 +83,7 @@
        "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi parameter GET <code>length</code> sebesar $1 bita. Komponen ResourceLoader MediaWiki akan berjalan dalam batasan ini, tetapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam <code>LocalSettings.php</code>.",
        "config-db-type": "Jenis basis data:",
        "config-db-host": "Inang basis data:",
-       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.",
+       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.\n\nJika Anda menggunakan PostgreSQL, biarkan field ini kosong untuk menghubungkan lewat soket Unix.",
        "config-db-host-oracle": "TNS basis data:",
        "config-db-host-oracle-help": "Masukkan [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] yang sah; berkas tnsnames.ora harus dapat diakses oleh instalasi ini.<br />Jika Anda menggunakan pustaka klien 10g atau lebih baru, Anda juga dapat menggunakan metode penamaan [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifikasi wiki ini",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
-       "config-dbsupport-mysql": "* $1 adalah target utama MediaWiki dan memiliki dukungan terbaik ([http://www.php.net/manual/en/mysql.installation.php cara mengompilasi PHP dengan dukungan MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
        "config-dbsupport-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
        "config-dbsupport-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
        "config-dbsupport-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "Dalam '''modus biner''', MediaWiki menyimpan teks UTF-8 untuk basis data dalam bidang biner.\nIni lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.\n\nDalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Jenis otentikasi:",
+       "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-web-auth": "Pilih jenis otentikasi yang akan digunakan oleh server web untuk menyambung ke server basis data, selama operasi biasa dari wiki.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-windowsauth": "Otentikasi Windows",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.",
        "config-site-name-blank": "Masukkan nama situs.",
        "config-install-step-failed": "gagal",
        "config-install-extensions": "Termasuk ekstensi",
        "config-install-database": "Menyiapkan basis data",
+       "config-install-schema": "Membuat skema",
        "config-install-pg-schema-not-exist": "Skema PostgreSQL tidak tersedia.",
        "config-install-pg-schema-failed": "Pembuatan tabel gagal.\nPastikan bahwa pengguna \"$1\" dapat menulis ke skema \"$2\".",
        "config-install-pg-commit": "Melakukan perubahan",
index 4f45d97..261f750 100644 (file)
        "config-mysql-charset-help": "Beim Schpeishere em <strong>binäre Fomaat</strong> deiht MediaWiki Täxt, dä em UTF-8 Fommaat kütt, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeishere em <strong>UTF-8 Fomaat<strong> deiht et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Schprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wääde.",
        "config-mssql-auth": "De Zoot Aanmäldong:",
        "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
-       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
+       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed dat jenumme, wohmet dä Wäbßööver aam loufe es.",
        "config-mssql-sqlauth": "De Aanmäldong bemm <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
        "config-mssql-windowsauth": "De Annmäldong bemm <i lang=\"en\" xml:lang=\"en\">Windows</i>",
        "config-site-name": "Däm Wiki singe Name:",
index 6891c7f..cde1dc4 100644 (file)
@@ -15,9 +15,9 @@
        "config-upgrade-key-missing": "Востановена е постоечка воспоставка на МедијаВики.\nЗа да ја надградите, вметнете го следниов ред на дното од вашата страница <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Постоечката страница <code>LocalSettings.php</code> е нецелосна.\nНе е поставена променливата $1.\nИзменете ја страницата <code>LocalSettings.php</code> така што ќе ѝ зададете вредност на променливата, па стиснете на „{{int:Config-continue}}“.",
        "config-localsettings-connection-error": "Се појави грешка при поврзувањето со базата користејќи ги поставките назначени во <code>LocalSettings.php</code>. Исправете ги овие поставки и обидете се повторно.\n\n$1",
-       "config-session-error": "Грешка при започнување на сесијата: $1",
-       "config-session-expired": "Вашите сесиски податоци истекоа.\nПоставките на сесиите траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
-       "config-no-session": "Ð\92аÑ\88иÑ\82е Ñ\81еÑ\81иÑ\81ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
+       "config-session-error": "Грешка при започнување на седницата: $1",
+       "config-session-expired": "Вашите податоци од седницата истекоа.\nПоставките на седниците траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
+       "config-no-session": "Ð\9fодаÑ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
        "config-your-language": "Вашиот јазик:",
        "config-your-language-help": "Одберете на кој јазик да се одвива воспоставката.",
        "config-wiki-language": "Јазик на викито:",
index da06b01..33817c2 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Anakmalaysia",
                        "Pizza1016",
-                       "SNN95"
+                       "SNN95",
+                       "MaxSem"
                ]
        },
        "config-desc": "Pemasang MediaWiki",
@@ -43,7 +44,7 @@
        "config-help-restart": "Adakah anda ingin untuk membersihkan semua data yang disimpan yang anda telah masukkan dan memulakan semula proses pemasangan?",
        "config-restart": "Ya, mula semula",
        "config-welcome": "=== Pemeriksaan persekitaran ===\nPemeriksaan asas kini boleh dilakukan untuk melihat jika persekitaran ini adalah sesuai untuk pemasangan MediaWiki.\nIngat untuk memasukkan maklumat ini jika anda mahukan sokongan tentang bagaimana untuk menyelesaikan pemasangan.",
-       "config-copyright": "=== Hakcipta dan terma ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda perlu terima <doclink href=Copying> satu salinan Lesen Awam GNU </ doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
+       "config-copyright": "=== Hakcipta dan Syarat-Syarat ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda sepatutnya telah menerima <doclink href=Copying> satu salinan Lesen Awam GNU </doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
        "config-sidebar": "* [//www.mediawiki.org Laman utama MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Panduan Pengguna]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Panduan Pentadbir]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
        "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
        "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
index 4b2bdbe..b875181 100644 (file)
        "config-mysql-charset-help": "W '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.\n\nW '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
        "config-mssql-auth": "Typ uwierzytelniania:",
        "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
+       "config-mssql-web-auth": "Wybierz typ uwierzytelniania, który będzie używany przez serwer www do łączenia się z bazą danych podczas normalnego funkcjonowania wiki.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, użyte zostaną dane konta użytkownika, pod którym działa serwer www.",
        "config-mssql-sqlauth": "Uwierzytelnianie serwera SQL",
        "config-mssql-windowsauth": "Autoryzacja Windows",
        "config-site-name": "Nazwa wiki:",
index 905e5ad..64cb8fe 100644 (file)
                        "Fúlvio",
                        "Giro720",
                        "Imperadeiro98",
-                       "Cainamarques"
+                       "Cainamarques",
+                       "Vitorvicentevalente"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
-       "config-title": "Instalação do MediaWiki $1",
+       "config-title": "Instalação da MediaWiki $1",
        "config-information": "Informação",
        "config-localsettings-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor em <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, execute o <code>update.php</code>, por favor",
        "config-localsettings-key": "Chave de atualização:",
        "config-localsettings-badkey": "A chave que forneceu está incorreta.",
        "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
+       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor, defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
        "config-session-error": "Erro ao iniciar a sessão: $1",
        "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
        "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
        "config-your-language": "O seu idioma:",
-       "config-your-language-help": "Selecione a língua que será usada durante o processo de instalação.",
-       "config-wiki-language": "Língua da wiki:",
-       "config-wiki-language-help": "Selecione a língua que será predominante na wiki.",
+       "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.",
+       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language-help": "Selecione o idioma que será predominante na wiki.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
-       "config-page-language": "Língua",
+       "config-page-language": "Idioma",
        "config-page-welcome": "Bem-vindo(a) ao MediaWiki!",
        "config-page-dbconnect": "Ligar à base de dados",
        "config-page-upgrade": "Atualizar a instalação existente",
@@ -48,7 +49,7 @@
        "config-page-readme": "Leia-me",
        "config-page-releasenotes": "Notas de lançamento",
        "config-page-copying": "A copiar",
-       "config-page-upgradedoc": "Atualizando",
+       "config-page-upgradedoc": "A atualizar",
        "config-page-existingwiki": "Wiki existente",
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals": "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n'''Desative-a, se puder.'''\nO MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
-       "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-magic-quotes-sybase": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-mbstring": "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-runtime": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-sybase": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
        "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está a executar o Mandrake, instale o pacote php-xml.",
-       "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
-       "config-pcre-no-utf8": "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
+       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+       "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
-       "config-ctype": "'''Fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de ser ativada nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
@@ -93,8 +94,8 @@
        "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
        "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Será usada a URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para uploads, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
+       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para carregamentos <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
        "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
        "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
        "config-db-type": "Tipo da base de dados:",
        "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
        "config-mysql-charset": "Conjunto de caracteres da base de dados:",
-       "config-mysql-binary": "Binary",
+       "config-mysql-binary": "Binário",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.\nIsto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.\n\nNo modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,\nmas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-sqlauth": "Autenticação do SQL Server",
        "config-mssql-windowsauth": "Autenticação do Windows",
        "config-site-name": "Nome da wiki:",
-       "config-site-name-help": "Este nome aparecerá no título da janela do seu browser e em vários outros sítios.",
-       "config-site-name-blank": "Introduza o nome do site.",
+       "config-site-name-help": "Este nome aparecerá no título da janela do seu navegador e em vários outros sítios.",
+       "config-site-name-blank": "Introduza o nome do sítio.",
        "config-project-namespace": "Espaço nominal do projeto:",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "O mesmo que o nome da wiki: $1",
        "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
        "config-email-sender": "Endereço de correio electrónico de retorno:",
        "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\",
-       "config-upload-settings": "Upload de imagens e ficheiros",
-       "config-upload-enable": "Possibilitar o upload de ficheiros",
-       "config-upload-help": "O upload de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o upload de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
+       "config-upload-settings": "Carregamento de imagens e ficheiros",
+       "config-upload-enable": "Possibilitar o carregamento de ficheiros",
+       "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
        "config-upload-deleted": "Diretório para os ficheiros apagados:",
        "config-upload-deleted-help": "Escolha um diretório onde serão arquivados os ficheiros apagados.\nO ideal é que este diretório não possa ser diretamente acedido a partir da internet.",
        "config-logo": "URL do logótipo:",
        "config-install-tables": "A criar as tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
        "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
+       "config-install-interwiki": "A preencher a tabela padrão de interlínguas",
        "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-keys": "A gerar as chaves secretas",
-       "config-insecure-keys": "'''Warning:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
+       "config-insecure-keys": "'''Aviso:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
        "config-install-sysop": "A criar a conta de administrador",
        "config-install-subscribe-fail": "Não foi possível subscrever a lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalado e <code>allow_url_fopen</code> não está disponível.",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "'''Parabéns!'''\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
-       "config-download-localsettings": "Download do <code>LocalSettings.php</code>",
+       "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
        "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
index beb96c9..2fcf9a5 100644 (file)
        "config-information": "Informații",
        "config-localsettings-key": "Cheie de actualizare:",
        "config-localsettings-badkey": "Cheia furnizată este incorectă.",
+       "config-upgrade-key-missing": "S-a detectat o instalare existentă de MediaWiki.\nPentru a efectua un upgrade în cazul acestei instalări, vă rugăm să introduceți următorul rând în partea de jos a fișierului <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Fișierul <code>LocalSettings.php</code> deja existent pare a fi incomplet.\nVariabila $1 nu este definită.\nModificați fișierul <code>LocalSettings.php</code> astfel încât această variabilă să fie definită, după care apăsați pe „{{int:Config-continue}}”.",
+       "config-localsettings-connection-error": "A apărut o eroare în timpul conectării la baza de date utilizând setările specificate în <code>LocalSettings.php</code>. Vă rugăm să ajustați aceste setări și încercați din nou.\n\n$1",
        "config-session-error": "Eroare la pornirea sesiunii: $1",
+       "config-session-expired": "Este posibil ca datele sesiunii dumnevoastră să fi expirat.\nSesiunile sunt configurate pentru o durată de viață de $1.\nO puteți mări configurând parametrul <code>session.gc_maxlifetime</code> din fișierul php.ini.\nReporniți procesul de instalare.",
+       "config-no-session": "Datele sesiunii dumneavoastră s-au pierdut!\nVerificați-vă fișierul php.ini și asigurați-vă că <code>session.save_path</code> conține calea către un director corespunzător.",
        "config-your-language": "Limba ta:",
        "config-your-language-help": "Alege o limbă pentru a o utiliza în timpul procesului de instalare.",
        "config-wiki-language": "Limbă wiki:",
index 63ed324..9f609ee 100644 (file)
@@ -50,7 +50,7 @@
        "config-env-php-toolow": "PHP $1 is instâlled.\nHoue'er, MediaWiki requires PHP $2 or heier.",
        "config-unicode-using-utf8": "Uising Brion Vibber's utf8_normalize.so fer Unicode normalization.",
        "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
-       "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] isna available tae handle Unicode normalization, fawin back tae slow pure-PHP implementation.\nGif ye rin ae high-traffic site, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
+       "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
        "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
        "config-profile-no-anon": "Please mak aen accoont",
        "config-profile-fishbowl": "Permited eiditors yinly",
        "config-profile-private": "Private wiki",
-       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it isna easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model permits oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario permits appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entrie].",
+       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it's na easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allous oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allous appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entrie].",
        "config-license": "Copiericht n license:",
        "config-license-none": "Nae license fiter",
        "config-license-cc-by-sa": "Creative Commyns Attribution Share Alike",
        "config-logo": "Logo URL:",
        "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise <code>$wgStylePath</code> or <code>$wgScriptPath</code> gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.",
        "config-instantcommons": "Enable Instant Commyns",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that permits wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commyns] site.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commyns, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that allous wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commons, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
        "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.",
        "config-cc-again": "Pick again...",
        "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".",
        "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?",
        "config-extension-link": "Did ye ken that yer wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYe can brouse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions bi categorie] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
        "mainpagetext": "<strong>MediaWiki haes been installit wi speed.</strong>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer informâtion oan uising the wiki saffware.\n\n== Gettin stairted ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeegurâtion settins leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer information oan uisin the wiki saffware.\n\n== Gettin stairtit ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeeguration settins leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
 }
index c6d9b4c..ad6bca7 100644 (file)
@@ -34,6 +34,8 @@
        "config-page-existingwiki": "Existujúca wiki",
        "config-help-restart": "Chcete vymazať všetky uložené dáta, ktoré ste zadali a reštartovať proces inštalácie?",
        "config-restart": "Áno, reštartovať",
+       "config-env-good": "Prostredie bolo skontrolované.\nMôžete nainštalovať MediaWiki.",
+       "config-env-bad": "Prostredie bolo skontrolované.\nNemôžete nainštalovať MediaWiki.",
        "config-env-php": "PHP $1 je nainštalované.",
        "config-env-php-toolow": "PHP $1 je nainštalované. Avšak, MediaWiki vyžaduje PHP $2 alebo vyššie.",
        "config-db-type": "Typ databázy:",
index 63c92bb..ed986c0 100644 (file)
@@ -50,7 +50,7 @@
        "config-help-restart": "是否要清除所有已輸入且儲存的資料,並重新開始安裝程序嗎?",
        "config-restart": "是的,重新開始",
        "config-welcome": "=== 環境檢查 ===\n現在會做基本的檢查,檢查環境是否符合 MediaWiki 安裝所需。\n若您要尋求如何完成安裝的協助,請記得提供以下訊息。",
-       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
+       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
        "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
index 998805a..2990782 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JavaScript Minifier
  *
index f250217..ed0382c 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JSMinPlus version 1.4
  *
index e57dbcf..37723d5 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * lessphp v0.4.0@2cc77e3c7b
  * http://leafo.net/lessphp
index 607c4e5..44be178 100644 (file)
@@ -138,6 +138,10 @@ class BitmapHandler extends ImageHandler {
                        'dstUrl' => $dstUrl,
                );
 
+               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
+                       $scalerParams['quality'] = 30;
+               }
+
                # Determine scaler type
                $scaler = self::getScalerType( $dstPath );
 
@@ -147,6 +151,7 @@ class BitmapHandler extends ImageHandler {
                if ( !$image->mustRender() &&
                        $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
                        && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+                       && !isset( $scalerParams['quality'] )
                ) {
 
                        # normaliseParams (or the user) wants us to return the unscaled image
@@ -163,12 +168,14 @@ class BitmapHandler extends ImageHandler {
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, false, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
                }
 
                # Try to make a target path for the thumbnail
@@ -235,12 +242,14 @@ class BitmapHandler extends ImageHandler {
                } elseif ( $mto ) {
                        return $mto;
                } else {
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
                }
        }
 
@@ -314,7 +323,8 @@ class BitmapHandler extends ImageHandler {
                $animation_post = array();
                $decoderHint = array();
                if ( $params['mimeType'] == 'image/jpeg' ) {
-                       $quality = array( '-quality', '80' ); // 80%
+                       $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                       $quality = array( '-quality', $qualityVal ?: '80' ); // 80%
                        # Sharpening, see bug 6193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
@@ -419,7 +429,8 @@ class BitmapHandler extends ImageHandler {
                                        list( $radius, $sigma ) = explode( 'x', $wgSharpenParameter );
                                        $im->sharpenImage( $radius, $sigma );
                                }
-                               $im->setCompressionQuality( 80 );
+                               $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                               $im->setCompressionQuality( $qualityVal ?: 80 );
                        } elseif ( $params['mimeType'] == 'image/png' ) {
                                $im->setCompressionQuality( 95 );
                        } elseif ( $params['mimeType'] == 'image/gif' ) {
@@ -531,13 +542,14 @@ class BitmapHandler extends ImageHandler {
                # input routine for this.
 
                $typemap = array(
-                       'image/gif' => array( 'imagecreatefromgif', 'palette', 'imagegif' ),
-                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor',
+                       'image/gif' => array( 'imagecreatefromgif', 'palette', false, 'imagegif' ),
+                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor', true,
                                array( __CLASS__, 'imageJpegWrapper' ) ),
-                       'image/png' => array( 'imagecreatefrompng', 'bits', 'imagepng' ),
-                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', 'imagewbmp' ),
-                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', 'imagexbm' ),
+                       'image/png' => array( 'imagecreatefrompng', 'bits', false, 'imagepng' ),
+                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', false, 'imagewbmp' ),
+                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', false, 'imagexbm' ),
                );
+
                if ( !isset( $typemap[$params['mimeType']] ) ) {
                        $err = 'Image type not supported';
                        wfDebug( "$err\n" );
@@ -545,7 +557,7 @@ class BitmapHandler extends ImageHandler {
 
                        return $this->getMediaTransformError( $params, $errMsg );
                }
-               list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
+               list( $loader, $colorStyle, $useQuality, $saveType ) = $typemap[$params['mimeType']];
 
                if ( !function_exists( $loader ) ) {
                        $err = "Incomplete GD library configuration: missing function $loader";
@@ -597,7 +609,12 @@ class BitmapHandler extends ImageHandler {
 
                imagesavealpha( $dst_image, true );
 
-               call_user_func( $saveType, $dst_image, $params['dstPath'] );
+               $funcParams = array( $dst_image, $params['dstPath'] );
+               if ( $useQuality && isset( $params['quality'] ) ) {
+                       $funcParams[] = $params['quality'];
+               }
+               call_user_func_array( $saveType, $funcParams );
+
                imagedestroy( $dst_image );
                imagedestroy( $src_image );
 
@@ -730,9 +747,10 @@ class BitmapHandler extends ImageHandler {
                return $cache;
        }
 
-       static function imageJpegWrapper( $dst_image, $thumbPath ) {
+       // FIXME: transformImageMagick() & transformImageMagickExt() uses JPEG quality 80, here it's 95?
+       static function imageJpegWrapper( $dst_image, $thumbPath, $quality = 95 ) {
                imageinterlace( $dst_image );
-               imagejpeg( $dst_image, $thumbPath, 95 );
+               imagejpeg( $dst_image, $thumbPath, $quality );
        }
 
        /**
index 9ed626f..a0f7acb 100644 (file)
  * @ingroup Media
  */
 class JpegHandler extends ExifBitmapHandler {
+
+       function normaliseParams( $image, &$params ) {
+               if ( !parent::normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+               if ( isset( $params['quality'] ) && !self::validateQuality( $params['quality'] ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       function validateParam( $name, $value ) {
+               if ( $name === 'quality' ) {
+                       return self::validateQuality( $value );
+               } else {
+                       return parent::validateParam( $name, $value );
+               }
+       }
+
+       /** Validate and normalize quality value to be between 1 and 100 (inclusive).
+        * @param int $value quality value, will be converted to integer or 0 if invalid
+        * @return bool true if the value is valid
+        */
+       private static function validateQuality( $value ) {
+               return $value === 'low';
+       }
+
+       function makeParamString( $params ) {
+               // Prepend quality as "qValue-". This has to match parseParamString() below
+               $res = parent::makeParamString( $params );
+               if ( $res && isset( $params['quality'] ) ) {
+                       $res = "q{$params['quality']}-$res";
+               }
+               return $res;
+       }
+
+       function parseParamString( $str ) {
+               // $str contains "qlow-200px" or "200px" strings because thumb.php would strip the filename
+               // first - check if the string begins with "qlow-", and if so, treat it as quality.
+               // Pass the first portion, or the whole string if "qlow-" not found, to the parent
+               // The parsing must match the makeParamString() above
+               $res = false;
+               $m = false;
+               if ( preg_match( '/q([^-]+)-(.*)$/', $str, $m ) ) {
+                       $v = $m[1];
+                       if ( self::validateQuality( $v ) ) {
+                               $res = parent::parseParamString( $m[2] );
+                               if ( $res ) {
+                                       $res['quality'] = $v;
+                               }
+                       }
+               } else {
+                       $res = parent::parseParamString( $str );
+               }
+               return $res;
+       }
+
+       function getScriptParams( $params ) {
+               $res = parent::getScriptParams( $params );
+               if ( isset( $params['quality'] ) ) {
+                       $res['quality'] = $params['quality'];
+               }
+               return $res;
+       }
+
        function getMetadata( $image, $filename ) {
                try {
                        $meta = BitmapMetadataHandler::Jpeg( $filename );
index db0e579..6e50a8c 100644 (file)
@@ -28,7 +28,8 @@
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       var $bag;
+       /** @var array */
+       protected $bag;
 
        function __construct() {
                $this->bag = array();
index bc59c6f..9de840b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
 /**
  * Memcached client for PHP.
  *
index c656bdd..497f75d 100644 (file)
@@ -29,7 +29,8 @@
  * @ingroup Cache
  */
 class MultiWriteBagOStuff extends BagOStuff {
-       var $caches;
+       /** @var array BagOStuff[] */
+       protected $caches;
 
        /**
         * Constructor. Parameters are:
index 3be251c..0009999 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Cache
  */
 class ObjectCache {
-       static $instances = array();
+       public static $instances = array();
 
        /**
         * Get a cached instance of the specified type of cache object.
@@ -87,8 +87,9 @@ class ObjectCache {
                        $class = $params['class'];
                        return new $class( $params );
                } else {
-                       throw new MWException( "The definition of cache type \"" . print_r( $params, true ) . "\" lacks both " .
-                               "factory and class parameters." );
+                       throw new MWException( "The definition of cache type \""
+                               . print_r( $params, true ) . "\" lacks both "
+                               . "factory and class parameters." );
                }
        }
 
index e6a8c45..bcd5942 100644 (file)
  * @ingroup Cache
  */
 class SqlBagOStuff extends BagOStuff {
-       /**
-        * @var LoadBalancer
-        */
-       var $lb;
+       /** @var LoadBalancer */
+       protected $lb;
+
+       protected $serverInfos;
+
+       /** @var array */
+       protected $serverNames;
+
+       /** @var int */
+       protected $numServers;
+
+       /** @var array */
+       protected $conns;
+
+       /** @var int */
+       protected $lastExpireAll = 0;
 
-       var $serverInfos;
-       var $serverNames;
-       var $numServers;
-       var $conns;
-       var $lastExpireAll = 0;
-       var $purgePeriod = 100;
-       var $shards = 1;
-       var $tableName = 'objectcache';
+       /** @var int */
+       protected $purgePeriod = 100;
 
-       protected $connFailureTimes = array(); // UNIX timestamps
-       protected $connFailureErrors = array(); // exceptions
+       /** @var int */
+       protected $shards = 1;
+
+       /** @var string */
+       protected $tableName = 'objectcache';
+
+       /** @var array UNIX timestamps */
+       protected $connFailureTimes = array();
+
+       /** @var array Exceptions */
+       protected $connFailureErrors = array();
 
        /**
         * Constructor. Parameters are:
@@ -721,7 +736,8 @@ class SqlBagOStuff extends BagOStuff {
                if ( $exception->db && $exception->db->wasReadOnlyError() ) {
                        try {
                                $exception->db->rollback( __METHOD__ );
-                       } catch ( DBError $e ) {}
+                       } catch ( DBError $e ) {
+                       }
                }
                wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
                if ( $exception instanceof DBConnectionError ) {
@@ -780,4 +796,5 @@ class SqlBagOStuff extends BagOStuff {
 /**
  * Backwards compatibility alias
  */
-class MediaWikiBagOStuff extends SqlBagOStuff { }
+class MediaWikiBagOStuff extends SqlBagOStuff {
+}
index 464bacd..91f404a 100644 (file)
@@ -32,11 +32,23 @@ class CacheTime {
         */
        public $mUsedOptions;
 
-       var     $mVersion = Parser::VERSION,  # Compatibility check
-               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
-               $mContainsOldMagic,           # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
-               $mCacheRevisionId = null;     # Revision ID that was parsed
+       /** @var string Compatibility check */
+       protected $mVersion = Parser::VERSION;
+
+       /** @var string Time when this object was generated, or -1 for uncacheable. Used in ParserCache. */
+       protected $mCacheTime = '';
+
+       /**
+        * @var int Seconds after which the object should expire, use 0 for uncachable.
+        *   Used in ParserCache.
+        */
+       protected $mCacheExpiry = null;
+
+       /** @var bool Boolean variable indicating if the input contained variables like {{CURRENTDAY}} */
+       protected $mContainsOldMagic;
+
+       /** @var int Revision ID that was parsed */
+       protected $mCacheRevisionId = null;
 
        /**
         * @return string TS_MW timestamp
@@ -161,12 +173,14 @@ class CacheTime {
         */
        public function expired( $touched ) {
                global $wgCacheEpoch;
-               return !$this->isCacheable() || // parser says it's uncacheable
-                       $this->getCacheTime() < $touched ||
-                       $this->getCacheTime() <= $wgCacheEpoch ||
-                       $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
-                       !isset( $this->mVersion ) ||
-                       version_compare( $this->mVersion, Parser::VERSION, "lt" );
+
+               return !$this->isCacheable() // parser says it's uncacheable
+                       || $this->getCacheTime() < $touched
+                       || $this->getCacheTime() <= $wgCacheEpoch
+                       || $this->getCacheTime() <
+                               wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) // expiry period has passed
+                       || !isset( $this->mVersion )
+                       || version_compare( $this->mVersion, Parser::VERSION, "lt" );
        }
 
        /**
index 65c3e1d..3425b6b 100644 (file)
@@ -71,7 +71,11 @@ class CoreParserFunctions {
                        $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH );
                }
                if ( $wgAllowSlowParserFunctions ) {
-                       $parser->setFunctionHook( 'pagesinnamespace', array( __CLASS__, 'pagesinnamespace' ), SFH_NO_HASH );
+                       $parser->setFunctionHook(
+                               'pagesinnamespace',
+                               array( __CLASS__, 'pagesinnamespace' ),
+                               SFH_NO_HASH
+                       );
                }
        }
 
@@ -83,7 +87,9 @@ class CoreParserFunctions {
        static function intFunction( $parser, $part1 = '' /*, ... */ ) {
                if ( strval( $part1 ) !== '' ) {
                        $args = array_slice( func_get_args(), 2 );
-                       $message = wfMessage( $part1, $args )->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+                       $message = wfMessage( $part1, $args )
+                               ->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+
                        return array( $message, 'noparse' => false );
                } else {
                        return array( 'found' => false );
@@ -188,7 +194,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function lc( $parser, $s = '' ) {
                global $wgContLang;
@@ -198,7 +204,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function uc( $parser, $s = '' ) {
                global $wgContLang;
@@ -285,7 +291,7 @@ class CoreParserFunctions {
         * @param Parser $parser
         * @param string $case
         * @param string $word
-        * @return
+        * @return string
         */
        static function grammar( $parser, $case = '', $word = '' ) {
                $word = $parser->killMarkers( $word );
@@ -295,7 +301,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $username
-        * @return
+        * @return string
         */
        static function gender( $parser, $username ) {
                wfProfileIn( __METHOD__ );
@@ -337,7 +343,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $text
-        * @return
+        * @return string
         */
        static function plural( $parser, $text = '' ) {
                $forms = array_slice( func_get_args(), 2 );
@@ -393,12 +399,21 @@ class CoreParserFunctions {
                // only requested titles that normalize to the actual title are allowed through
                // if $wgRestrictDisplayTitle is true (it is by default)
                // mimic the escaping process that occurs in OutputPage::setPageTitle
-               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
+               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
+                       $text,
+                       $htmlTagsCallback,
+                       array(),
+                       array(),
+                       $bad
+               ) );
                $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
 
                if ( !$wgRestrictDisplayTitle ) {
                        $parser->mOutput->setDisplayTitle( $text );
-               } elseif ( $title instanceof Title && !$title->hasFragment() && $title->equals( $parser->mTitle ) ) {
+               } elseif ( $title instanceof Title
+                       && !$title->hasFragment()
+                       && $title->equals( $parser->mTitle )
+               ) {
                        $parser->mOutput->setDisplayTitle( $text );
                }
 
@@ -466,6 +481,8 @@ class CoreParserFunctions {
         * corresponding magic word
         * Note: function name changed to "mwnamespace" rather than "namespace"
         * to not break PHP 5.3
+        * @param Parser $parser
+        * @param string $title
         * @return mixed|string
         */
        static function mwnamespace( $parser, $title = null ) {
@@ -521,6 +538,8 @@ class CoreParserFunctions {
        /**
         * Functions to get and normalize pagenames, corresponding to the magic words
         * of the same names
+        * @param Parser $parser
+        * @param string $title
         * @return string
         */
        static function pagename( $parser, $title = null ) {
@@ -626,6 +645,10 @@ class CoreParserFunctions {
         * Return the number of pages, files or subcats in the given category,
         * or 0 if it's nonexistent. This is an expensive parser function and
         * can't be called too many times per page.
+        * @param Parser $parser
+        * @param string $name
+        * @param string $arg1
+        * @param string $arg2
         * @return string
         */
        static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
@@ -855,8 +878,9 @@ class CoreParserFunctions {
                }
        }
 
-       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
-       // or {{filepath|300px}}, {{filepath|200x300px}}, {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}
+       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}}
+       // or {{filepath|300|nowiki}} or {{filepath|300px}}, {{filepath|200x300px}},
+       // {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}.
        public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
                $file = wfFindFile( $name );
 
@@ -995,6 +1019,7 @@ class CoreParserFunctions {
         * Get the pageid of a specified page
         * @param Parser $parser
         * @param string $title Title to get the pageid from
+        * @return int|null|string
         * @since 1.23
         */
        public static function pageid( $parser, $title = null ) {
@@ -1039,6 +1064,7 @@ class CoreParserFunctions {
         * Get the id from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the id from
+        * @return int|null|string
         * @since 1.23
         */
        public static function revisionid( $parser, $title = null ) {
@@ -1055,6 +1081,7 @@ class CoreParserFunctions {
         * Get the day from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday( $parser, $title = null ) {
@@ -1071,6 +1098,7 @@ class CoreParserFunctions {
         * Get the day with leading zeros from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday2( $parser, $title = null ) {
@@ -1087,6 +1115,7 @@ class CoreParserFunctions {
         * Get the month with leading zeros from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth( $parser, $title = null ) {
@@ -1103,6 +1132,7 @@ class CoreParserFunctions {
         * Get the month from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth1( $parser, $title = null ) {
@@ -1119,6 +1149,7 @@ class CoreParserFunctions {
         * Get the year from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the year from
+        * @return string
         * @since 1.23
         */
        public static function revisionyear( $parser, $title = null ) {
@@ -1135,6 +1166,7 @@ class CoreParserFunctions {
         * Get the timestamp from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the timestamp from
+        * @return string
         * @since 1.23
         */
        public static function revisiontimestamp( $parser, $title = null ) {
@@ -1151,6 +1183,7 @@ class CoreParserFunctions {
         * Get the user from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the user from
+        * @return string
         * @since 1.23
         */
        public static function revisionuser( $parser, $title = null ) {
index 3ddc9d4..f022646 100644 (file)
  * @ingroup Parser
  */
 class DateFormatter {
-       var $mSource, $mTarget;
-       var $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
+       protected $mSource;
 
-       var $regexes, $pDays, $pMonths, $pYears;
-       var $rules, $xMonths, $preferences;
+       protected $mTarget;
+
+       /** @var string */
+       protected $monthNames = '';
+
+       /** @todo Are these unused? */
+       private $rxDM;
+       private $rxMD;
+       private $rxDMY;
+       private $rxYDM;
+       private $rxMDY;
+       private $rxYMD;
+
+       /** @var array */
+       protected $regexes;
+
+       /** @todo Are these unused? */
+       private $pDays;
+       private $pMonths;
+       private $pYears;
+
+       /** @var array */
+       protected $rules;
+
+       /** @var array */
+       protected $xMonths;
+
+       /** @var array */
+       protected $preferences;
+
+       /** @var bool */
+       protected $mLinked;
 
        protected $lang;
 
@@ -205,7 +234,8 @@ class DateFormatter {
 
                $bits = array();
                $key = $this->keys[$this->mSource];
-               for ( $p = 0; $p < strlen( $key ); $p++ ) {
+               $keyLength = strlen( $key );
+               for ( $p = 0; $p < $keyLength; $p++ ) {
                        if ( $key[$p] != ' ' ) {
                                $bits[$key[$p]] = $matches[$p + 1];
                        }
@@ -254,7 +284,8 @@ class DateFormatter {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
 
-               for ( $p = 0; $p < strlen( $format ); $p++ ) {
+               $formatLength = strlen( $format );
+               for ( $p = 0; $p < $formatLength; $p++ ) {
                        $char = $format[$p];
                        switch ( $char ) {
                                case 'd': # ISO day of month
@@ -293,6 +324,7 @@ class DateFormatter {
                        }
                }
                if ( $fail ) {
+                       /** @todo FIXME: $matches doesn't exist here, what's expected? */
                        $text = $matches[0];
                }
 
@@ -354,6 +386,7 @@ class DateFormatter {
 
        /**
         * @todo document
+        * @param string $iso
         * @return int|string
         */
        function makeNormalYear( $iso ) {
index 2f95af2..fd84265 100644 (file)
  * @ingroup Parser
  */
 class LinkHolderArray {
-       var $internals = array(), $interwikis = array();
-       var $size = 0;
-       var $parent;
+       /** @var array */
+       public $internals = array();
+
+       /** @var array */
+       public $interwikis = array();
+
+       /** @var int */
+       protected $size = 0;
+
+       /** @var Parser */
+       protected $parent;
+
+       /** @var int */
        protected $tempIdOffset;
 
        function __construct( $parent ) {
@@ -151,6 +161,7 @@ class LinkHolderArray {
        /**
         * Get a subset of the current LinkHolderArray which is sufficient to
         * interpret the given text.
+        * @param string $text
         * @return LinkHolderArray
         */
        function getSubArray( $text ) {
@@ -253,12 +264,14 @@ class LinkHolderArray {
        /**
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
+        * @param $text
         * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               $colours = $this->replaceInternal( $text ); // FIXME: replaceInternal doesn't return a value
+               /** @todo FIXME: replaceInternal doesn't return a value */
+               $colours = $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
@@ -334,7 +347,8 @@ class LinkHolderArray {
 
                        $res = $dbr->select(
                                'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $dbr->makeList( $where, LIST_OR ),
                                __METHOD__
                        );
@@ -537,7 +551,8 @@ class LinkHolderArray {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
                        $varRes = $dbr->select( 'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $linkBatch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
index 7423006..2066580 100644 (file)
@@ -119,101 +119,205 @@ class Parser {
        const TOC_START = '<mw:toc>';
        const TOC_END = '</mw:toc>';
 
-       # Persistent:
-       var $mTagHooks = array();
-       var $mTransparentTagHooks = array();
-       var $mFunctionHooks = array();
-       var $mFunctionSynonyms = array( 0 => array(), 1 => array() );
-       var $mFunctionTagHooks = array();
-       var $mStripList = array();
-       var $mDefaultStripList = array();
-       var $mVarCache = array();
-       var $mImageParams = array();
-       var $mImageParamsMagicArray = array();
-       var $mMarkerIndex = 0;
-       var $mFirstCall = true;
+       # Persistent
 
-       # Initialised by initialiseVariables()
+       /** @var array */
+       public $mTagHooks = array();
 
-       /**
-        * @var MagicWordArray
-        */
-       var $mVariables;
+       /** @var array */
+       public $mTransparentTagHooks = array();
+
+       /** @var array */
+       public $mFunctionHooks = array();
+
+       /** @var array */
+       protected $mFunctionSynonyms = array( 0 => array(), 1 => array() );
+
+       /** @var array */
+       protected $mFunctionTagHooks = array();
+
+       /** @var array */
+       protected $mStripList = array();
 
        /**
-        * @var MagicWordArray
+        * @var array
+        * @todo Unused?
         */
-       var $mSubstWords;
-       var $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols; # Initialised in constructor
+       private $mDefaultStripList = array();
+
+       /** @var array */
+       protected $mVarCache = array();
+
+       /** @var array */
+       protected $mImageParams = array();
+
+       /** @var array */
+       protected $mImageParamsMagicArray = array();
+
+       /** @var int */
+       public $mMarkerIndex = 0;
+
+       /** @var bool */
+       protected $mFirstCall = true;
+
+       # Initialised by initialiseVariables()
+
+       /** @var MagicWordArray */
+       public $mVariables;
+
+       /** @var MagicWordArray */
+       protected $mSubstWords;
+
+       # Initialised in constructor
+
+       /** @var array */
+       protected $mConf;
+
+       /** @var Parser */
+       public $mPreprocessor;
+
+       /** @var string */
+       protected $mExtLinkBracketedRegex;
+
+       /** @var string */
+       protected $mUrlProtocols;
 
        # Cleared with clearState():
-       /**
-        * @var ParserOutput
-        */
-       var $mOutput;
-       var $mAutonumber, $mDTopen;
+
+       /** @var ParserOutput */
+       public $mOutput;
+
+       /** @var int */
+       protected $mAutonumber;
+
+       /** @var bool */
+       protected $mDTopen;
+
+       /** @var StripState */
+       public $mStripState;
 
        /**
-        * @var StripState
+        * @var array
+        * @todo Unused?
         */
-       var $mStripState;
+       private $mIncludeCount;
 
-       var $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
        /**
-        * @var LinkHolderArray
+        * @var bool
+        * @todo Unused?
         */
-       var $mLinkHolders;
+       private $mArgStack;
 
-       var $mLinkID;
-       var $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth;
-       var $mDefaultSort;
-       var $mTplExpandCache; # empty-frame expansion cache
-       var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
-       var $mExpensiveFunctionCount; # number of expensive parser function calls
-       var $mShowToc, $mForceTocPosition;
+       /** @var string */
+       protected $mLastSection;
 
-       /**
-        * @var User
-        */
-       var $mUser; # User object; only used when doing pre-save transform
+       /** @var bool */
+       protected $mInPre;
+
+       /** @var LinkHolderArray */
+       protected $mLinkHolders;
+
+       /** @var int */
+       protected $mLinkID;
+
+       /** @var array */
+       protected $mIncludeSizes;
+
+       /** @var int */
+       public $mPPNodeCount;
+
+       /** @var int */
+       public $mGeneratedPPNodeCount;
+
+       /** @var int */
+       public $mHighestExpansionDepth;
+
+       /** @var bool|string */
+       protected $mDefaultSort;
+
+       /** @var array Empty-frame expansion cache */
+       protected $mTplExpandCache;
+
+       /** @var array */
+       protected $mTplRedirCache;
+
+       /** @var array */
+       protected $mTplDomCache;
+
+       /** @var array */
+       public $mHeadings;
+
+       /** @var array */
+       protected $mDoubleUnderscores;
+
+       /** @var int Number of expensive parser function calls */
+       protected $mExpensiveFunctionCount;
+
+       /** @var bool */
+       protected $mShowToc;
+
+       /** @var bool */
+       protected $mForceTocPosition;
+
+       /** @var User User object; only used when doing pre-save transform */
+       protected $mUser;
 
        # Temporary
        # These are variables reset at least once per parse regardless of $clearState
 
-       /**
-        * @var ParserOptions
-        */
-       var $mOptions;
+       /** @var ParserOptions */
+       public $mOptions;
 
-       /**
-        * @var Title
-        */
-       var $mTitle;        # Title context, used for self-link rendering and similar things
-       var $mOutputType;   # Output type, one of the OT_xxx constants
-       var $ot;            # Shortcut alias, see setOutputType()
-       var $mRevisionObject; # The revision object of the specified revision ID
-       var $mRevisionId;   # ID to display in {{REVISIONID}} tags
-       var $mRevisionTimestamp; # The timestamp of the specified revision ID
-       var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
-       var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
-       var $mRevIdForTs;   # The revision ID which was used to fetch the timestamp
-       var $mInputSize = false; # For {{PAGESIZE}} on current page.
+       /** @var Title Title context, used for self-link rendering and similar things */
+       public $mTitle;
+
+       /** @var array Shortcut alias, see setOutputType() */
+       public $ot;
+
+       /** @var string The timestamp of the specified revision ID */
+       public $mRevisionTimestamp;
+
+       /** @var string */
+       public $mUniqPrefix;
 
        /**
-        * @var string
+        * @var boolean Recursive call protection.
+        * This variable should be treated as if it were private.
         */
-       var $mUniqPrefix;
+       public $mInParse = false;
+
+       /** @var int Output type, one of the OT_xxx constants */
+       protected $mOutputType;
+
+       /** @var Revision The revision object of the specified revision ID */
+       protected $mRevisionObject;
+
+       /** @var int ID to display in {{REVISIONID}} tags */
+       protected $mRevisionId;
+
+       /** @var string User to display in {{REVISIONUSER}} tag */
+       protected $mRevisionUser;
+
+       /** @var int Size to display in {{REVISIONSIZE}} variable */
+       protected $mRevisionSize;
+
+       /** @var bool|int For {{PAGESIZE}} on current page. */
+       protected $mInputSize = false;
 
        /**
         * @var array Array with the language name of each language link (i.e. the
         * interwiki prefix) in the key, value arbitrary. Used to avoid sending
         * duplicate language links to the ParserOutput.
         */
-       var $mLangLinkLanguages;
+       protected $mLangLinkLanguages;
+
+       /**
+        * @var int The revision ID which was used to fetch the timestamp
+        * @todo Unused?
+        */
+       private $mRevIdForTs;
 
        /**
-        * Constructor
-        *
         * @param array $conf
         */
        public function __construct( $conf = array() ) {
@@ -254,6 +358,7 @@ class Parser {
         * Allow extensions to clean up when the parser is cloned
         */
        function __clone() {
+               $this->mInParse = false;
                wfRunHooks( 'ParserCloned', array( $this ) );
        }
 
@@ -353,7 +458,9 @@ class Parser {
         * @param int $revid Number to pass in {{REVISIONID}}
         * @return ParserOutput A ParserOutput
         */
-       public function parse( $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null ) {
+       public function parse( $text, Title $title, ParserOptions $options,
+               $linestart = true, $clearState = true, $revid = null
+       ) {
                /**
                 * First pass--just handle <nowiki> sections, pass the rest off
                 * to internalParse() which does all the real work.
@@ -364,6 +471,10 @@ class Parser {
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
 
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
+
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
                $this->mInputSize = strlen( $text );
@@ -591,7 +702,7 @@ class Parser {
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
         * @param string $text Text extension wants to have parsed
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         *
         * @return string
         */
@@ -615,6 +726,7 @@ class Parser {
         */
        function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
                wfProfileIn( __METHOD__ );
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
@@ -632,7 +744,7 @@ class Parser {
         * hook.
         *
         * @param string $text Text to be expanded
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         * @return string
         * @since 1.19
         */
@@ -662,6 +774,7 @@ class Parser {
                $text = $msg->params( $params )->plain();
 
                # Parser (re)initialisation
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PLAIN, true );
 
                $flags = PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES;
@@ -1078,7 +1191,10 @@ class Parser {
                                array_push( $tr_history, false );
                                array_push( $td_history, false );
                                array_push( $last_tag_history, '' );
-                       } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
+                       } elseif ( $first_character === '|'
+                               || $first_character === '!'
+                               || substr( $line, 0, 2 ) === '|+'
+                       ) {
                                # This might be cell elements, td, th or captions
                                if ( substr( $line, 0, 2 ) === '|+' ) {
                                        $first_character = '+';
@@ -1223,7 +1339,12 @@ class Parser {
                }
 
                wfRunHooks( 'InternalParseBeforeSanitize', array( &$this, &$text, &$this->mStripState ) );
-               $text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) );
+               $text = Sanitizer::removeHTMLtags(
+                       $text,
+                       array( &$this, 'attributeStripCallback' ),
+                       false,
+                       array_keys( $this->mTransparentTagHooks )
+               );
                wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
 
                # Tables need to come after variable replacement for things to work
@@ -1629,7 +1750,8 @@ class Parser {
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
                        wfProfileOut( __METHOD__ );
-                       throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
+                       throw new MWException( "PCRE needs to be compiled with "
+                               . "--enable-unicode-properties in order for MediaWiki to function" );
                }
                $s = array_shift( $bits );
 
@@ -1775,13 +1897,12 @@ class Parser {
        /**
         * make an image if it's allowed, either through the global
         * option, through the exception, or through the on-wiki whitelist
-        * @private
         *
-        * $param string $url
+        * @param string $url
         *
         * @return string
         */
-       function maybeMakeExternalImage( $url ) {
+       private function maybeMakeExternalImage( $url ) {
                $imagesfrom = $this->mOptions->getAllowExternalImagesFrom();
                $imagesexception = !empty( $imagesfrom );
                $text = false;
@@ -1799,16 +1920,23 @@ class Parser {
                } else {
                        $imagematch = false;
                }
+
                if ( $this->mOptions->getAllowExternalImages()
-                       || ( $imagesexception && $imagematch ) ) {
+                       || ( $imagesexception && $imagematch )
+               ) {
                        if ( preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
                                # Image found
                                $text = Linker::makeExternalImage( $url );
                        }
                }
                if ( !$text && $this->mOptions->getEnableImageWhitelist()
-                       && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
-                       $whitelist = explode( "\n", wfMessage( 'external_image_whitelist' )->inContentLanguage()->text() );
+                       && preg_match( self::EXT_IMAGE_REGEX, $url )
+               ) {
+                       $whitelist = explode(
+                               "\n",
+                               wfMessage( 'external_image_whitelist' )->inContentLanguage()->text()
+                       );
+
                        foreach ( $whitelist as $entry ) {
                                # Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
                                if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
@@ -1901,8 +2029,11 @@ class Parser {
                $useSubpages = $this->areSubpagesAllowed();
                wfProfileOut( __METHOD__ . '-setup' );
 
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                # Loop for each link
                for ( ; $line !== false && $line !== null; $a->next(), $line = $a->current() ) {
+                       // @codingStandardsIgnoreStart
+
                        # Check for excessive memory usage
                        if ( $holders->isBig() ) {
                                # Too big
@@ -1953,7 +2084,8 @@ class Parser {
                                        $m[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $m[1] ) );
                                }
                                $trail = $m[3];
-                       } elseif ( preg_match( $e1_img, $line, $m ) ) { # Invalid, but might be an image with a link in its caption
+                       } elseif ( preg_match( $e1_img, $line, $m ) ) {
+                               # Invalid, but might be an image with a link in its caption
                                $might_be_img = true;
                                $text = $m[2];
                                if ( strpos( $m[1], '%' ) !== false ) {
@@ -2063,7 +2195,9 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
-                               if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+                               if ( $iw && $this->mOptions->getInterwikiMagic()
+                                       && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+                               ) {
                                        // XXX: the above check prevents links to sites with identifiers that are not language codes
 
                                        # Bug 24502: filter duplicates
@@ -2335,7 +2469,7 @@ class Parser {
        }
 
        /**
-        * TODO: document
+        * @todo Document
         * @param string $char
         * @private
         *
@@ -2475,13 +2609,22 @@ class Parser {
                                wfProfileIn( __METHOD__ . "-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+                               $openmatch = preg_match(
+                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
+                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
+                                       $t
+                               );
                                $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
-                                       '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
+                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
+                                               . $this->mUniqPrefix
+                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
+                                       $t
+                               );
+
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
-                                       # TODO bug 5718: paragraph closed
+                                       # @todo bug 5718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch and !$preCloseMatch ) {
                                                $this->mInPre = true;
@@ -2493,7 +2636,10 @@ class Parser {
                                        }
                                        $inBlockElem = !$closematch;
                                } elseif ( !$inBlockElem && !$this->mInPre ) {
-                                       if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
+                                       if ( ' ' == substr( $t, 0, 1 )
+                                               && ( $this->mLastSection === 'pre' || trim( $t ) != '' )
+                                               && !$inBlockquote
+                                       ) {
                                                # pre
                                                if ( $this->mLastSection !== 'pre' ) {
                                                        $paragraphStack = false;
@@ -2731,7 +2877,7 @@ class Parser {
         * @return string
         */
        function getVariableValue( $index, $frame = false ) {
-               global $wgContLang, $wgSitename, $wgServer;
+               global $wgContLang, $wgSitename, $wgServer, $wgServerName;
                global $wgArticlePath, $wgScriptPath, $wgStylePath;
 
                if ( is_null( $this->mTitle ) ) {
@@ -2823,13 +2969,21 @@ class Parser {
                                $value = wfEscapeWikiText( $this->mTitle->getRootText() );
                                break;
                        case 'rootpagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getRootText()
+                               ) ) );
                                break;
                        case 'basepagename':
                                $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
                                break;
                        case 'basepagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getBaseText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getBaseText()
+                               ) ) );
                                break;
                        case 'talkpagename':
                                if ( $this->mTitle->canTalk() ) {
@@ -2940,7 +3094,9 @@ class Parser {
                                $value = $this->mTitle->getNamespace();
                                break;
                        case 'talkspace':
-                               $value = $this->mTitle->canTalk() ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() ) : '';
+                               $value = $this->mTitle->canTalk()
+                                       ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() )
+                                       : '';
                                break;
                        case 'talkspacee':
                                $value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
@@ -2972,13 +3128,19 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) );
                                break;
                        case 'localdayname':
-                               $value = $pageLang->getWeekdayName( (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 );
+                               $value = $pageLang->getWeekdayName(
+                                       (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1
+                               );
                                break;
                        case 'localyear':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ), true );
                                break;
                        case 'localtime':
-                               $value = $pageLang->time( MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), false, false );
+                               $value = $pageLang->time(
+                                       MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ),
+                                       false,
+                                       false
+                               );
                                break;
                        case 'localhour':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
@@ -3032,8 +3194,7 @@ class Parser {
                        case 'server':
                                return $wgServer;
                        case 'servername':
-                               $serverParts = wfParseUrl( $wgServer );
-                               return $serverParts && isset( $serverParts['host'] ) ? $serverParts['host'] : $wgServer;
+                               return $wgServerName;
                        case 'scriptpath':
                                return $wgScriptPath;
                        case 'stylepath':
@@ -3048,7 +3209,11 @@ class Parser {
                                break;
                        default:
                                $ret = null;
-                               wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) );
+                               wfRunHooks(
+                                       'ParserGetVariableValueSwitch',
+                                       array( &$this, &$this->mVarCache, &$index, &$ret, &$frame )
+                               );
+
                                return $ret;
                }
 
@@ -3132,15 +3297,16 @@ class Parser {
         *  self::OT_HTML: all templates and extension tags
         *
         * @param string $text The text to transform
-        * @param PPFrame $frame Object describing the arguments passed to the template.
-        *        Arguments may also be provided as an associative array, as was the usual case before MW1.12.
-        *        Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
-        * @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
-        * @private
-        *
+        * @param bool|PPFrame $frame Object describing the arguments passed to the
+        *   template. Arguments may also be provided as an associative array, as
+        *   was the usual case before MW1.12. Providing arguments this way may be
+        *   useful for extensions wishing to perform variable replacement
+        *   explicitly.
+        * @param bool $argsOnly Only do argument (triple-brace) expansion, not
+        *   double-brace expansion.
         * @return string
         */
-       function replaceVariables( $text, $frame = false, $argsOnly = false ) {
+       public function replaceVariables( $text, $frame = false, $argsOnly = false ) {
                # Is there any text? Also, Prevent too big inclusions!
                if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
@@ -3150,7 +3316,8 @@ class Parser {
                if ( $frame === false ) {
                        $frame = $this->getPreprocessor()->newFrame();
                } elseif ( !( $frame instanceof PPFrame ) ) {
-                       wfDebug( __METHOD__ . " called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
+                       wfDebug( __METHOD__ . " called using plain parameters instead of "
+                               . "a PPFrame instance. Creating custom frame.\n" );
                        $frame = $this->getPreprocessor()->newCustomFrame( $frame );
                }
 
@@ -3211,8 +3378,8 @@ class Parser {
         *   'expansion-depth-exceeded' (corresponding messages:
         *       'expansion-depth-exceeded-warning',
         *       'expansion-depth-exceeded-category')
-        * @param int|null $current Current value
-        * @param int|null $max Maximum allowed, when an explicit limit has been
+        * @param string|int|null $current Current value
+        * @param string|int|null $max Maximum allowed, when an explicit limit has been
         *       exceeded, provide the values (optional)
         */
        function limitationWarn( $limitationType, $current = '', $max = '' ) {
@@ -3228,25 +3395,31 @@ class Parser {
         * replacing any variables or templates within the template.
         *
         * @param array $piece The parts of the template
-        *  $piece['title']: the title, i.e. the part before the |
-        *  $piece['parts']: the parameter array
-        *  $piece['lineStart']: whether the brace was at the start of a line
+        *   $piece['title']: the title, i.e. the part before the |
+        *   $piece['parts']: the parameter array
+        *   $piece['lineStart']: whether the brace was at the start of a line
         * @param PPFrame $frame The current frame, contains template arguments
-        * @throws MWException
+        * @throws Exception
         * @return string The text of the template
-        * @private
         */
-       function braceSubstitution( $piece, $frame ) {
+       public function braceSubstitution( $piece, $frame ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-setup' );
 
-               # Flags
-               $found = false;             # $text has been filled
-               $nowiki = false;            # wiki markup in $text should be escaped
-               $isHTML = false;            # $text is HTML, armour it against wikitext transformation
-               $forceRawInterwiki = false; # Force interwiki transclusion to be done in raw mode not rendered
-               $isChildObj = false;        # $text is a DOM node needing expansion in a child frame
-               $isLocalObj = false;        # $text is a DOM node needing expansion in the current frame
+               // Flags
+
+               // $text has been filled
+               $found = false;
+               // wiki markup in $text should be escaped
+               $nowiki = false;
+               // $text is HTML, armour it against wikitext transformation
+               $isHTML = false;
+               // Force interwiki transclusion to be done in raw mode not rendered
+               $forceRawInterwiki = false;
+               // $text is a DOM node needing expansion in a child frame
+               $isChildObj = false;
+               // $text is a DOM node needing expansion in the current frame
+               $isLocalObj = false;
 
                # Title object, where $text came from
                $title = false;
@@ -3261,7 +3434,8 @@ class Parser {
                $originalTitle = $part1;
 
                # $args is a list of argument nodes, starting from index 0, not including $part1
-               # @todo FIXME: If piece['parts'] is null then the call to getLength() below won't work b/c this $args isn't an object
+               # @todo FIXME: If piece['parts'] is null then the call to getLength()
+               # below won't work b/c this $args isn't an object
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
@@ -3401,7 +3575,8 @@ class Parser {
                                        // "uselang" will have no effect since the Language object
                                        // is forced to the one defined in ParserOptions.
                                        $pageArgs = array();
-                                       for ( $i = 0; $i < $args->getLength(); $i++ ) {
+                                       $argsLength = $args->getLength();
+                                       for ( $i = 0; $i < $argsLength; $i++ ) {
                                                $bits = $args->item( $i )->splitArg();
                                                if ( strval( $bits['index'] ) === '' ) {
                                                        $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
@@ -3534,7 +3709,8 @@ class Parser {
                                preg_replace( '/^:/', '', $originalTitle );
                                $text = "[[:$originalTitle]]";
                        }
-                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, post-expand include size too large -->' );
+                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, '
+                               . 'post-expand include size too large -->' );
                        $this->limitationWarn( 'post-expand-template-inclusion' );
                }
 
@@ -3564,6 +3740,7 @@ class Parser {
         * @param PPFrame $frame The current frame, contains template arguments
         * @param string $function Function name
         * @param array $args Arguments to the function
+        * @throws MWException
         * @return array
         */
        public function callParserFunction( $frame, $function, array $args = array() ) {
@@ -3708,7 +3885,8 @@ class Parser {
         * @return array ( string or false, Title )
         */
        function fetchTemplateAndTitle( $title ) {
-               $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
+               // Defaults to Parser::statelessFetchTemplate()
+               $templateCb = $this->mOptions->getTemplateCallback();
                $stuff = call_user_func( $templateCb, $title, $this );
                $text = $stuff['text'];
                $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
@@ -3740,7 +3918,7 @@ class Parser {
         * Can be overridden via ParserOptions::setTemplateCallback().
         *
         * @param Title $title
-        * @param Parser $parser
+        * @param bool|Parser $parser
         *
         * @return array
         */
@@ -3917,8 +4095,10 @@ class Parser {
                $status = $req->execute(); // Status object
                if ( $status->isOK() ) {
                        $text = $req->getContent();
-               } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
-                       return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
+               } elseif ( $req->getStatus() != 200 ) {
+                       // Though we failed to fetch the content, this status is useless.
+                       return wfMessage( 'scarytranscludefailed-httpstatus' )
+                               ->params( $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
                } else {
                        return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
@@ -4000,7 +4180,8 @@ class Parser {
                $name = $frame->expand( $params['name'] );
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
-               $marker = "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
+               $marker = "{$this->mUniqPrefix}-$name-"
+                       . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
 
                $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower( $name )] ) &&
                        ( $this->ot['html'] || $this->ot['pre'] );
@@ -4132,7 +4313,9 @@ class Parser {
                if ( isset( $this->mDoubleUnderscores['notoc'] ) && !$this->mForceTocPosition ) {
                        $this->mShowToc = false;
                }
-               if ( isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY ) {
+               if ( isset( $this->mDoubleUnderscores['hiddencat'] )
+                       && $this->mTitle->getNamespace() == NS_CATEGORY
+               ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
                # (bug 8068) Allow control over whether robots index a page.
@@ -4227,7 +4410,11 @@ class Parser {
                # Get all headlines for numbering them and adding funky stuff like [edit]
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
-               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
+               $numMatches = preg_match_all(
+                       '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
+                       $text,
+                       $matches
+               );
 
                # if there are fewer than 4 headlines in the article, do not show TOC
                # unless it's been explicitly enabled.
@@ -4376,7 +4563,10 @@ class Parser {
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
-                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
+                               array(
+                                       '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#',
+                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#'
+                               ),
                                array( '', '<$1>' ),
                                $safeHeadline
                        );
@@ -4440,7 +4630,11 @@ class Parser {
                        # Don't number the heading if it is the only one (looks silly)
                        if ( count( $matches[3] ) > 1 && $this->mOptions->getNumberHeadings() ) {
                                # the two are different if the line contains a link
-                               $headline = Html::element( 'span', array( 'class' => 'mw-headline-number' ), $numbering ) . ' ' . $headline;
+                               $headline = Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-headline-number' ),
+                                       $numbering
+                               ) . ' ' . $headline;
                        }
 
                        # Create the anchor for linking from the TOC to the section
@@ -4490,14 +4684,22 @@ class Parser {
                                        # that sections inside <includeonly> should be counted.
                                        $editlinkArgs = array( $titleText, "T-$sectionIndex"/*, null */ );
                                } else {
-                                       $editlinkArgs = array( $this->mTitle->getPrefixedText(), $sectionIndex, $headlineHint );
+                                       $editlinkArgs = array(
+                                               $this->mTitle->getPrefixedText(),
+                                               $sectionIndex,
+                                               $headlineHint
+                                       );
                                }
-                               // We use a bit of pesudo-xml for editsection markers. The language converter is run later on
-                               // Using a UNIQ style marker leads to the converter screwing up the tokens when it converts stuff
-                               // And trying to insert strip tags fails too. At this point all real inputted tags have already been escaped
-                               // so we don't have to worry about a user trying to input one of these markers directly.
-                               // We use a page and section attribute to stop the language converter from converting these important bits
-                               // of data, but put the headline hint inside a content block because the language converter is supposed to
+                               // We use a bit of pesudo-xml for editsection markers. The
+                               // language converter is run later on. Using a UNIQ style marker
+                               // leads to the converter screwing up the tokens when it
+                               // converts stuff. And trying to insert strip tags fails too. At
+                               // this point all real inputted tags have already been escaped,
+                               // so we don't have to worry about a user trying to input one of
+                               // these markers directly. We use a page and section attribute
+                               // to stop the language converter from converting these
+                               // important bits of data, but put the headline hint inside a
+                               // content block because the language converter is supposed to
                                // be able to convert that piece of data.
                                $editlink = '<mw:editsection page="' . htmlspecialchars( $editlinkArgs[0] );
                                $editlink .= '" section="' . htmlspecialchars( $editlinkArgs[1] ) . '"';
@@ -4592,7 +4794,12 @@ class Parser {
         * @param bool $clearState Whether to clear the parser state first
         * @return string The altered wiki markup
         */
-       public function preSaveTransform( $text, Title $title, User $user, ParserOptions $options, $clearState = true ) {
+       public function preSaveTransform( $text, Title $title, User $user,
+               ParserOptions $options, $clearState = true
+       ) {
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
@@ -4661,10 +4868,14 @@ class Parser {
                $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
-               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                   # [[ns:page (context)|]]
-               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                           # [[ns:page(context)|]] (double-width brackets, added in r40257)
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";         # [[ns:page (context), context|]] (using either single or double-width comma)
-               $p2 = "/\[\[\\|($tc+)]]/";                                              # [[|page]] (reverse pipe trick: add context from page title)
+               // [[ns:page (context)|]]
+               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";
+               // [[ns:page(context)|]] (double-width brackets, added in r40257)
+               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";
+               // [[ns:page (context), context|]] (using either single or double-width comma)
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";
+               // [[|page]] (reverse pipe trick: add context from page title)
+               $p2 = "/\[\[\\|($tc+)]]/";
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
                $text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4741,7 +4952,8 @@ class Parser {
                $nickText = wfEscapeWikiText( $nickname );
                $msgName = $user->isAnon() ? 'signature-anon' : 'signature';
 
-               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()->title( $this->getTitle() )->text();
+               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()
+                       ->title( $this->getTitle() )->text();
        }
 
        /**
@@ -4767,6 +4979,7 @@ class Parser {
        public function cleanSig( $text, $parsing = false ) {
                if ( !$parsing ) {
                        global $wgTitle;
+                       $magicScopeVariable = $this->lock();
                        $this->startParse( $wgTitle, new ParserOptions, self::OT_PREPROCESS, true );
                }
 
@@ -4814,7 +5027,9 @@ class Parser {
         * @param int $outputType
         * @param bool $clearState
         */
-       public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       public function startExternalParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->startParse( $title, $options, $outputType, $clearState );
        }
 
@@ -4824,7 +5039,9 @@ class Parser {
         * @param int $outputType
         * @param bool $clearState
         */
-       private function startParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       private function startParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->setTitle( $title );
                $this->mOptions = $options;
                $this->setOutputType( $outputType );
@@ -5508,7 +5725,7 @@ class Parser {
 
        /**
         * @param string $caption
-        * @param LinkHolderArray $holders
+        * @param LinkHolderArray|bool $holders
         * @return mixed|string
         */
        protected function stripAltText( $caption, $holders ) {
@@ -5549,7 +5766,7 @@ class Parser {
         * values, so they can be safely tested and escaped.
         *
         * @param string $text
-        * @param PPFrame $frame
+        * @param bool|PPFrame $frame
         * @return string
         */
        function attributeStripCallback( &$text, $frame = false ) {
@@ -5564,7 +5781,11 @@ class Parser {
         * @return array
         */
        function getTags() {
-               return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), array_keys( $this->mFunctionTagHooks ) );
+               return array_merge(
+                       array_keys( $this->mTransparentTagHooks ),
+                       array_keys( $this->mTagHooks ),
+                       array_keys( $this->mFunctionTagHooks )
+               );
        }
 
        /**
@@ -5587,7 +5808,10 @@ class Parser {
                        list( $element, $content, $params, $tag ) = $data;
                        $tagName = strtolower( $element );
                        if ( isset( $this->mTransparentTagHooks[$tagName] ) ) {
-                               $output = call_user_func_array( $this->mTransparentTagHooks[$tagName], array( $content, $params, $this ) );
+                               $output = call_user_func_array(
+                                       $this->mTransparentTagHooks[$tagName],
+                                       array( $content, $params, $this )
+                               );
                        } else {
                                $output = $tag;
                        }
@@ -5627,6 +5851,8 @@ class Parser {
         */
        private function extractSections( $text, $section, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
+
+               $magicScopeVariable = $this->lock();
                $this->startParse( $wgTitle, new ParserOptions, self::OT_PLAIN, true );
                $outText = '';
                $frame = $this->getPreprocessor()->newFrame();
@@ -5972,6 +6198,7 @@ class Parser {
         * @return string
         */
        function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) {
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, $outputType, true );
 
                $text = $this->replaceVariables( $text );
@@ -6149,4 +6376,28 @@ class Parser {
                }
                return $parsedWidthParam;
        }
+
+       /**
+        * Lock the current instance of the parser.
+        *
+        * This is meant to stop someone from calling the parser
+        * recursively and messing up all the strip state.
+        *
+        * @throws MWException If parser is in a parse
+        * @return ScopedCallback The lock will be released once the return value goes out of scope.
+        */
+       protected function lock() {
+               if ( $this->mInParse ) {
+                       throw new MWException( "Parser state cleared while parsing. "
+                               . "Did you call Parser::parse recursively?" );
+               }
+               $this->mInParse = true;
+
+               $that = $this;
+               $recursiveCheck = new ScopedCallback( function() use ( $that ) {
+                       $that->mInParse = false;
+               } );
+
+               return $recursiveCheck;
+       }
 }
index e374361..33f0f96 100644 (file)
@@ -26,6 +26,7 @@
  * @todo document
  */
 class ParserCache {
+       /** @var MWMemcached  */
        private $mMemc;
        /**
         * Get an instance of this object
@@ -144,7 +145,8 @@ class ParserCache {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache_miss_expired" );
                                $cacheTime = $optionsKey->getCacheTime();
-                               wfDebug( "Parser options key expired, touched " . $article->getTouched() . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
+                               wfDebug( "Parser options key expired, touched " . $article->getTouched()
+                                       . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
                                return false;
                        } elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
                                wfIncrStats( "pcache_miss_revid" );
@@ -164,7 +166,10 @@ class ParserCache {
                        $usedOptions = ParserOptions::legacyOptions();
                }
 
-               return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions, $article->getTitle() ) );
+               return $this->getParserOutputKey(
+                       $article,
+                       $popts->optionsHash( $usedOptions, $article->getTitle() )
+               );
        }
 
        /**
@@ -215,7 +220,8 @@ class ParserCache {
                if ( !$useOutdated && $value->expired( $touched ) ) {
                        wfIncrStats( "pcache_miss_expired" );
                        $cacheTime = $value->getCacheTime();
-                       wfDebug( "ParserOutput key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
+                       wfDebug( "ParserOutput key expired, touched $touched, "
+                               . "epoch $wgCacheEpoch, cached $cacheTime\n" );
                        $value = false;
                } elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
                        wfIncrStats( "pcache_miss_revid" );
index 7c84b67..efd5f74 100644 (file)
 /**
  * \brief Set options of the Parser
  *
- * All member variables are supposed to be private in theory, although in practise this is not the case.
+ * All member variables are supposed to be private in theory, although in
+ * practise this is not the case.
  *
  * @ingroup Parser
  */
 class ParserOptions {
+       /** @var bool Parsing the page for a "preview" operation? */
+       public $mIsPreview = false;
 
-       /**
-        * Interlanguage links are removed and returned in an array
-        */
-       var $mInterwikiMagic;
+       /** @var bool Interlanguage links are removed and returned in an array */
+       protected $mInterwikiMagic;
 
-       /**
-        * Allow external images inline?
-        */
-       var $mAllowExternalImages;
+       /** @var bool Allow external images inline? */
+       protected $mAllowExternalImages;
 
-       /**
-        * If not, any exception?
-        */
-       var $mAllowExternalImagesFrom;
+       /** @var string|array If not, any exception? */
+       protected $mAllowExternalImagesFrom;
 
-       /**
-        * If not or it doesn't match, should we check an on-wiki whitelist?
-        */
-       var $mEnableImageWhitelist;
+       /** @var bool If not or it doesn't match, should we check an on-wiki whitelist? */
+       protected $mEnableImageWhitelist;
 
-       /**
-        * Date format index
-        */
-       var $mDateFormat = null;
+       /** @var string Date format index */
+       protected $mDateFormat = null;
 
-       /**
-        * Create "edit section" links?
-        */
-       var $mEditSection = true;
+       /** @var bool Create "edit section" links? */
+       protected $mEditSection = true;
 
-       /**
-        * Allow inclusion of special pages?
-        */
-       var $mAllowSpecialInclusion;
+       /** @var bool Allow inclusion of special pages? */
+       protected $mAllowSpecialInclusion;
 
-       /**
-        * Use tidy to cleanup output HTML?
-        */
-       var $mTidy = false;
+       /** @var bool Use tidy to cleanup output HTML? */
+       protected $mTidy = false;
 
        /**
-        * Which lang to call for PLURAL and GRAMMAR
+        * @var bool Which lang to call for PLURAL and GRAMMAR
+        * @todo FIXME: This comment doesn't appear to be correct.
+        *   Should be this? Whether this is an interface message.
         */
-       var $mInterfaceMessage = false;
+       protected $mInterfaceMessage = false;
 
-       /**
-        * Overrides $mInterfaceMessage with arbitrary language
-        */
-       var $mTargetLanguage = null;
+       /** @var string|Language Overrides $mInterfaceMessage with arbitrary language */
+       protected $mTargetLanguage = null;
 
-       /**
-        * Maximum size of template expansions, in bytes
-        */
-       var $mMaxIncludeSize;
+       /** @var int Maximum size of template expansions, in bytes */
+       protected $mMaxIncludeSize;
 
-       /**
-        * Maximum number of nodes touched by PPFrame::expand()
-        */
-       var $mMaxPPNodeCount;
+       /** @var int Maximum number of nodes touched by PPFrame::expand() */
+       protected $mMaxPPNodeCount;
 
-       /**
-        * Maximum number of nodes generated by Preprocessor::preprocessToObj()
-        */
-       var $mMaxGeneratedPPNodeCount;
+       /** @var int Maximum number of nodes generated by Preprocessor::preprocessToObj() */
+       protected $mMaxGeneratedPPNodeCount;
 
-       /**
-        * Maximum recursion depth in PPFrame::expand()
-        */
-       var $mMaxPPExpandDepth;
+       /** @var int Maximum recursion depth in PPFrame::expand() */
+       protected $mMaxPPExpandDepth;
 
-       /**
-        * Maximum recursion depth for templates within templates
-        */
-       var $mMaxTemplateDepth;
+       /** @var int Maximum recursion depth for templates within templates */
+       protected $mMaxTemplateDepth;
 
-       /**
-        * Maximum number of calls per parse to expensive parser functions
-        */
-       var $mExpensiveParserFunctionLimit;
+       /** @var int Maximum number of calls per parse to expensive parser functions */
+       protected $mExpensiveParserFunctionLimit;
 
-       /**
-        * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
-        */
-       var $mRemoveComments = true;
+       /** @var bool Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS */
+       protected $mRemoveComments = true;
 
-       /**
-        * Callback for template fetching. Used as first argument to call_user_func().
-        */
-       var $mTemplateCallback =
-               array( 'Parser', 'statelessFetchTemplate' );
+       /** @var array Callback for template fetching. Used as first argument to call_user_func(). */
+       protected $mTemplateCallback = array( 'Parser', 'statelessFetchTemplate' );
 
-       /**
-        * Enable limit report in an HTML comment on output
-        */
-       var $mEnableLimitReport = false;
+       /** @var bool Enable limit report in an HTML comment on output */
+       protected $mEnableLimitReport = false;
 
-       /**
-        * Timestamp used for {{CURRENTDAY}} etc.
-        */
-       var $mTimestamp;
+       /** @var string Timestamp used for {{CURRENTDAY}} etc. */
+       protected $mTimestamp;
 
-       /**
-        * Target attribute for external links
-        */
-       var $mExternalLinkTarget;
+       /** @var bool|string Target attribute for external links */
+       protected $mExternalLinkTarget;
 
        /**
-        * Clean up signature texts?
+        * @var bool Clean up signature texts?
         *
         * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
         * 2) Substitute all transclusions
         */
-       var $mCleanSignatures;
+       protected $mCleanSignatures;
 
-       /**
-        * Transform wiki markup when saving the page?
-        */
-       var $mPreSaveTransform = true;
+       /** @var bool Transform wiki markup when saving the page? */
+       protected $mPreSaveTransform = true;
 
-       /**
-        * Whether content conversion should be disabled
-        */
-       var $mDisableContentConversion;
+       /** @var bool Whether content conversion should be disabled */
+       protected $mDisableContentConversion;
 
-       /**
-        * Whether title conversion should be disabled
-        */
-       var $mDisableTitleConversion;
+       /** @var bool Whether title conversion should be disabled */
+       protected $mDisableTitleConversion;
 
-       /**
-        * Automatically number headings?
-        */
-       var $mNumberHeadings;
+       /** @var string Automatically number headings? */
+       protected $mNumberHeadings;
 
-       /**
-        * Thumb size preferred by the user.
-        */
-       var $mThumbSize;
+       /** @var string Thumb size preferred by the user. */
+       protected $mThumbSize;
 
-       /**
-        * Maximum article size of an article to be marked as "stub"
-        */
+       /** @var Language Language object of the User language. */
+       protected $mUserLang;
+
+       /** @var User Stored user object */
+       protected $mUser;
+
+       /** @var bool Parsing the page for a "preview" operation on a single section? */
+       protected $mIsSectionPreview = false;
+
+       /** @var bool Parsing the printable version of the page? */
+       protected $mIsPrintable = false;
+
+       /** @var string Extra key that should be present in the caching key. */
+       protected $mExtraKey = '';
+
+       /** @var callable Function to be called when an option is accessed. */
+       protected $onAccessCallback = null;
+
+       /** @var int Maximum article size of an article to be marked as "stub" */
        private $mStubThreshold;
 
-       /**
-        * Language object of the User language.
-        */
-       var $mUserLang;
+       function getInterwikiMagic() {
+               return $this->mInterwikiMagic;
+       }
 
-       /**
-        * @var User
-        * Stored user object
-        */
-       var $mUser;
+       function getAllowExternalImages() {
+               return $this->mAllowExternalImages;
+       }
 
-       /**
-        * Parsing the page for a "preview" operation?
-        */
-       var $mIsPreview = false;
+       function getAllowExternalImagesFrom() {
+               return $this->mAllowExternalImagesFrom;
+       }
 
-       /**
-        * Parsing the page for a "preview" operation on a single section?
-        */
-       var $mIsSectionPreview = false;
+       function getEnableImageWhitelist() {
+               return $this->mEnableImageWhitelist;
+       }
 
-       /**
-        * Parsing the printable version of the page?
-        */
-       var $mIsPrintable = false;
+       function getEditSection() {
+               return $this->mEditSection;
+       }
 
-       /**
-        * Extra key that should be present in the caching key.
-        */
-       var $mExtraKey = '';
+       function getNumberHeadings() {
+               $this->optionUsed( 'numberheadings' );
 
-       /**
-        * Function to be called when an option is accessed.
-        */
-       protected $onAccessCallback = null;
+               return $this->mNumberHeadings;
+       }
+
+       function getAllowSpecialInclusion() {
+               return $this->mAllowSpecialInclusion;
+       }
+
+       function getTidy() {
+               return $this->mTidy;
+       }
+
+       function getInterfaceMessage() {
+               return $this->mInterfaceMessage;
+       }
+
+       function getTargetLanguage() {
+               return $this->mTargetLanguage;
+       }
+
+       function getMaxIncludeSize() {
+               return $this->mMaxIncludeSize;
+       }
+
+       function getMaxPPNodeCount() {
+               return $this->mMaxPPNodeCount;
+       }
+
+       function getMaxGeneratedPPNodeCount() {
+               return $this->mMaxGeneratedPPNodeCount;
+       }
+
+       function getMaxPPExpandDepth() {
+               return $this->mMaxPPExpandDepth;
+       }
+
+       function getMaxTemplateDepth() {
+               return $this->mMaxTemplateDepth;
+       }
 
-       function getInterwikiMagic()                { return $this->mInterwikiMagic; }
-       function getAllowExternalImages()           { return $this->mAllowExternalImages; }
-       function getAllowExternalImagesFrom()       { return $this->mAllowExternalImagesFrom; }
-       function getEnableImageWhitelist()          { return $this->mEnableImageWhitelist; }
-       function getEditSection()                   { return $this->mEditSection; }
-       function getNumberHeadings()                { $this->optionUsed( 'numberheadings' );
-                                                                                                 return $this->mNumberHeadings; }
-       function getAllowSpecialInclusion()         { return $this->mAllowSpecialInclusion; }
-       function getTidy()                          { return $this->mTidy; }
-       function getInterfaceMessage()              { return $this->mInterfaceMessage; }
-       function getTargetLanguage()                { return $this->mTargetLanguage; }
-       function getMaxIncludeSize()                { return $this->mMaxIncludeSize; }
-       function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
-       function getMaxGeneratedPPNodeCount()       { return $this->mMaxGeneratedPPNodeCount; }
-       function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
-       function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
        /* @since 1.20 */
-       function getExpensiveParserFunctionLimit()  { return $this->mExpensiveParserFunctionLimit; }
-       function getRemoveComments()                { return $this->mRemoveComments; }
-       function getTemplateCallback()              { return $this->mTemplateCallback; }
-       function getEnableLimitReport()             { return $this->mEnableLimitReport; }
-       function getCleanSignatures()               { return $this->mCleanSignatures; }
-       function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
-       function getDisableContentConversion()      { return $this->mDisableContentConversion; }
-       function getDisableTitleConversion()        { return $this->mDisableTitleConversion; }
-       function getThumbSize()                     { $this->optionUsed( 'thumbsize' );
-                                                                                                 return $this->mThumbSize; }
-       function getStubThreshold()                 { $this->optionUsed( 'stubthreshold' );
-                                                                                                 return $this->mStubThreshold; }
-
-       function getIsPreview()                     { return $this->mIsPreview; }
-       function getIsSectionPreview()              { return $this->mIsSectionPreview; }
-       function getIsPrintable()                   { $this->optionUsed( 'printable' );
-                                                                                                 return $this->mIsPrintable; }
-       function getUser()                          { return $this->mUser; }
-       function getPreSaveTransform()              { return $this->mPreSaveTransform; }
+       function getExpensiveParserFunctionLimit() {
+               return $this->mExpensiveParserFunctionLimit;
+       }
+
+       function getRemoveComments() {
+               return $this->mRemoveComments;
+       }
+
+       function getTemplateCallback() {
+               return $this->mTemplateCallback;
+       }
+
+       function getEnableLimitReport() {
+               return $this->mEnableLimitReport;
+       }
+
+       function getCleanSignatures() {
+               return $this->mCleanSignatures;
+       }
+
+       function getExternalLinkTarget() {
+               return $this->mExternalLinkTarget;
+       }
+
+       function getDisableContentConversion() {
+               return $this->mDisableContentConversion;
+       }
+
+       function getDisableTitleConversion() {
+               return $this->mDisableTitleConversion;
+       }
+
+       function getThumbSize() {
+               $this->optionUsed( 'thumbsize' );
+
+               return $this->mThumbSize;
+       }
+
+       function getStubThreshold() {
+               $this->optionUsed( 'stubthreshold' );
+
+               return $this->mStubThreshold;
+       }
+
+       function getIsPreview() {
+               return $this->mIsPreview;
+       }
+
+       function getIsSectionPreview() {
+               return $this->mIsSectionPreview;
+       }
+
+       function getIsPrintable() {
+               $this->optionUsed( 'printable' );
+
+               return $this->mIsPrintable;
+       }
+
+       function getUser() {
+               return $this->mUser;
+       }
+
+       function getPreSaveTransform() {
+               return $this->mPreSaveTransform;
+       }
 
        function getDateFormat() {
                $this->optionUsed( 'dateformat' );
@@ -293,47 +319,139 @@ class ParserOptions {
                return $this->getUserLangObj()->getCode();
        }
 
-       function setInterwikiMagic( $x )            { return wfSetVar( $this->mInterwikiMagic, $x ); }
-       function setAllowExternalImages( $x )       { return wfSetVar( $this->mAllowExternalImages, $x ); }
-       function setAllowExternalImagesFrom( $x )   { return wfSetVar( $this->mAllowExternalImagesFrom, $x ); }
-       function setEnableImageWhitelist( $x )      { return wfSetVar( $this->mEnableImageWhitelist, $x ); }
-       function setDateFormat( $x )                { return wfSetVar( $this->mDateFormat, $x ); }
-       function setEditSection( $x )               { return wfSetVar( $this->mEditSection, $x ); }
-       function setNumberHeadings( $x )            { return wfSetVar( $this->mNumberHeadings, $x ); }
-       function setAllowSpecialInclusion( $x )     { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
-       function setTidy( $x )                      { return wfSetVar( $this->mTidy, $x ); }
+       function setInterwikiMagic( $x ) {
+               return wfSetVar( $this->mInterwikiMagic, $x );
+       }
+
+       function setAllowExternalImages( $x ) {
+               return wfSetVar( $this->mAllowExternalImages, $x );
+       }
+
+       function setAllowExternalImagesFrom( $x ) {
+               return wfSetVar( $this->mAllowExternalImagesFrom, $x );
+       }
+
+       function setEnableImageWhitelist( $x ) {
+               return wfSetVar( $this->mEnableImageWhitelist, $x );
+       }
+
+       function setDateFormat( $x ) {
+               return wfSetVar( $this->mDateFormat, $x );
+       }
+
+       function setEditSection( $x ) {
+               return wfSetVar( $this->mEditSection, $x );
+       }
+
+       function setNumberHeadings( $x ) {
+               return wfSetVar( $this->mNumberHeadings, $x );
+       }
+
+       function setAllowSpecialInclusion( $x ) {
+               return wfSetVar( $this->mAllowSpecialInclusion, $x );
+       }
+
+       function setTidy( $x ) {
+               return wfSetVar( $this->mTidy, $x );
+       }
 
        /** @deprecated since 1.19 */
-       function setSkin( $x )                      { wfDeprecated( __METHOD__, '1.19' ); }
-       function setInterfaceMessage( $x )          { return wfSetVar( $this->mInterfaceMessage, $x ); }
-       function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
-       function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
-       function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
-       function setMaxGeneratedPPNodeCount( $x )   { return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); }
-       function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+       function setSkin( $x ) {
+               wfDeprecated( __METHOD__, '1.19' );
+       }
+
+       function setInterfaceMessage( $x ) {
+               return wfSetVar( $this->mInterfaceMessage, $x );
+       }
+
+       function setTargetLanguage( $x ) {
+               return wfSetVar( $this->mTargetLanguage, $x, true );
+       }
+
+       function setMaxIncludeSize( $x ) {
+               return wfSetVar( $this->mMaxIncludeSize, $x );
+       }
+
+       function setMaxPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxPPNodeCount, $x );
+       }
+
+       function setMaxGeneratedPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x );
+       }
+
+       function setMaxTemplateDepth( $x ) {
+               return wfSetVar( $this->mMaxTemplateDepth, $x );
+       }
+
        /* @since 1.20 */
-       function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
-       function setRemoveComments( $x )            { return wfSetVar( $this->mRemoveComments, $x ); }
-       function setTemplateCallback( $x )          { return wfSetVar( $this->mTemplateCallback, $x ); }
-       function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
-       function setTimestamp( $x )                 { return wfSetVar( $this->mTimestamp, $x ); }
-       function setCleanSignatures( $x )           { return wfSetVar( $this->mCleanSignatures, $x ); }
-       function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
-       function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
-       function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
-       function setUserLang( $x )                  {
+       function setExpensiveParserFunctionLimit( $x ) {
+               return wfSetVar( $this->mExpensiveParserFunctionLimit, $x );
+       }
+
+       function setRemoveComments( $x ) {
+               return wfSetVar( $this->mRemoveComments, $x );
+       }
+
+       function setTemplateCallback( $x ) {
+               return wfSetVar( $this->mTemplateCallback, $x );
+       }
+
+       function enableLimitReport( $x = true ) {
+               return wfSetVar( $this->mEnableLimitReport, $x );
+       }
+
+       function setTimestamp( $x ) {
+               return wfSetVar( $this->mTimestamp, $x );
+       }
+
+       function setCleanSignatures( $x ) {
+               return wfSetVar( $this->mCleanSignatures, $x );
+       }
+
+       function setExternalLinkTarget( $x ) {
+               return wfSetVar( $this->mExternalLinkTarget, $x );
+       }
+
+       function disableContentConversion( $x = true ) {
+               return wfSetVar( $this->mDisableContentConversion, $x );
+       }
+
+       function disableTitleConversion( $x = true ) {
+               return wfSetVar( $this->mDisableTitleConversion, $x );
+       }
+
+       function setUserLang( $x ) {
                if ( is_string( $x ) ) {
                        $x = Language::factory( $x );
                }
+
                return wfSetVar( $this->mUserLang, $x );
        }
-       function setThumbSize( $x )                 { return wfSetVar( $this->mThumbSize, $x ); }
-       function setStubThreshold( $x )             { return wfSetVar( $this->mStubThreshold, $x ); }
-       function setPreSaveTransform( $x )          { return wfSetVar( $this->mPreSaveTransform, $x ); }
 
-       function setIsPreview( $x )                 { return wfSetVar( $this->mIsPreview, $x ); }
-       function setIsSectionPreview( $x )          { return wfSetVar( $this->mIsSectionPreview, $x ); }
-       function setIsPrintable( $x )               { return wfSetVar( $this->mIsPrintable, $x ); }
+       function setThumbSize( $x ) {
+               return wfSetVar( $this->mThumbSize, $x );
+       }
+
+       function setStubThreshold( $x ) {
+               return wfSetVar( $this->mStubThreshold, $x );
+       }
+
+       function setPreSaveTransform( $x ) {
+               return wfSetVar( $this->mPreSaveTransform, $x );
+       }
+
+       function setIsPreview( $x ) {
+               return wfSetVar( $this->mIsPreview, $x );
+       }
+
+       function setIsSectionPreview( $x ) {
+               return wfSetVar( $this->mIsSectionPreview, $x );
+       }
+
+       function setIsPrintable( $x ) {
+               return wfSetVar( $this->mIsPrintable, $x );
+       }
 
        /**
         * Extra key that should be present in the parser cache key.
@@ -464,7 +582,14 @@ class ParserOptions {
         * @return array
         */
        public static function legacyOptions() {
-               return array( 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
+               return array(
+                       'stubthreshold',
+                       'numberheadings',
+                       'userlang',
+                       'thumbsize',
+                       'editsection',
+                       'printable'
+               );
        }
 
        /**
index b7cc490..74ce325 100644 (file)
  * @ingroup Parser
  */
 class ParserOutput extends CacheTime {
-       var $mText,                       # The output text
-               $mLanguageLinks,              # List of the full text of language links, in the order they appear
-               $mCategories,                 # Map of category names to sort keys
-               $mTitleText,                  # title text of the chosen language variant
-               $mLinks = array(),            # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
-               $mTemplates = array(),        # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
-               $mTemplateIds = array(),      # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
-               $mImages = array(),           # DB keys of the images used, in the array key only
-               $mFileSearchOptions = array(), # DB keys of the images used mapped to sha1 and MW timestamp
-               $mExternalLinks = array(),    # External link URLs, in the key only
-               $mInterwikiLinks = array(),   # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
-               $mNewSection = false,         # Show a new section link?
-               $mHideNewSection = false,     # Hide the new section link?
-               $mNoGallery = false,          # No gallery on category page? (__NOGALLERY__)
-               $mHeadItems = array(),        # Items to put in the <head> section
-               $mModules = array(),          # Modules to be loaded by the resource loader
-               $mModuleScripts = array(),    # Modules of which only the JS will be loaded by the resource loader
-               $mModuleStyles = array(),     # Modules of which only the CSSS will be loaded by the resource loader
-               $mModuleMessages = array(),   # Modules of which only the messages will be loaded by the resource loader
-               $mJsConfigVars = array(),     # JavaScript config variable for mw.config combined with this page
-               $mOutputHooks = array(),      # Hook tags as per $wgParserOutputHooks
-               $mWarnings = array(),         # Warning text to be returned to the user. Wikitext formatted, in the key only
-               $mSections = array(),         # Table of contents
-               $mEditSectionTokens = false,  # prefix/suffix markers if edit sections were output as tokens
-               $mProperties = array(),       # Name/value pairs to be cached in the DB
-               $mTOCHTML = '',               # HTML of the TOC
-               $mTimestamp,                  # Timestamp of the revision
-               $mTOCEnabled = true;          # Whether TOC should be shown, can't override __NOTOC__
-               private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-               private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-               private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
-               private $mExtensionData = array(); # extra data used by extensions
-               private $mLimitReportData = array(); # Parser limit report data
-               private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
-
-       const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
+       /** @var string The output text */
+       public $mText;
+
+       /** @var array List of the full text of language links; in the order they appear */
+       public $mLanguageLinks;
+
+       /** @var array Map of category names to sort keys */
+       public $mCategories;
+
+       /** @var array DB keys of the images used; in the array key only */
+       public $mImages = array();
+
+       /** @var array Modules to be loaded by the resource loader */
+       public $mModules = array();
+
+       /** @var array Name/value pairs to be cached in the DB */
+       public $mProperties = array();
+
+       /** @var string Title text of the chosen language variant */
+       protected $mTitleText;
+
+       /** @var array 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken. */
+       protected $mLinks = array();
+
+       /** @var array 2-D map of NS/DBK to ID for the template references. ID=zero for broken. */
+       protected $mTemplates = array();
+
+       /** @var array 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken. */
+       protected $mTemplateIds = array();
+
+       /** @var array DB keys of the images used mapped to sha1 and MW timestamp */
+       protected $mFileSearchOptions = array();
+
+       /** @var array External link URLs; in the key only */
+       protected $mExternalLinks = array();
+
+       /**
+        * @var array 2-D map of prefix/DBK (in keys only) for the inline interwiki
+        *   links in the document.
+        */
+       protected $mInterwikiLinks = array();
+
+       /** @var bool Show a new section link? */
+       protected $mNewSection = false;
+
+       /** @var bool Hide the new section link? */
+       protected $mHideNewSection = false;
+
+       /** @var bool No gallery on category page? (__NOGALLERY__) */
+       public $mNoGallery = false;
+
+       /** @var array Items to put in the <head> section */
+       protected $mHeadItems = array();
+
+       /** @var array Modules of which only the JS will be loaded by the resource loader */
+       protected $mModuleScripts = array();
+
+       /** @var array Modules of which only the CSSS will be loaded by the resource loader */
+       protected $mModuleStyles = array();
+
+       /** @var array Modules of which only the messages will be loaded by the resource loader */
+       protected $mModuleMessages = array();
+
+       /** @var array JavaScript config variable for mw.config combined with this page */
+       protected $mJsConfigVars = array();
+
+       /** @var array Hook tags as per $wgParserOutputHooks */
+       protected $mOutputHooks = array();
+
+       /** @var array Warning text to be returned to the user. Wikitext formatted; in the key only */
+       protected $mWarnings = array();
+
+       /** @var array Table of contents */
+       protected $mSections = array();
+
+       /** @var bool Prefix/suffix markers if edit sections were output as tokens */
+       protected $mEditSectionTokens = false;
+
+       /** @var string HTML of the TOC */
+       protected $mTOCHTML = '';
+
+       /** @var string Timestamp of the revision */
+       protected $mTimestamp;
+
+       /** @var bool Whether TOC should be shown, can't override __NOTOC__ */
+       protected $mTOCEnabled = true;
+
+       /** @var string 'index' or 'noindex'?  Any other value will result in no change. */
+       private $mIndexPolicy = '';
+
+       /** @var array List of ParserOptions (stored in the keys) */
+       private $mAccessedOptions = array();
+
+       /** @var array List of DataUpdate, used to save info from the page somewhere else. */
+       private $mSecondaryDataUpdates = array();
+
+       /** @var array Extra data used by extensions */
+       private $mExtensionData = array();
+
+       /** @var array Parser limit report data */
+       private $mLimitReportData = array();
+
+       /** @var array Timestamps for getTimeSinceStart() */
+       private $mParseStartTime = array();
+
+       const EDITSECTION_REGEX =
+               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
        function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(),
                $containsOldMagic = false, $titletext = ''
@@ -116,50 +187,166 @@ class ParserOutput extends CacheTime {
                return call_user_func_array( array( $skin, 'doEditSectionLink' ), $args );
        }
 
-       function &getLanguageLinks()         { return $this->mLanguageLinks; }
-       function getInterwikiLinks()         { return $this->mInterwikiLinks; }
-       function getCategoryLinks()          { return array_keys( $this->mCategories ); }
-       function &getCategories()            { return $this->mCategories; }
-       function getTitleText()              { return $this->mTitleText; }
-       function getSections()               { return $this->mSections; }
-       function getEditSectionTokens()      { return $this->mEditSectionTokens; }
-       function &getLinks()                 { return $this->mLinks; }
-       function &getTemplates()             { return $this->mTemplates; }
-       function &getTemplateIds()           { return $this->mTemplateIds; }
-       function &getImages()                { return $this->mImages; }
-       function &getFileSearchOptions()     { return $this->mFileSearchOptions; }
-       function &getExternalLinks()         { return $this->mExternalLinks; }
-       function getNoGallery()              { return $this->mNoGallery; }
-       function getHeadItems()              { return $this->mHeadItems; }
-       function getModules()                { return $this->mModules; }
-       function getModuleScripts()          { return $this->mModuleScripts; }
-       function getModuleStyles()           { return $this->mModuleStyles; }
-       function getModuleMessages()         { return $this->mModuleMessages; }
+       function &getLanguageLinks() {
+               return $this->mLanguageLinks;
+       }
+
+       function getInterwikiLinks() {
+               return $this->mInterwikiLinks;
+       }
+
+       function getCategoryLinks() {
+               return array_keys( $this->mCategories );
+       }
+
+       function &getCategories() {
+               return $this->mCategories;
+       }
+
+       function getTitleText() {
+               return $this->mTitleText;
+       }
+
+       function getSections() {
+               return $this->mSections;
+       }
+
+       function getEditSectionTokens() {
+               return $this->mEditSectionTokens;
+       }
+
+       function &getLinks() {
+               return $this->mLinks;
+       }
+
+       function &getTemplates() {
+               return $this->mTemplates;
+       }
+
+       function &getTemplateIds() {
+               return $this->mTemplateIds;
+       }
+
+       function &getImages() {
+               return $this->mImages;
+       }
+
+       function &getFileSearchOptions() {
+               return $this->mFileSearchOptions;
+       }
+
+       function &getExternalLinks() {
+               return $this->mExternalLinks;
+       }
+
+       function getNoGallery() {
+               return $this->mNoGallery;
+       }
+
+       function getHeadItems() {
+               return $this->mHeadItems;
+       }
+
+       function getModules() {
+               return $this->mModules;
+       }
+
+       function getModuleScripts() {
+               return $this->mModuleScripts;
+       }
+
+       function getModuleStyles() {
+               return $this->mModuleStyles;
+       }
+
+       function getModuleMessages() {
+               return $this->mModuleMessages;
+       }
+
        /** @since 1.23 */
-       function getJsConfigVars()           { return $this->mJsConfigVars; }
-       function getOutputHooks()            { return (array)$this->mOutputHooks; }
-       function getWarnings()               { return array_keys( $this->mWarnings ); }
-       function getIndexPolicy()            { return $this->mIndexPolicy; }
-       function getTOCHTML()                { return $this->mTOCHTML; }
-       function getTimestamp()              { return $this->mTimestamp; }
-       function getLimitReportData()        { return $this->mLimitReportData; }
-       function getTOCEnabled()             { return $this->mTOCEnabled; }
-
-       function setText( $text )            { return wfSetVar( $this->mText, $text ); }
-       function setLanguageLinks( $ll )     { return wfSetVar( $this->mLanguageLinks, $ll ); }
-       function setCategoryLinks( $cl )     { return wfSetVar( $this->mCategories, $cl ); }
-
-       function setTitleText( $t )          { return wfSetVar( $this->mTitleText, $t ); }
-       function setSections( $toc )         { return wfSetVar( $this->mSections, $toc ); }
-       function setEditSectionTokens( $t )  { return wfSetVar( $this->mEditSectionTokens, $t ); }
-       function setIndexPolicy( $policy )   { return wfSetVar( $this->mIndexPolicy, $policy ); }
-       function setTOCHTML( $tochtml )      { return wfSetVar( $this->mTOCHTML, $tochtml ); }
-       function setTimestamp( $timestamp )  { return wfSetVar( $this->mTimestamp, $timestamp ); }
-       function setTOCEnabled( $flag )      { return wfSetVar( $this->mTOCEnabled, $flag ); }
-
-       function addCategory( $c, $sort )    { $this->mCategories[$c] = $sort; }
-       function addLanguageLink( $t )       { $this->mLanguageLinks[] = $t; }
-       function addWarning( $s )            { $this->mWarnings[$s] = 1; }
+       function getJsConfigVars() {
+               return $this->mJsConfigVars;
+       }
+
+       function getOutputHooks() {
+               return (array)$this->mOutputHooks;
+       }
+
+       function getWarnings() {
+               return array_keys( $this->mWarnings );
+       }
+
+       function getIndexPolicy() {
+               return $this->mIndexPolicy;
+       }
+
+       function getTOCHTML() {
+               return $this->mTOCHTML;
+       }
+
+       function getTimestamp() {
+               return $this->mTimestamp;
+       }
+
+       function getLimitReportData() {
+               return $this->mLimitReportData;
+       }
+
+       function getTOCEnabled() {
+               return $this->mTOCEnabled;
+       }
+
+       function setText( $text ) {
+               return wfSetVar( $this->mText, $text );
+       }
+
+       function setLanguageLinks( $ll ) {
+               return wfSetVar( $this->mLanguageLinks, $ll );
+       }
+
+       function setCategoryLinks( $cl ) {
+               return wfSetVar( $this->mCategories, $cl );
+       }
+
+       function setTitleText( $t ) {
+               return wfSetVar( $this->mTitleText, $t );
+       }
+
+       function setSections( $toc ) {
+               return wfSetVar( $this->mSections, $toc );
+       }
+
+       function setEditSectionTokens( $t ) {
+               return wfSetVar( $this->mEditSectionTokens, $t );
+       }
+
+       function setIndexPolicy( $policy ) {
+               return wfSetVar( $this->mIndexPolicy, $policy );
+       }
+
+       function setTOCHTML( $tochtml ) {
+               return wfSetVar( $this->mTOCHTML, $tochtml );
+       }
+
+       function setTimestamp( $timestamp ) {
+               return wfSetVar( $this->mTimestamp, $timestamp );
+       }
+
+       function setTOCEnabled( $flag ) {
+               return wfSetVar( $this->mTOCEnabled, $flag );
+       }
+
+       function addCategory( $c, $sort ) {
+               $this->mCategories[$c] = $sort;
+       }
+
+       function addLanguageLink( $t ) {
+               $this->mLanguageLinks[] = $t;
+       }
+
+       function addWarning( $s ) {
+               $this->mWarnings[$s] = 1;
+       }
 
        function addOutputHook( $hook, $data = false ) {
                $this->mOutputHooks[] = array( $hook, $data );
@@ -512,8 +699,8 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
-        * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
-        *        handler may provide additional update objects.
+        * @note Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates()
+        *   instead! The content handler may provide additional update objects.
         *
         * @since 1.20
         *
index 920b6f6..4d821ca 100644 (file)
 /**
  * @ingroup Parser
  */
-class Parser_DiffTest
-{
-       var $parsers, $conf;
-       var $shortOutput = false;
+class Parser_DiffTest {
+       /** @var array */
+       protected $parsers;
 
-       var $dtUniqPrefix;
+       /** @var array */
+       protected $conf;
+
+       /** @var bool */
+       protected $shortOutput = false;
+
+       /** @var string */
+       protected $dtUniqPrefix;
 
        function __construct( $conf ) {
                if ( !isset( $conf['parsers'] ) ) {
index 4cd5694..b8e262a 100644 (file)
@@ -40,7 +40,8 @@ interface Preprocessor {
        function newFrame();
 
        /**
-        * Create a new custom frame for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom frame for programmatic use of parameter replacement
+        * as used in some extensions.
         *
         * @param array $args
         *
@@ -49,7 +50,8 @@ interface Preprocessor {
        function newCustomFrame( $args );
 
        /**
-        * Create a new custom node for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom node for programmatic use of parameter replacement
+        * as used in some extensions.
         *
         * @param array $values
         */
@@ -84,8 +86,8 @@ interface PPFrame {
        /**
         * Create a child frame
         *
-        * @param array $args
-        * @param Title $title
+        * @param array|bool $args
+        * @param bool|Title $title
         * @param int $indexOffset A number subtracted from the index attributes of the arguments
         *
         * @return PPFrame
index df3cbeb..7d8a0b6 100644 (file)
  * @ingroup Parser
  */
 class Preprocessor_DOM implements Preprocessor {
+       /** @var Parser */
+       public $parser;
 
-       /**
-        * @var Parser
-        */
-       var $parser;
-
-       var $memoryLimit;
+       protected $memoryLimit;
 
        const CACHE_VERSION = 1;
 
@@ -73,18 +70,34 @@ class Preprocessor_DOM implements Preprocessor {
 
                foreach ( $values as $k => $val ) {
                        if ( is_int( $k ) ) {
-                               $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name index=\"$k\"/><value>"
+                                       . htmlspecialchars( $val ) . "</value></part>";
                        } else {
-                               $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name>" . htmlspecialchars( $k )
+                                       . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
                        }
                }
 
                $xml .= "</list>";
 
+               wfProfileIn( __METHOD__ . '-loadXML' );
                $dom = new DOMDocument();
-               $dom->loadXML( $xml );
-               $root = $dom->documentElement;
+               wfSuppressWarnings();
+               $result = $dom->loadXML( $xml );
+               wfRestoreWarnings();
+               if ( !$result ) {
+                       // Try running the XML through UtfNormal to get rid of invalid characters
+                       $xml = UtfNormal::cleanUp( $xml );
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+                       $result = $dom->loadXML( $xml, 1 << 19 );
+               }
+               wfProfileOut( __METHOD__ . '-loadXML' );
+
+               if ( !$result ) {
+                       throw new MWException( 'Parameters passed to ' . __METHOD__ . ' result in invalid XML' );
+               }
 
+               $root = $dom->documentElement;
                $node = new PPNode_DOM( $root->childNodes );
                return $node;
        }
@@ -111,8 +124,9 @@ class Preprocessor_DOM implements Preprocessor {
         *
         * @param string $text The text to parse
         * @param int $flags Bitwise combination of:
-        *     Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                  included. Default is to assume a direct page view.
+        *     Parser::PTD_FOR_INCLUSION  Handle "<noinclude>" and "<includeonly>"
+        *                                as if the text is being included. Default
+        *                                is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -180,7 +194,8 @@ class Preprocessor_DOM implements Preprocessor {
                if ( !$result ) {
                        // Try running the XML through UtfNormal to get rid of invalid characters
                        $xml = UtfNormal::cleanUp( $xml );
-                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2
+                       // don't barf when the XML is >256 levels deep.
                        $result = $dom->loadXML( $xml, 1 << 19 );
                }
                if ( $result ) {
@@ -233,7 +248,9 @@ class Preprocessor_DOM implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -249,19 +266,28 @@ class Preprocessor_DOM implements Preprocessor {
                $stack = new PPDStack;
 
                $searchBase = "[{<\n"; #}
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
                $accum = '<root>';
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -346,7 +372,9 @@ class Preprocessor_DOM implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -460,7 +488,9 @@ class Preprocessor_DOM implements Preprocessor {
 
                                // Handle ignored tags
                                if ( in_array( $lowerName, $ignoredTags ) ) {
-                                       $accum .= '<ignore>' . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) ) . '</ignore>';
+                                       $accum .= '<ignore>'
+                                               . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) )
+                                               . '</ignore>';
                                        $i = $tagEndPos + 1;
                                        continue;
                                }
@@ -520,9 +550,11 @@ class Preprocessor_DOM implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the
+                                       // potential heading. This is heuristic, but AFAICT the
+                                       // methods for completely correct disambiguation are very
+                                       // complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -541,8 +573,9 @@ class Preprocessor_DOM implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -736,16 +769,22 @@ class Preprocessor_DOM implements Preprocessor {
  * @ingroup Parser
  */
 class PPDStack {
-       var $stack, $rootAccum;
+       /** @var array */
+       public $stack;
 
-       /**
-        * @var PPDStack
-        */
-       var $top;
-       var $out;
-       var $elementClass = 'PPDStackElement';
+       /** @var string */
+       public $rootAccum;
+
+       /** @var bool|PPDStack */
+       public $top;
+
+       /** @var */
+       public $out;
 
-       static $false = false;
+       /** @var string */
+       protected $elementClass = 'PPDStackElement';
+
+       protected static $false = false;
 
        function __construct() {
                $this->stack = array();
@@ -825,13 +864,26 @@ class PPDStack {
  * @ingroup Parser
  */
 class PPDStackElement {
-       var     $open,              // Opening character (\n for heading)
-               $close,             // Matching closing character
-               $count,             // Number of opening characters found (number of "=" for heading)
-               $parts,             // Array of PPDPart objects describing pipe-separated parts.
-               $lineStart;         // True if the open char appeared at the start of the input line. Not set for headings.
+       /** @var string Opening character (\n for heading) */
+       public $open;
+
+       /** @var string Matching closing character */
+       public $close;
+
+       /** @var int Number of opening characters found (number of "=" for heading) */
+       public $count;
+
+       /** @var array PPDPart objects describing pipe-separated parts. */
+       public $parts;
+
+       /**
+        * @var bool True if the open char appeared at the start of the input line.
+        * Not set for headings.
+        */
+       public $lineStart;
 
-       var $partClass = 'PPDPart';
+       /** @var string */
+       protected $partClass = 'PPDPart';
 
        function __construct( $data = array() ) {
                $class = $this->partClass;
@@ -871,6 +923,7 @@ class PPDStackElement {
        /**
         * Get the output string that would result if the close is not found.
         *
+        * @param bool|int $openingCount
         * @return string
         */
        function breakSyntax( $openingCount = false ) {
@@ -899,7 +952,8 @@ class PPDStackElement {
  * @ingroup Parser
  */
 class PPDPart {
-       var $out; // Output accumulator string
+       /** @var string */
+       public $out;
 
        // Optional member variables:
        //   eqpos        Position of equals sign in output accumulator
@@ -916,34 +970,29 @@ class PPDPart {
  * @ingroup Parser
  */
 class PPFrame_DOM implements PPFrame {
+       /** @var array */
+       public $titleCache;
 
        /**
-        * @var Preprocessor
+        * @var array Hashtable listing templates which are disallowed for expansion
+        *   in this frame, having been encountered previously in parent frames.
         */
-       var $preprocessor;
+       public $loopCheckHash;
 
        /**
-        * @var Parser
+        * @var int Recursion depth of this frame, top = 0.
+        * Note that this is NOT the same as expansion depth in expand()
         */
-       var $parser;
+       public $depth;
 
-       /**
-        * @var Title
-        */
-       var $title;
-       var $titleCache;
+       /** @var Preprocessor */
+       protected $preprocessor;
 
-       /**
-        * Hashtable listing templates which are disallowed for expansion in this frame,
-        * having been encountered previously in parent frames.
-        */
-       var $loopCheckHash;
+       /** @var Parser */
+       protected $parser;
 
-       /**
-        * Recursion depth of this frame, top = 0
-        * Note that this is NOT the same as expansion depth in expand()
-        */
-       var $depth;
+       /** @var Title */
+       protected $title;
 
        /**
         * Construct a new preprocessor frame.
@@ -1148,8 +1197,9 @@ class PPFrame_DOM implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->textContent );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1160,7 +1210,9 @@ class PPFrame_DOM implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->textContent;
                                        } else {
                                                $out .= '';
@@ -1433,22 +1485,31 @@ class PPFrame_DOM implements PPFrame {
  * @ingroup Parser
  */
 class PPTemplateFrame_DOM extends PPFrame_DOM {
-       var $numberedArgs, $namedArgs;
+       /** @var PPFrame_DOM */
+       public $parent;
 
-       /**
-        * @var PPFrame_DOM
-        */
-       var $parent;
-       var $numberedExpansionCache, $namedExpansionCache;
+       /** @var array */
+       protected $numberedArgs;
+
+       /** @var array */
+       protected $namedArgs;
+
+       /** @var array */
+       protected $numberedExpansionCache;
+
+       /** @var string[] */
+       protected $namedExpansionCache;
 
        /**
         * @param Preprocessor $preprocessor
-        * @param PPFrame_DOM $parent
+        * @param bool|PPFrame_DOM $parent
         * @param array $numberedArgs
         * @param array $namedArgs
-        * @param Title $title
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1524,7 +1585,10 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
@@ -1564,7 +1628,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
  * @ingroup Parser
  */
 class PPCustomFrame_DOM extends PPFrame_DOM {
-       var $args;
+       protected $args;
 
        function __construct( $preprocessor, $args ) {
                parent::__construct( $preprocessor );
@@ -1610,12 +1674,11 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
  * @ingroup Parser
  */
 class PPNode_DOM implements PPNode {
+       /** @var DOMElement */
+       public $node;
 
-       /**
-        * @var DOMElement
-        */
-       var $node;
-       var $xpath;
+       /** @var DOMXPath */
+       protected $xpath;
 
        function __construct( $node, $xpath = false ) {
                $this->node = $node;
index aebb98e..a5b6b43 100644 (file)
  * @ingroup Parser
  */
 class Preprocessor_Hash implements Preprocessor {
-       /**
-        * @var Parser
-        */
-       var $parser;
+       /** @var Parser */
+       public $parser;
 
        const CACHE_VERSION = 1;
 
@@ -114,7 +112,9 @@ class Preprocessor_Hash implements Preprocessor {
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
-               $cacheable = $wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold;
+               $cacheable = $wgPreprocessorCacheThreshold !== false
+                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
+
                if ( $cacheable ) {
                        wfProfileIn( __METHOD__ . '-cacheable' );
 
@@ -161,7 +161,9 @@ class Preprocessor_Hash implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -177,18 +179,27 @@ class Preprocessor_Hash implements Preprocessor {
                $stack = new PPDStack_Hash;
 
                $searchBase = "[{<\n";
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -273,7 +284,9 @@ class Preprocessor_Hash implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -452,9 +465,10 @@ class Preprocessor_Hash implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the potential
+                                       // heading. This is heuristic, but AFAICT the methods for
+                                       // completely correct disambiguation are very complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -472,8 +486,9 @@ class Preprocessor_Hash implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -805,7 +820,9 @@ class PPDPart_Hash extends PPDPart {
  * @ingroup Parser
  */
 class PPDAccum_Hash {
-       var $firstNode, $lastNode;
+       public $firstNode;
+
+       public $lastNode;
 
        function __construct() {
                $this->firstNode = $this->lastNode = false;
@@ -850,10 +867,10 @@ class PPDAccum_Hash {
        }
 
        /**
-        * Append a PPAccum_Hash
+        * Append a PPDAccum_Hash
         * Takes over ownership of the nodes in the source argument. These nodes may
         * subsequently be modified, especially nextSibling.
-        * @param PPAccum_Hash $accum
+        * @param PPDAccum_Hash $accum
         */
        function addAccum( $accum ) {
                if ( $accum->lastNode === false ) {
@@ -873,34 +890,30 @@ class PPDAccum_Hash {
  * @ingroup Parser
  */
 class PPFrame_Hash implements PPFrame {
-
        /**
-        * @var Parser
+        * @var int Recursion depth of this frame, top = 0
+        * Note that this is NOT the same as expansion depth in expand()
         */
-       var $parser;
+       public $depth;
 
-       /**
-        * @var Preprocessor
-        */
-       var $preprocessor;
+       /** @var Parser */
+       protected $parser;
 
-       /**
-        * @var Title
-        */
-       var $title;
-       var $titleCache;
+       /** @var Preprocessor */
+       protected $preprocessor;
 
-       /**
-        * Hashtable listing templates which are disallowed for expansion in this frame,
-        * having been encountered previously in parent frames.
-        */
-       var $loopCheckHash;
+       /** @var Title */
+       protected $title;
+
+       /** @var array */
+       protected $titleCache;
 
        /**
-        * Recursion depth of this frame, top = 0
-        * Note that this is NOT the same as expansion depth in expand()
+        * @var array Hashtable listing templates which are disallowed for
+        *   expansion in this frame, having been encountered previously in
+        *   parent frames.
         */
-       var $depth;
+       protected $loopCheckHash;
 
        /**
         * Construct a new preprocessor frame.
@@ -1038,7 +1051,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Double-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_TEMPLATES ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{', '|', '}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->braceSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1051,7 +1068,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Triple-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_ARGS ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{{', '|', '}}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->argSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1069,8 +1090,9 @@ class PPFrame_Hash implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1081,7 +1103,9 @@ class PPFrame_Hash implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->firstChild->value;
                                        } else {
                                                //$out .= '';
@@ -1351,17 +1375,31 @@ class PPFrame_Hash implements PPFrame {
  * @ingroup Parser
  */
 class PPTemplateFrame_Hash extends PPFrame_Hash {
-       var $numberedArgs, $namedArgs, $parent;
-       var $numberedExpansionCache, $namedExpansionCache;
+       /** @var array */
+       protected $numberedArgs;
+
+       /** @var array */
+       protected $namedArgs;
+
+       /** @var bool|PPFrame */
+       protected $parent;
+
+       /** @var array */
+       protected $numberedExpansionCache;
+
+       /** @var  */
+       protected $namedExpansionCache;
 
        /**
         * @param Preprocessor $preprocessor
         * @param bool|PPFrame $parent
         * @param array $numberedArgs
         * @param array $namedArgs
-        * @param Title $title
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1450,7 +1488,10 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
@@ -1498,7 +1539,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
  * @ingroup Parser
  */
 class PPCustomFrame_Hash extends PPFrame_Hash {
-       var $args;
+       /** @var array */
+       protected $args;
 
        function __construct( $preprocessor, $args ) {
                parent::__construct( $preprocessor );
@@ -1548,7 +1590,13 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
  * @ingroup Parser
  */
 class PPNode_Hash_Tree implements PPNode {
-       var $name, $firstChild, $lastChild, $nextSibling;
+       public $name;
+
+       public $firstChild;
+
+       public $lastChild;
+
+       public $nextSibling;
 
        function __construct( $name ) {
                $this->name = $name;
@@ -1770,7 +1818,9 @@ class PPNode_Hash_Tree implements PPNode {
  * @ingroup Parser
  */
 class PPNode_Hash_Text implements PPNode {
-       var $value, $nextSibling;
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $value ) {
                if ( is_object( $value ) ) {
@@ -1787,22 +1837,50 @@ class PPNode_Hash_Text implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function getName() { return '#text'; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function getName() {
+               return '#text';
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
  * @ingroup Parser
  */
 class PPNode_Hash_Array implements PPNode {
-       var $value, $nextSibling;
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $value ) {
                $this->value = $value;
@@ -1820,25 +1898,50 @@ class PPNode_Hash_Array implements PPNode {
                return $this->value[$i];
        }
 
-       function getName() { return '#nodelist'; }
+       function getName() {
+               return '#nodelist';
+       }
 
        function getNextSibling() {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
  * @ingroup Parser
  */
 class PPNode_Hash_Attr implements PPNode {
-       var $name, $value, $nextSibling;
+       /** @var string */
+       public $name;
+
+       /** @var string */
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $name, $value ) {
                $this->name = $name;
@@ -1857,12 +1960,35 @@ class PPNode_Hash_Attr implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
index a44200f..34953c0 100644 (file)
@@ -123,7 +123,10 @@ abstract class PoolCounter {
        abstract public function release();
 }
 
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PoolCounter_Stub extends PoolCounter {
+       // @codingStandardsIgnoreEnd
+
        public function __construct() {
                /* No parameters needed */
        }
index 36101e0..093fe49 100644 (file)
@@ -45,7 +45,7 @@
  * Also this should be on a server plenty of RAM for the working set to avoid evictions.
  * Evictions could temporarily allow wait queues to double in size or temporarily cause
  * pools to appear as full when they are not. Using volatile-ttl and bumping memory-samples
- * and redis.conf can be helpful otherwise.
+ * in redis.conf can be helpful otherwise.
  *
  * @ingroup Redis
  * @since 1.23
@@ -406,7 +406,8 @@ LUA;
                                if ( $poolCounter->slot !== null ) {
                                        $poolCounter->release();
                                }
-                       } catch ( Exception $e ) {}
+                       } catch ( Exception $e ) {
+                       }
                }
        }
 }
index efbdf05..f6bafd5 100644 (file)
@@ -101,8 +101,10 @@ abstract class Profiler {
        /** @var TransactionProfiler */
        protected $trxProfiler;
 
-       /** @var Profiler */
-       public static $__instance = null; // do not call this outside Profiler and ProfileSection
+       // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
+       /** @var Profiler Do not call this outside Profiler and ProfileSection */
+       public static $__instance = null;
+       // @codingStandardsIgnoreEnd
 
        /**
         * @param array $params
index 6911d4b..38a6436 100644 (file)
@@ -105,6 +105,7 @@ class ProfilerSimpleDB extends ProfilerStandard {
                        if ( $useTrx ) {
                                $dbw->commit();
                        }
-               } catch ( DBError $e ) {}
+               } catch ( DBError $e ) {
+               }
        }
 }
index 6de97ba..1d3b65d 100644 (file)
@@ -30,16 +30,37 @@ class ProfilerStub extends Profiler {
        public function isStub() {
                return true;
        }
+
        public function isPersistent() {
                return false;
        }
-       public function profileIn( $fn ) {}
-       public function profileOut( $fn ) {}
-       public function getOutput() {}
-       public function close() {}
-       public function logData() {}
-       public function getCurrentSection() { return ''; }
-       public function transactionWritingIn( $server, $db, $id = '' ) {}
-       public function transactionWritingOut( $server, $db, $id = '' ) {}
-       public function getRawData() { return array(); }
+
+       public function profileIn( $fn ) {
+       }
+
+       public function profileOut( $fn ) {
+       }
+
+       public function getOutput() {
+       }
+
+       public function close() {
+       }
+
+       public function logData() {
+       }
+
+       public function getCurrentSection() {
+               return '';
+       }
+
+       public function transactionWritingIn( $server, $db, $id = '' ) {
+       }
+
+       public function transactionWritingOut( $server, $db, $id = '' ) {
+       }
+
+       public function getRawData() {
+               return array();
+       }
 }
index c2e5b03..02a8d7e 100644 (file)
@@ -77,15 +77,22 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
 
                if ( $attribs['rc_type'] == RC_LOG ) {
                        $targetText = $rc->getTitle()->getPrefixedText();
-                       $comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $actionComment ) );
+                       $comment = self::cleanupForIRC( str_replace(
+                               "[[$targetText]]",
+                               "[[\00302$targetText\00310]]",
+                               $actionComment
+                       ) );
                        $flag = $attribs['rc_log_action'];
                } else {
                        $comment = self::cleanupForIRC( $attribs['rc_comment'] );
                        $flag = '';
-                       if ( !$attribs['rc_patrolled'] && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+                       if ( !$attribs['rc_patrolled']
+                               && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol )
+                       ) {
                                $flag .= '!';
                        }
-                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
+                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" )
+                               . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
                }
 
                if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwikis ) {
index e5077a2..3f17bcd 100644 (file)
@@ -38,7 +38,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
         * @see RCFeedFormatter::getLine
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgCanonicalServer, $wgScriptPath;
+               global $wgCanonicalServer, $wgServerName, $wgScriptPath;
                $attrib = $rc->getAttributes();
 
                $packet = array(
@@ -120,6 +120,8 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                }
 
                $packet['server_url'] = $wgCanonicalServer;
+               $packet['server_name'] = $wgServerName;
+
                $packet['server_script_path'] = $wgScriptPath ?: '/';
                $packet['wiki'] = wfWikiID();
 
index 994812b..680bd99 100644 (file)
  *    https://www.mediawiki.org/wiki/ResourceLoader
  */
 class ResourceLoader {
-
-       /**
-        * @var int
-        */
+       /** @var int */
        protected static $filterCacheVersion = 7;
-       /**
-        * @var array
-        */
+
+       /** @var array */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
-       /**
-        * @var array Module name/ResourceLoaderModule object pairs
-        */
+       /** @var array Module name/ResourceLoaderModule object pairs */
        protected $modules = array();
 
-       /**
-        * @var array Associative array mapping module name to info associative array
-        */
+       /** @var array Associative array mapping module name to info associative array */
        protected $moduleInfos = array();
 
        /**
@@ -55,14 +47,10 @@ class ResourceLoader {
         */
        protected $testModuleNames = array();
 
-       /**
-        * @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) )
-        */
+       /** @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
        protected $sources = array();
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        protected $hasErrors = false;
 
        /**
@@ -225,7 +213,10 @@ class ResourceLoader {
                wfProfileIn( __METHOD__ );
 
                // Add 'local' source first
-               $this->addSource( 'local', array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) ) );
+               $this->addSource(
+                       'local',
+                       array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) )
+               );
 
                // Add other sources
                $this->addSource( $wgResourceLoaderSources );
@@ -275,7 +266,8 @@ class ResourceLoader {
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
                                wfProfileOut( __METHOD__ );
-                               throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
+                               throw new MWException( "ResourceLoader module name '$name' is invalid, "
+                                       . "see ResourceLoader::isValidModuleName()" );
                        }
 
                        // Attach module
@@ -304,7 +296,9 @@ class ResourceLoader {
                global $IP, $wgEnableJavaScriptTest;
 
                if ( $wgEnableJavaScriptTest !== true ) {
-                       throw new MWException( 'Attempt to register JavaScript test modules but <code>$wgEnableJavaScriptTest</code> is false. Edit your <code>LocalSettings.php</code> to enable it.' );
+                       throw new MWException( 'Attempt to register JavaScript test modules '
+                               . 'but <code>$wgEnableJavaScriptTest</code> is false. '
+                               . 'Edit your <code>LocalSettings.php</code> to enable it.' );
                }
 
                wfProfileIn( __METHOD__ );
@@ -325,7 +319,8 @@ class ResourceLoader {
                        $module['dependencies'][] = 'test.mediawiki.qunit.testrunner';
                }
 
-               $testModules['qunit'] = ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
+               $testModules['qunit'] =
+                       ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
 
                foreach ( $testModules as $id => $names ) {
                        // Register test modules
@@ -395,10 +390,12 @@ class ResourceLoader {
         * @return array
         */
        public function getTestModuleNames( $framework = 'all' ) {
-               /// @todo api siteinfo prop testmodulenames modulenames
+               /** @todo api siteinfo prop testmodulenames modulenames */
                if ( $framework == 'all' ) {
                        return $this->testModuleNames;
-               } elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
+               } elseif ( isset( $this->testModuleNames[$framework] )
+                       && is_array( $this->testModuleNames[$framework] )
+               ) {
                        return $this->testModuleNames[$framework];
                } else {
                        return array();
@@ -763,7 +760,10 @@ class ResourceLoader {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
+                               wfDebugLog(
+                                       'resourceloader',
+                                       __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e"
+                               );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $exceptions .= self::formatException( $e );
@@ -795,9 +795,13 @@ class ResourceLoader {
                                                $scripts = $module->getScriptURLsForDebug( $context );
                                        } else {
                                                $scripts = $module->getScript( $context );
-                                               // rtrim() because there are usually a few line breaks after the last ';'.
-                                               // A new line at EOF, a new line added by ResourceLoaderFileModule::readScriptFiles, etc.
-                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( rtrim( $scripts ), -1 ) !== ';' ) {
+                                               // rtrim() because there are usually a few line breaks
+                                               // after the last ';'. A new line at EOF, a new line
+                                               // added by ResourceLoaderFileModule::readScriptFiles, etc.
+                                               if ( is_string( $scripts )
+                                                       && strlen( $scripts )
+                                                       && substr( rtrim( $scripts ), -1 ) !== ';'
+                                               ) {
                                                        // Append semicolon to prevent weird bugs caused by files not
                                                        // terminating their statements right (bug 27054)
                                                        $scripts .= ";\n";
@@ -904,6 +908,12 @@ class ResourceLoader {
                        if ( count( $states ) ) {
                                $out .= self::makeLoaderStateScript( $states );
                        }
+               } else {
+                       if ( count( $states ) ) {
+                               $exceptions .= self::makeComment(
+                                       'Problematic modules: ' . FormatJson::encode( $states, ResourceLoader::inDebugMode() )
+                               );
+                       }
                }
 
                if ( !$context->getDebug() ) {
@@ -1049,7 +1059,9 @@ class ResourceLoader {
         * @param string $script JavaScript code
         * @return string
         */
-       public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script ) {
+       public static function makeCustomLoaderScript( $name, $version, $dependencies,
+               $group, $source, $script
+       ) {
                $script = str_replace( "\n", "\n\t", trim( $script ) );
                return Xml::encodeJsCall(
                        "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
@@ -1212,9 +1224,12 @@ class ResourceLoader {
         * @param array $extraQuery Extra query parameters to add
         * @return string URL to load.php. May be protocol-relative (if $wgLoadScript is procol-relative)
         */
-       public static function makeLoaderURL( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderURL( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                global $wgLoadScript;
+
                $query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
                        $only, $printable, $handheld, $extraQuery
                );
@@ -1241,8 +1256,10 @@ class ResourceLoader {
         *
         * @return array
         */
-       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                $query = array(
                        'modules' => self::makePackedModulesString( $modules ),
                        'lang' => $lang,
index 63ec5de..9013e2b 100644 (file)
@@ -27,7 +27,6 @@
  * of a specific loader request
  */
 class ResourceLoaderContext {
-
        /* Protected Members */
 
        protected $resourceLoader;
@@ -109,7 +108,8 @@ class ResourceLoaderContext {
        }
 
        /**
-        * Return a dummy ResourceLoaderContext object suitable for passing into things that don't "really" need a context
+        * Return a dummy ResourceLoaderContext object suitable for passing into
+        * things that don't "really" need a context.
         * @return ResourceLoaderContext
         */
        public static function newDummyContext() {
index 61fb111..382bdd9 100644 (file)
  * ResourceLoader module based on local JavaScript/CSS files.
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
-
        /* Protected Members */
 
        /** @var string Local base path, see __construct() */
        protected $localBasePath = '';
+
        /** @var string Remote base path, see __construct() */
        protected $remoteBasePath = '';
+
        /**
         * @var array List of paths to JavaScript files to always include
         * @par Usage:
@@ -41,6 +42,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $scripts = array();
+
        /**
         * @var array List of JavaScript files to include when using a specific language
         * @par Usage:
@@ -49,6 +51,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $languageScripts = array();
+
        /**
         * @var array List of JavaScript files to include when using a specific skin
         * @par Usage:
@@ -57,6 +60,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $skinScripts = array();
+
        /**
         * @var array List of paths to JavaScript files to include in debug mode
         * @par Usage:
@@ -65,6 +69,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $debugScripts = array();
+
        /**
         * @var array List of paths to JavaScript files to include in the startup module
         * @par Usage:
@@ -73,6 +78,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $loaderScripts = array();
+
        /**
         * @var array List of paths to CSS files to always include
         * @par Usage:
@@ -81,6 +87,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $styles = array();
+
        /**
         * @var array List of paths to CSS files to include when using specific skins
         * @par Usage:
@@ -89,6 +96,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $skinStyles = array();
+
        /**
         * @var array List of modules this module depends on
         * @par Usage:
@@ -97,6 +105,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $dependencies = array();
+
        /**
         * @var array List of message keys used by this module
         * @par Usage:
@@ -105,14 +114,19 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $messages = array();
+
        /** @var string Name of group to load this module in */
        protected $group;
+
        /** @var string Position on the page to load this module at */
        protected $position = 'bottom';
+
        /** @var bool Link to raw files in debug mode */
        protected $debugRaw = true;
+
        /** @var bool Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+
        protected $targets = array( 'desktop' );
 
        /**
@@ -129,6 +143,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $modifiedTime = array();
+
        /**
         * @var array Place where readStyleFile() tracks file dependencies
         * @par Usage:
@@ -809,7 +824,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $result = $compiler->cachedCompile( $source );
 
                if ( !is_array( $result ) ) {
-                       throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
+                       throw new MWException( 'LESS compiler result has type '
+                               . gettype( $result ) . '; array expected.' );
                }
 
                $this->localFileRefs += array_keys( $result['files'] );
index 819bf5a..9ddd184 100644 (file)
@@ -26,7 +26,6 @@
  * Abstraction for resource loader modules, with name registration and maxage functionality.
  */
 abstract class ResourceLoaderModule {
-
        # Type of resource
        const TYPE_SCRIPTS = 'scripts';
        const TYPE_STYLES = 'styles';
@@ -441,6 +440,8 @@ abstract class ResourceLoaderModule {
        /**
         * Helper method for calculating when this module's definition summary was last changed.
         *
+        * @since 1.23
+        *
         * @return int UNIX timestamp or 0 if no definition summary was provided
         *  by getDefinitionSummary()
         */
@@ -474,7 +475,8 @@ abstract class ResourceLoaderModule {
                        return $data;
                }
 
-               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module {$this->getName()} in context {$context->getHash()}: $hash." );
+               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module "
+                       . "{$this->getName()} in context {$context->getHash()}: $hash." );
 
                $timestamp = time();
                $cache->set( $key, $timestamp );
@@ -505,6 +507,8 @@ abstract class ResourceLoaderModule {
         * contain arrays and scalars as values (avoid object instances) which means
         * it requires abstraction.
         *
+        * @since 1.23
+        *
         * @return array|null
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
index d0f0541..f9c5057 100644 (file)
@@ -44,8 +44,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                }
 
                global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
-                       $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
-                       $wgVariantArticlePath, $wgActionPaths, $wgVersion,
+                       $wgArticlePath, $wgScriptPath, $wgServer, $wgServerName,
+                       $wgContLang, $wgVariantArticlePath, $wgActionPaths, $wgVersion,
                        $wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
                        $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
                        $wgCookiePrefix, $wgResourceLoaderMaxQueryLength,
@@ -85,6 +85,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // becoming [] instead of {} in JS (bug 34604)
                        'wgActionPaths' => (object)$wgActionPaths,
                        'wgServer' => $wgServer,
+                       'wgServerName' => $wgServerName,
                        'wgUserLanguage' => $context->getLanguage(),
                        'wgContentLanguage' => $wgContLang->getCode(),
                        'wgVersion' => $wgVersion,
index dcec5dd..7e0e45d 100644 (file)
  * 'archive' table for traditionally-deleted revisions that have an
  * ar_rev_id saved.
  *
- * See RevDel_RevisionItem and RevDel_ArchivedRevisionItem for items.
+ * See RevDelRevisionItem and RevDelArchivedRevisionItem for items.
  */
-class RevDel_RevisionList extends RevDel_List {
-       var $currentRevId;
+class RevDelRevisionList extends RevDelList {
+       /** @var int */
+       protected $currentRevId;
 
        public function getType() {
                return 'revision';
@@ -80,7 +81,7 @@ class RevDel_RevisionList extends RevDel_List {
                }
 
                // Check if any requested revisions are available fully deleted.
-               $archived = $db->select( array( 'archive' ), '*',
+               $archived = $db->select( array( 'archive' ), Revision::selectArchiveFields(),
                        array(
                                'ar_rev_id' => $ids
                        ),
@@ -108,12 +109,12 @@ class RevDel_RevisionList extends RevDel_List {
 
        public function newItem( $row ) {
                if ( isset( $row->rev_id ) ) {
-                       return new RevDel_RevisionItem( $this, $row );
+                       return new RevDelRevisionItem( $this, $row );
                } elseif ( isset( $row->ar_rev_id ) ) {
-                       return new RevDel_ArchivedRevisionItem( $this, $row );
+                       return new RevDelArchivedRevisionItem( $this, $row );
                } else {
                        // This shouldn't happen. :)
-                       throw new MWException( 'Invalid row type in RevDel_RevisionList' );
+                       throw new MWException( 'Invalid row type in RevDelRevisionList' );
                }
        }
 
@@ -146,8 +147,8 @@ class RevDel_RevisionList extends RevDel_List {
 /**
  * Item class for a live revision table row
  */
-class RevDel_RevisionItem extends RevDel_Item {
-       var $revision;
+class RevDelRevisionItem extends RevDelItem {
+       protected $revision;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -225,7 +226,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -248,7 +249,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
@@ -308,7 +309,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
-class RevDel_ArchiveList extends RevDel_RevisionList {
+class RevDelArchiveList extends RevDelRevisionList {
        public function getType() {
                return 'archive';
        }
@@ -326,7 +327,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
                foreach ( $this->ids as $id ) {
                        $timestamps[] = $db->timestamp( $id );
                }
-               return $db->select( 'archive', '*',
+               return $db->select( 'archive', Revision::selectArchiveFields(),
                                array(
                                        'ar_namespace' => $this->title->getNamespace(),
                                        'ar_title' => $this->title->getDBkey(),
@@ -338,7 +339,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchiveItem( $this, $row );
+               return new RevDelArchiveItem( $this, $row );
        }
 
        public function doPreCommitUpdates() {
@@ -353,9 +354,9 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
 /**
  * Item class for a archive table row
  */
-class RevDel_ArchiveItem extends RevDel_RevisionItem {
+class RevDelArchiveItem extends RevDelRevisionItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
        }
@@ -436,11 +437,11 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
 
 /**
  * Item class for a archive table row by ar_rev_id -- actually
- * used via RevDel_RevisionList.
+ * used via RevDelRevisionList.
  */
-class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
+class RevDelArchivedRevisionItem extends RevDelArchiveItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
 
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
@@ -469,7 +470,16 @@ class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
 /**
  * List for oldimage table items
  */
-class RevDel_FileList extends RevDel_List {
+class RevDelFileList extends RevDelList {
+       /** @var array */
+       protected $storeBatch;
+
+       /** @var array */
+       protected $deleteBatch;
+
+       /** @var array */
+       protected $cleanupBatch;
+
        public function getType() {
                return 'oldimage';
        }
@@ -486,8 +496,6 @@ class RevDel_FileList extends RevDel_List {
                return File::DELETED_FILE;
        }
 
-       var $storeBatch, $deleteBatch, $cleanupBatch;
-
        /**
         * @param DatabaseBase $db
         * @return mixed
@@ -510,7 +518,7 @@ class RevDel_FileList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_FileItem( $this, $row );
+               return new RevDelFileItem( $this, $row );
        }
 
        public function clearFileOps() {
@@ -568,12 +576,9 @@ class RevDel_FileList extends RevDel_List {
 /**
  * Item class for an oldimage table row
  */
-class RevDel_FileItem extends RevDel_Item {
-
-       /**
-        * @var File
-        */
-       var $file;
+class RevDelFileItem extends RevDelItem {
+       /** @var File */
+       protected $file;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -657,7 +662,7 @@ class RevDel_FileItem extends RevDel_Item {
 
        /**
         * Get the link to the file.
-        * Overridden by RevDel_ArchivedFileItem.
+        * Overridden by RevDelArchivedFileItem.
         * @return string
         */
        protected function getLink() {
@@ -782,7 +787,7 @@ class RevDel_FileItem extends RevDel_Item {
 /**
  * List for filearchive table items
  */
-class RevDel_ArchivedFileList extends RevDel_FileList {
+class RevDelArchivedFileList extends RevDelFileList {
        public function getType() {
                return 'filearchive';
        }
@@ -810,16 +815,16 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchivedFileItem( $this, $row );
+               return new RevDelArchivedFileItem( $this, $row );
        }
 }
 
 /**
  * Item class for a filearchive table row
  */
-class RevDel_ArchivedFileItem extends RevDel_FileItem {
+class RevDelArchivedFileItem extends RevDelFileItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->file = ArchivedFile::newFromRow( $row );
        }
 
@@ -884,7 +889,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
 /**
  * List for logging table items
  */
-class RevDel_LogList extends RevDel_List {
+class RevDelLogList extends RevDelList {
        public function getType() {
                return 'logging';
        }
@@ -921,7 +926,20 @@ class RevDel_LogList extends RevDel_List {
         */
        public function doQuery( $db ) {
                $ids = array_map( 'intval', $this->ids );
-               return $db->select( 'logging', '*',
+               return $db->select( 'logging', array(
+                               'log_id',
+                               'log_type',
+                               'log_action',
+                               'log_timestamp',
+                               'log_user',
+                               'log_user_text',
+                               'log_namespace',
+                               'log_title',
+                               'log_page',
+                               'log_comment',
+                               'log_params',
+                               'log_deleted'
+                       ),
                        array( 'log_id' => $ids ),
                        __METHOD__,
                        array( 'ORDER BY' => 'log_id DESC' )
@@ -929,7 +947,7 @@ class RevDel_LogList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_LogItem( $this, $row );
+               return new RevDelLogItem( $this, $row );
        }
 
        public function getSuppressBit() {
@@ -952,7 +970,7 @@ class RevDel_LogList extends RevDel_List {
 /**
  * Item class for a logging table row
  */
-class RevDel_LogItem extends RevDel_Item {
+class RevDelLogItem extends RevDelItem {
        public function getIdField() {
                return 'log_id';
        }
@@ -1024,7 +1042,9 @@ class RevDel_LogItem extends RevDel_Item {
                // User links and action text
                $action = $formatter->getActionText();
                // Comment
-               $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
+               $comment = $this->list->getLanguage()->getDirMark()
+                       . Linker::commentBlock( $this->row->log_comment );
+
                if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
@@ -1040,9 +1060,15 @@ class RevDel_LogItem extends RevDel_Item {
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
                );
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) ? array( 'actionhidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
+                       ? array( 'userhidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
+                       ? array( 'commenthidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
+                       ? array( 'actionhidden' => '' )
+                       : array();
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        ApiQueryLogEvents::addLogParams(
index e326dce..086db3a 100644 (file)
 /**
  * Abstract base class for a list of deletable items. The list class
  * needs to be able to make a query from a set of identifiers to pull
- * relevant rows, to return RevDel_Item subclasses wrapping them, and
+ * relevant rows, to return RevDelItem subclasses wrapping them, and
  * to wrap bulk update operations.
  */
-abstract class RevDel_List extends RevisionListBase {
+abstract class RevDelList extends RevisionListBase {
        function __construct( IContextSource $context, Title $title, array $ids ) {
                parent::__construct( $context, $title );
                $this->ids = $ids;
@@ -105,7 +105,9 @@ abstract class RevDel_List extends RevisionListBase {
                        $status->itemStatuses = array();
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
@@ -315,7 +317,7 @@ abstract class RevDel_List extends RevisionListBase {
 /**
  * Abstract base class for deletable items
  */
-abstract class RevDel_Item extends RevisionItemBase {
+abstract class RevDelItem extends RevisionItemBase {
        /**
         * Returns true if the item is "current", and the operation to set the given
         * bits can't be executed for that reason
index ecfe1d8..e42301b 100644 (file)
 class RevisionDeleter {
        /** List of known revdel types, with their corresponding list classes */
        private static $allowedTypes = array(
-               'revision' => 'RevDel_RevisionList',
-               'archive' => 'RevDel_ArchiveList',
-               'oldimage' => 'RevDel_FileList',
-               'filearchive' => 'RevDel_ArchivedFileList',
-               'logging' => 'RevDel_LogList',
+               'revision' => 'RevDelRevisionList',
+               'archive' => 'RevDelArchiveList',
+               'oldimage' => 'RevDelFileList',
+               'filearchive' => 'RevDelArchivedFileList',
+               'logging' => 'RevDelLogList',
        );
 
        /** Type map to support old log entries */
@@ -77,7 +77,7 @@ class RevisionDeleter {
         * @param IContextSource $context
         * @param Title $title
         * @param array $ids
-        * @return RevDel_List
+        * @return RevDelList
         */
        public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
                $typeName = self::getCanonicalTypeName( $typeName );
index 827d8c3..907047e 100644 (file)
  * @ingroup Search
  */
 class SearchEngine {
-       var $limit = 10;
-       var $offset = 0;
-       var $prefix = '';
-       var $searchTerms = array();
-       var $namespaces = array( NS_MAIN );
+       /** @var string */
+       public $prefix = '';
+
+       /** @var int[] */
+       public $namespaces = array( NS_MAIN );
+
+       /** @var int */
+       protected $limit = 10;
+
+       /** @var int */
+       protected $offset = 0;
+
+       /** @var array|string */
+       protected $searchTerms = array();
+
+       /** @var bool */
        protected $showSuggestion = true;
 
        /** @var array Feature values */
@@ -106,8 +117,9 @@ class SearchEngine {
        }
 
        /**
-        * Transform search term in cases when parts of the query came as different GET params (when supported)
-        * e.g. for prefix queries: search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
+        * Transform search term in cases when parts of the query came as different
+        * GET params (when supported), e.g. for prefix queries:
+        * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
         */
        function transformSearchTerm( $term ) {
                return $term;
@@ -148,7 +160,10 @@ class SearchEngine {
                $allSearchTerms = array( $searchterm );
 
                if ( $wgContLang->hasVariants() ) {
-                       $allSearchTerms = array_merge( $allSearchTerms, $wgContLang->autoConvertToAllVariants( $searchterm ) );
+                       $allSearchTerms = array_merge(
+                               $allSearchTerms,
+                               $wgContLang->autoConvertToAllVariants( $searchterm )
+                       );
                }
 
                $titleResult = null;
@@ -523,6 +538,7 @@ class SearchEngine {
         */
        public static function getOpenSearchTemplate() {
                global $wgOpenSearchTemplate, $wgCanonicalServer;
+
                if ( $wgOpenSearchTemplate ) {
                        return $wgOpenSearchTemplate;
                } else {
@@ -530,7 +546,9 @@ class SearchEngine {
                        if ( !$ns ) {
                                $ns = "0";
                        }
-                       return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
+
+                       return $wgCanonicalServer . wfScript( 'api' )
+                               . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
                }
        }
 
index 5e734fe..b8b2bae 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Search
  */
 class SearchHighlighter {
-       var $mCleanWikitext = true;
+       protected $mCleanWikitext = true;
 
        function __construct( $cleanupWikitext = true ) {
                $this->mCleanWikitext = $cleanupWikitext;
@@ -40,11 +40,11 @@ class SearchHighlighter {
         * @param array $terms Terms to highlight (unescaped)
         * @param int $contextlines
         * @param int $contextchars
-        * @return tring
+        * @return string
         */
        public function highlightText( $text, $terms, $contextlines, $contextchars ) {
-               global $wgContLang;
-               global $wgSearchHighlightBoundaries;
+               global $wgContLang, $wgSearchHighlightBoundaries;
+
                $fname = __METHOD__;
 
                if ( $text == '' ) {
@@ -138,7 +138,11 @@ class SearchHighlighter {
                foreach ( $terms as $index => $term ) {
                        // manually do upper/lowercase stuff for utf-8 since PHP won't do it
                        if ( preg_match( '/[\x80-\xff]/', $term ) ) {
-                               $terms[$index] = preg_replace_callback( '/./us', array( $this, 'caseCallback' ), $terms[$index] );
+                               $terms[$index] = preg_replace_callback(
+                                       '/./us',
+                                       array( $this, 'caseCallback' ),
+                                       $terms[$index]
+                               );
                        } else {
                                $terms[$index] = $term;
                        }
@@ -229,7 +233,12 @@ class SearchHighlighter {
                        if ( $len < $targetchars - 20 ) {
                                // complete this line
                                if ( $len < strlen( $all[$index] ) ) {
-                                       $extended[$index] = $this->extract( $all[$index], $offsets[$index], $offsets[$index] + $targetchars, $offsets[$index] );
+                                       $extended[$index] = $this->extract(
+                                               $all[$index],
+                                               $offsets[$index],
+                                               $offsets[$index] + $targetchars,
+                                               $offsets[$index]
+                                       );
                                        $len = strlen( $extended[$index] );
                                }
 
@@ -254,7 +263,9 @@ class SearchHighlighter {
                foreach ( $snippets as $index => $line ) {
                        if ( $last == - 1 ) {
                                $extract .= $line; // first line
-                       } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
+                       } elseif ( $last + 1 == $index
+                               && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] )
+                       ) {
                                $extract .= " " . $line; // continous lines
                        } else {
                                $extract .= '<b> ... </b>' . $line;
@@ -360,7 +371,13 @@ class SearchHighlighter {
                $s = max( 0, $point - $tolerance );
                $l = min( strlen( $text ), $point + $tolerance ) - $s;
                $m = array();
-               if ( preg_match( '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/', substr( $text, $s, $l ), $m, PREG_OFFSET_CAPTURE ) ) {
+
+               if ( preg_match(
+                       '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/',
+                       substr( $text, $s, $l ),
+                       $m,
+                       PREG_OFFSET_CAPTURE
+               ) ) {
                        return $m[0][1] + $s + $offset;
                } else {
                        // check if point is on a valid first UTF8 char
@@ -373,6 +390,7 @@ class SearchHighlighter {
                                }
                                $char = ord( $text[$point] );
                        }
+
                        return $point;
 
                }
@@ -444,7 +462,11 @@ class SearchHighlighter {
                $text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
                $text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
                $text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
-               $text = preg_replace_callback( "/\\[\\[([^|]+\\|)(.*?)\\]\\]/", array( $this, 'linkReplace' ), $text );
+               $text = preg_replace_callback(
+                       "/\\[\\[([^|]+\\|)(.*?)\\]\\]/",
+                       array( $this, 'linkReplace' ),
+                       $text
+               );
                // $text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
                $text = preg_replace( "/<\/?[^>]+>/", "", $text );
                $text = preg_replace( "/'''''/", "", $text );
index ed76ff8..4960c42 100644 (file)
@@ -34,7 +34,10 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchText( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -46,7 +49,10 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchTitle( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index cc20d02..77a0c43 100644 (file)
@@ -29,8 +29,9 @@
  * @ingroup Search
  */
 class SearchMySQL extends SearchDatabase {
-       var $strictMatching = true;
-       static $mMinSearchLength;
+       protected $strictMatching = true;
+
+       private static $mMinSearchLength;
 
        /**
         * Parse the user's query and transform it into an SQL fragment which will
@@ -43,6 +44,7 @@ class SearchMySQL extends SearchDatabase {
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
+
                $lc = $this->legalSearchChars(); // Minus format chars
                $searchon = '';
                $this->searchTerms = array();
@@ -52,7 +54,9 @@ class SearchMySQL extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index c944152..4cfcec3 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup Search
  */
 class SearchOracle extends SearchDatabase {
-
        private $reservedWords = array(
                'ABOUT' => 1,
                'ACCUM' => 1,
@@ -70,7 +69,10 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -85,7 +87,10 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index 6b1a6b2..62fb236 100644 (file)
@@ -50,7 +50,9 @@ class SearchSqlite extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index 2a86b31..4854bcb 100644 (file)
@@ -33,7 +33,6 @@
  * @ingroup Site
  */
 class MediaWikiSite extends Site {
-
        const PATH_FILE = 'file_path';
        const PATH_PAGE = 'page_path';
 
@@ -76,14 +75,16 @@ class MediaWikiSite extends Site {
        }
 
        /**
-        * Returns the normalized form of the given page title, using the normalization rules of the given site.
-        * If the given title is a redirect, the redirect weill be resolved and the redirect target is returned.
+        * Returns the normalized form of the given page title, using the
+        * normalization rules of the given site. If the given title is a redirect,
+        * the redirect weill be resolved and the redirect target is returned.
         *
-        * @note  : This actually makes an API request to the remote site, so beware that this function is slow and depends
-        *          on an external service.
+        * @note This actually makes an API request to the remote site, so beware
+        *   that this function is slow and depends on an external service.
         *
-        * @note  : If MW_PHPUNIT_TEST is defined, the call to the external site is skipped, and the title
-        *          is normalized using the local normalization rules as implemented by the Title class.
+        * @note If MW_PHPUNIT_TEST is defined, the call to the external site is
+        *   skipped, and the title is normalized using the local normalization
+        *   rules as implemented by the Title class.
         *
         * @see Site::normalizePageName
         *
@@ -103,8 +104,10 @@ class MediaWikiSite extends Site {
 
                // Go on call the external site
                if ( defined( 'MW_PHPUNIT_TEST' ) ) {
-                       // If the code is under test, don't call out to other sites, just normalize locally.
-                       // Note: this may cause results to be inconsistent with the actual normalization used by the respective remote site!
+                       // If the code is under test, don't call out to other sites, just
+                       // normalize locally.
+                       // Note: this may cause results to be inconsistent with the actual
+                       // normalization used by the respective remote site!
 
                        $t = Title::newFromText( $pageName );
                        return $t->getPrefixedText();
@@ -152,12 +155,14 @@ class MediaWikiSite extends Site {
                $page = static::extractPageRecord( $data, $pageName );
 
                if ( isset( $page['missing'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! "
+                               . $ret );
                        return false;
                }
 
                if ( isset( $page['invalid'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! "
+                               . $ret );
                        return false;
                }
 
@@ -348,5 +353,4 @@ class MediaWikiSite extends Site {
 
                return $filePath;
        }
-
 }
index 59230c7..e3559f5 100644 (file)
@@ -27,7 +27,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class Site implements Serializable {
-
        const TYPE_UNKNOWN = 'unknown';
        const TYPE_MEDIAWIKI = 'mediawiki';
 
@@ -340,11 +339,12 @@ class Site implements Serializable {
        }
 
        /**
-        * Returns the main path type, that is the type of the path that should generally be used to construct links
-        * to the target site.
+        * Returns the main path type, that is the type of the path that should
+        * generally be used to construct links to the target site.
         *
-        * This default implementation returns Site::PATH_LINK as the default path type. Subclasses can override this
-        * to define a different default path type, or return false to disable site links.
+        * This default implementation returns Site::PATH_LINK as the default path
+        * type. Subclasses can override this to define a different default path
+        * type, or return false to disable site links.
         *
         * @since 1.21
         *
@@ -541,7 +541,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getInterwikiIds() {
-               return array_key_exists( self::ID_INTERWIKI, $this->localIds ) ? $this->localIds[self::ID_INTERWIKI] : array();
+               return array_key_exists( self::ID_INTERWIKI, $this->localIds )
+                       ? $this->localIds[self::ID_INTERWIKI]
+                       : array();
        }
 
        /**
@@ -553,7 +555,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getNavigationIds() {
-               return array_key_exists( self::ID_EQUIVALENT, $this->localIds ) ? $this->localIds[self::ID_EQUIVALENT] : array();
+               return array_key_exists( self::ID_EQUIVALENT, $this->localIds )
+                       ? $this->localIds[self::ID_EQUIVALENT] :
+                       array();
        }
 
        /**
@@ -693,10 +697,10 @@ class Site implements Serializable {
                $this->setForward( $fields['forward'] );
                $this->setInternalId( $fields['internalid'] );
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteObject extends Site {}
+class SiteObject extends Site {
+}
index 6992450..dfe4ec5 100644 (file)
@@ -27,7 +27,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteList extends GenericArrayObject {
-
        /**
         * Internal site identifiers pointing to their sites offset value.
         *
@@ -350,10 +349,10 @@ class SiteList extends GenericArrayObject {
 
                return $serializationData;
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteArray extends SiteList {}
+class SiteArray extends SiteList {
+}
index d14569a..f382d98 100644 (file)
@@ -29,7 +29,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteSQLStore implements SiteStore {
-
        /**
         * @since 1.21
         *
@@ -169,7 +168,10 @@ class SiteSQLStore implements SiteStore {
                }
 
                if ( $siteRow->hasField( 'language' ) ) {
-                       $site->setLanguageCode( $siteRow->getField( 'language' ) === '' ? null : $siteRow->getField( 'language' ) );
+                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
+                               ? null
+                               : $siteRow->getField( 'language' )
+                       );
                }
 
                if ( $siteRow->hasField( 'source' ) ) {
@@ -504,5 +506,4 @@ class Sites extends SiteSQLStore {
        public function getSiteGroup( $group ) {
                return $this->getSites()->getGroup( $group );
        }
-
 }
index 7e108af..f7c95d1 100644 (file)
@@ -405,42 +405,42 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                global $wgRecentChangesFlags;
                $user = $context->getUser();
                # The legend showing what the letters and stuff mean
-               $legend = Xml::openElement( 'dl' ) . "\n";
+               $legend = Html::openElement( 'dl' ) . "\n";
                # Iterates through them and gets the messages for both letter and tooltip
                $legendItems = $wgRecentChangesFlags;
-               if ( !$user->useRCPatrol() ) {
+               if ( !( $user->useRCPatrol() || $user->useNPPatrol() ) ) {
                        unset( $legendItems['unpatrolled'] );
                }
-               foreach ( $legendItems as $key => $legendInfo ) { # generate items of the legend
-                       $label = $legendInfo['title'];
-                       $letter = $legendInfo['letter'];
-                       $cssClass = isset( $legendInfo['class'] ) ? $legendInfo['class'] : $key;
+               foreach ( $legendItems as $key => $item ) { # generate items of the legend
+                       $label = $item['title'];
+                       $letter = $item['letter'];
+                       $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
 
-                       $legend .= Xml::element( 'dt',
+                       $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
                        ) . "\n";
                        if ( $key === 'newpage' ) {
-                               $legend .= Xml::openElement( 'dd' );
+                               $legend .= Html::openElement( 'dd' );
                                $legend .= $context->msg( $label )->escaped();
                                $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Xml::closeElement( 'dd' ) . "\n";
+                               $legend .= Html::closeElement( 'dd' ) . "\n";
                        } else {
-                               $legend .= Xml::element( 'dd', array(),
+                               $legend .= Html::element( 'dd', array(),
                                        $context->msg( $label )->text()
                                ) . "\n";
                        }
                }
                # (+-123)
-               $legend .= Xml::tags( 'dt',
+               $legend .= Html::rawElement( 'dt',
                        array( 'class' => 'mw-plusminus-pos' ),
                        $context->msg( 'recentchanges-legend-plusminus' )->parse()
                ) . "\n";
-               $legend .= Xml::element(
+               $legend .= Html::element(
                        'dd',
                        array( 'class' => 'mw-changeslist-legend-plusminus' ),
                        $context->msg( 'recentchanges-label-plusminus' )->text()
                ) . "\n";
-               $legend .= Xml::closeElement( 'dl' ) . "\n";
+               $legend .= Html::closeElement( 'dl' ) . "\n";
 
                # Collapsibility
                $legend =
index 2305f21..dd22769 100644 (file)
@@ -407,17 +407,21 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, but not for everyone
         *
+        * @param User|null $user User object to use or null for $wgUser
         * @return array ( string => Specialpage )
         */
-       public static function getRestrictedPages() {
-               global $wgUser;
+       public static function getRestrictedPages( User $user = null ) {
                $pages = array();
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
                foreach ( self::getList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if (
                                $page->isListed()
                                && $page->isRestricted()
-                               && $page->userCanExecute( $wgUser )
+                               && $page->userCanExecute( $user )
                        ) {
                                $pages[$name] = $page;
                        }
index d963677..c42c089 100644 (file)
@@ -31,7 +31,6 @@
  * @ingroup SpecialPage
  */
 class ActiveUsersPager extends UsersPager {
-
        /**
         * @var FormOptions
         */
@@ -194,20 +193,31 @@ class ActiveUsersPager extends UsersPager {
                $self = $this->getTitle();
                $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
 
-               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
+               # Form tag
+               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
                $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
+               # Username field
                $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field
+                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
 
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
-                       'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />';
-
-               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom
+               $out .= Xml::checkLabel(
+                       $this->msg( 'activeusers-hidesysops' )->text(),
+                       'hidesysops',
+                       'hidesysops',
+                       $this->opts->getValue( 'hidesysops' ),
+                       array( 'tabindex' => 3 )
+               ) . '<br />';
+
+               # Submit button and form bottom
+               $out .= Xml::submitButton(
+                       $this->msg( 'allpagessubmit' )->text(),
+                       array( 'tabindex' => 4 )
+               ) . "\n";
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
 
index fe49cf2..11425e9 100644 (file)
@@ -35,30 +35,6 @@ class SpecialAllpages extends IncludableSpecialPage {
         */
        protected $maxPerPage = 345;
 
-       /**
-        * Maximum number of pages to show on single index subpage.
-        *
-        * @var int $maxLineCount
-        */
-       protected $maxLineCount = 100;
-
-       /**
-        * Maximum number of chars to show for an entry.
-        *
-        * @var int $maxPageLength
-        */
-       protected $maxPageLength = 70;
-
-       /**
-        * Maximum number of pages in a hierarchical ("top level") list.
-        *
-        * Traversal of the entire page list by spidering the top levels is thought
-        * to require O(N^3) DB CPU time where N is the number of pages on the wiki.
-        * See bug 56840. If this limit is exceeded, the behaviour becomes like a
-        * simple alphabetic pager.
-        */
-       protected $maxTopLevelPages = 50000;
-
        /**
         * Determines, which message describes the input field 'nsfrom'.
         *
@@ -206,157 +182,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
                }
 
-               global $wgMemc;
-               $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
-               $lines = $wgMemc->get( $key );
-
-               $count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
-
-               // Don't show a hierarchical list if the number of pages is very large,
-               // since generating it will cause a lot of scanning
-               if ( $count > $this->maxTopLevelPages ) {
-                       $this->showChunk( $namespace, $from, $to, $hideredirects );
-
-                       return;
-               }
-
-               $maxPerSubpage = intval( $count / $this->maxLineCount );
-               $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
-
-               if ( !is_array( $lines ) ) {
-                       $options = array( 'LIMIT' => 1 );
-                       $options['ORDER BY'] = 'page_title ASC';
-                       $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
-                       $lastTitle = $firstTitle;
-                       # This array is going to hold the page_titles in order.
-                       $lines = array( $firstTitle );
-                       # If we are going to show n rows, we need n+1 queries to find the relevant titles.
-                       $done = false;
-                       while ( !$done ) {
-                               // Fetch the last title of this chunk and the first of the next
-                               $chunk = ( $lastTitle === false )
-                                       ? array()
-                                       : array( 'page_title >= ' . $dbr->addQuotes( $lastTitle ) );
-                               $res = $dbr->select( 'page', /* FROM */
-                                       'page_title', /* WHAT */
-                                       array_merge( $where, $chunk ),
-                                       __METHOD__,
-                                       array( 'LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC' )
-                               );
-
-                               $s = $dbr->fetchObject( $res );
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                               } else {
-                                       // Final chunk, but ended prematurely. Go back and find the end.
-                                       $endTitle = $dbr->selectField( 'page', 'MAX(page_title)',
-                                               array_merge( $where, $chunk ),
-                                               __METHOD__ );
-                                       array_push( $lines, $endTitle );
-                                       $done = true;
-                               }
-
-                               $s = $res->fetchObject();
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                                       $lastTitle = $s->page_title;
-                               } else {
-                                       // This was a final chunk and ended exactly at the limit.
-                                       // Rare but convenient!
-                                       $done = true;
-                               }
-                               $res->free();
-                       }
-                       $wgMemc->add( $key, $lines, 3600 );
-               }
-
-               // If there are only two or less sections, don't even display them.
-               // Instead, display the first section directly.
-               if ( count( $lines ) <= 2 ) {
-                       if ( !empty( $lines ) ) {
-                               $this->showChunk( $namespace, $from, $to, $hideredirects );
-                       } else {
-                               $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
-                       }
-
-                       return;
-               }
-
-               # At this point, $lines should contain an even number of elements.
-               $out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-               while ( count( $lines ) > 0 ) {
-                       $inpoint = array_shift( $lines );
-                       $outpoint = array_shift( $lines );
-                       $out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
-               }
-               $out .= Xml::closeElement( 'table' );
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-
-               # Is there more?
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       if ( isset( $from ) || isset( $to ) ) {
-                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                                       '<tr>
-                                                       <td>' .
-                                       $nsForm .
-                                       '</td>
-                                                       <td class="mw-allpages-nav">' .
-                                       Linker::link( $this->getPageTitle(), $this->msg( 'allpages' )->escaped(),
-                                               array(), array(), 'known' ) .
-                                       "</td>
-                                               </tr>" .
-                                       Xml::closeElement( 'table' );
-                       } else {
-                               $out2 = $nsForm;
-                       }
-               }
-               $output->addHTML( $out2 . $out );
-       }
-
-       /**
-        * Show a line of "ABC to DEF" ranges of articles
-        *
-        * @param string $inpoint Lower limit of pagenames
-        * @param string $outpoint Upper limit of pagenames
-        * @param int $namespace (Default NS_MAIN)
-        * @param bool $hideRedirects Don't show redirects. Default: false
-        * @return string
-        */
-       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
-               // Use content language since page titles are considered to use content language
-               global $wgContLang;
-
-               $inpointf = str_replace( '_', ' ', $inpoint );
-               $outpointf = str_replace( '_', ' ', $outpoint );
-
-               // Don't let the length runaway
-               $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
-               $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
-
-               $queryParams = array(
-                       'from' => $inpoint,
-                       'to' => $outpoint,
-               );
-
-               if ( $namespace ) {
-                       $queryParams['namespace'] = $namespace;
-               }
-               if ( $hideRedirects ) {
-                       $queryParams['hideredirects'] = 1;
-               }
-
-               $url = $this->getPageTitle()->getLocalURL( $queryParams );
-               $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
-               $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
-
-               $out = $this->msg( 'alphaindexline' )->rawParams(
-                       "$inlink</td><td>",
-                       "</td><td>$outlink"
-               )->escaped();
-
-               return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
+               $this->showChunk( $namespace, $from, $to, $hideredirects );
        }
 
        /**
index 716bf80..8c46a93 100644 (file)
@@ -84,7 +84,8 @@ class SpecialBlock extends FormSpecialPage {
                        $this->getSkin()->setRelevantUser( $this->target );
                }
 
-               list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
+               list( $this->previousTarget, /*...*/ ) =
+                       Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
                $this->requestedHideUser = $request->getBool( 'wpHideUser' );
        }
 
@@ -129,7 +130,6 @@ class SpecialBlock extends FormSpecialPage {
                        'Target' => array(
                                'type' => 'text',
                                'label-message' => 'ipaddressorusername',
-                               'tabindex' => '1',
                                'id' => 'mw-bi-target',
                                'size' => '45',
                                'autofocus' => true,
@@ -140,7 +140,6 @@ class SpecialBlock extends FormSpecialPage {
                                'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
                                'label-message' => 'ipbexpiry',
                                'required' => true,
-                               'tabindex' => '2',
                                'options' => $suggestedDurations,
                                'other' => $this->msg( 'ipbother' )->text(),
                                'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
@@ -361,7 +360,10 @@ class SpecialBlock extends FormSpecialPage {
 
                # Link to unblock the specified user, or to a blank unblock form
                if ( $this->target instanceof User ) {
-                       $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
+                       $message = $this->msg(
+                               'ipb-unblock-addr',
+                               wfEscapeWikiText( $this->target->getName() )
+                       )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
                } else {
                        $message = $this->msg( 'ipb-unblock' )->parse();
@@ -451,7 +453,7 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Determine the target of the block, and the type of target
-        * TODO: should be in Block.php?
+        * @todo Should be in Block.php?
         * @param string $par subpage parameter passed to setup, or data value from
         *     the HTMLForm
         * @param WebRequest $request Optionally try and get data from a request too
@@ -765,7 +767,11 @@ class SpecialBlock extends FormSpecialPage {
 
                # Can't watch a rangeblock
                if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
-                       WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
+                       WatchAction::doWatch(
+                               Title::makeTitle( NS_USER, $target ),
+                               $performer,
+                               WatchedItem::IGNORE_USER_RIGHTS
+                       );
                }
 
                # Block constructor sanitizes certain block options on insert
@@ -969,7 +975,3 @@ class SpecialBlock extends FormSpecialPage {
                return 'users';
        }
 }
-
-# BC @since 1.18
-class IPBlockForm extends SpecialBlock {
-}
index 4c9a682..9170e3e 100644 (file)
@@ -27,8 +27,9 @@
  * @ingroup SpecialPage
  */
 class SpecialBlockList extends SpecialPage {
+       protected $target;
 
-       protected $target, $options;
+       protected $options;
 
        function __construct() {
                parent::__construct( 'BlockList' );
@@ -203,7 +204,11 @@ class SpecialBlockList extends SpecialPage {
                        foreach ( $otherBlockLink as $link ) {
                                $list .= Html::rawElement( 'li', array(), $link ) . "\n";
                        }
-                       $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
+                       $out->addHTML( Html::rawElement(
+                               'ul',
+                               array( 'class' => 'mw-ipblocklist-otherblocks' ),
+                               $list
+                       ) . "\n" );
                }
        }
 
@@ -471,11 +476,15 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
                }
 
                // Let folks pick an explicit limit not from our list, as long as it's a real numbr.
-               if ( !in_array( $value, $this->mParams['options'] ) && $value == intval( $value ) && $value > 0 ) {
+               if ( !in_array( $value, $this->mParams['options'] )
+                       && $value == intval( $value )
+                       && $value > 0
+               ) {
                        // This adds the explicitly requested limit value to the drop-down,
                        // then makes sure it's sorted correctly so when we output the list
                        // later, the custom option doesn't just show up last.
-                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] = intval( $value );
+                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] =
+                               intval( $value );
                        asort( $this->mParams['options'] );
                }
 
index 79636b1..581619f 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class SpecialBookSources extends SpecialPage {
-
        /**
         * ISBN passed to the page, if any
         */
@@ -55,7 +54,10 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addHTML( $this->makeForm() );
                if ( strlen( $this->isbn ) > 0 ) {
                        if ( !self::isValidISBN( $this->isbn ) ) {
-                               $this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
+                               $this->getOutput()->wrapWikiMsg(
+                                       "<div class=\"error\">\n$1\n</div>",
+                                       'booksources-invalid-isbn'
+                               );
                        }
                        $this->showList();
                }
@@ -118,10 +120,21 @@ class SpecialBookSources extends SpecialPage {
                global $wgScript;
 
                $form = Html::openElement( 'fieldset' ) . "\n";
-               $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+               $form .= Html::element(
+                       'legend',
+                       array(),
+                       $this->msg( 'booksources-search-legend' )->text()
+               ) . "\n";
                $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
                $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . "\n";
-               $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn, array( 'autofocus' => true ) );
+               $form .= '<p>' . Xml::inputLabel(
+                       $this->msg( 'booksources-isbn' )->text(),
+                       'isbn',
+                       'isbn',
+                       20,
+                       $this->isbn,
+                       array( 'autofocus' => true )
+               );
                $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
                $form .= Html::closeElement( 'form' ) . "\n";
                $form .= Html::closeElement( 'fieldset' ) . "\n";
index b2ddc22..1bbdbea 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class BrokenRedirectsPage extends QueryPage {
-
        function __construct( $name = 'BrokenRedirects' ) {
                parent::__construct( $name );
        }
@@ -148,7 +147,8 @@ class BrokenRedirectsPage extends QueryPage {
                        );
                }
 
-               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
+               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                       ->pipeList( $links ) )->escaped();
                $out .= " {$arr} {$to}";
 
                return $out;
index 7763166..cb9b07c 100644 (file)
@@ -38,7 +38,6 @@
  * @since 1.20
  */
 abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
-
        /**
         * CacheHelper object to which we forward the non-SpecialPage specific caching work.
         * Initialized in startCache.
@@ -142,7 +141,11 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * @param string|null $key
         */
        public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
-               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue(
+                       $computeFunction,
+                       $args,
+                       $key
+               ) );
        }
 
        /**
@@ -158,7 +161,8 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
        }
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry.
         *
         * @since 1.20
         *
index 07a2a86..c57e33b 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialChangeEmail extends UnlistedSpecialPage {
-
        /**
         * Users password
         * @var string
@@ -233,13 +232,19 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
-                       $this->error( array( 'changeemail-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+                       $this->error( array(
+                               'changeemail-throttled',
+                               $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] )
+                       ) );
 
                        return false;
                }
 
                global $wgRequirePasswordforEmailChange;
-               if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+               if ( $wgRequirePasswordforEmailChange
+                       && !$user->checkTemporaryPassword( $pass )
+                       && !$user->checkPassword( $pass )
+               ) {
                        $this->error( 'wrongpassword' );
 
                        return false;
index 8afbf4b..f4ce882 100644 (file)
@@ -27,8 +27,8 @@
  * @ingroup SpecialPage
  */
 class SpecialChangePassword extends FormSpecialPage {
-
-       protected $mUserName, $mDomain;
+       protected $mUserName;
+       protected $mDomain;
 
        // Optional Wikitext Message to show above the password change form
        protected $mPreTextMessage = null;
@@ -178,7 +178,6 @@ class SpecialChangePassword extends FormSpecialPage {
                        return false;
                }
 
-
                if ( $request->getCheck( 'wpCancel' ) ) {
                        $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
                        if ( !$titleObj instanceof Title ) {
index 6a4467c..0571d0d 100644 (file)
@@ -1055,7 +1055,8 @@ class ContribsPager extends ReverseChronologicalPager {
                        # Show user names for /newbies as there may be different users.
                        # Note that we already excluded rows with hidden user names.
                        if ( $this->contribs == 'newbie' ) {
-                               $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+                               $userlink = ' . . ' . $lang->getDirMark()
+                                       . Linker::userLink( $rev->getUser(), $rev->getUserText() );
                                $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
                        } else {
index d781e6d..448637e 100644 (file)
  */
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
        function __construct() {
-               parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
+               parent::__construct(
+                       'CreateAccount',
+                       'Userlogin',
+                       'signup',
+                       array( 'returnto', 'returntoquery', 'uselang' )
+               );
        }
 
        // No reason to hide this link on Special:Specialpages
index 0c860a5..ebbef17 100644 (file)
@@ -93,6 +93,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                        $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                }
                                break;
+                       case self::EDIT_CLEAR:
+                               $out->setPageTitle( $this->msg( 'watchlistedit-clear-title' ) );
+                               $form = $this->getClearForm();
+                               if ( $form->show() ) {
+                                       $out->addHTML( $this->successMessage );
+                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
+                               }
+                               break;
 
                        case self::EDIT_NORMAL:
                        default:
@@ -191,6 +199,18 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return true;
        }
 
+       public function submitClear( $data ) {
+               $current = $this->getWatchlist();
+               $this->clearWatchlist();
+               $this->getUser()->invalidateCache();
+               $this->successMessage = $this->msg( 'watchlistedit-clear-done' )->parse();
+               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-clear-removed' )
+                       ->numParams( count( $current ) )->parse();
+               $this->showTitles( $current, $this->successMessage );
+
+               return true;
+       }
+
        /**
         * Print out a list of linked titles
         *
@@ -204,6 +224,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $talk = $this->msg( 'talkpagelinktext' )->escaped();
                // Do a batch existence check
                $batch = new LinkBatch();
+               if (count($titles) >= 100) {
+                       $output = wfMessage( 'watchlistedit-too-many' )->parse();
+                       return;
+               }
                foreach ( $titles as $title ) {
                        if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
@@ -538,7 +562,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $context->setTitle( $this->getPageTitle() ); // Remove subpage
                $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
-               # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
+               # Used message keys:
+               # 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
                $form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
                $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
@@ -579,7 +604,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        );
                }
 
-               wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $title->isRedirect(), $this->getSkin() ) );
+               wfRunHooks(
+                       'WatchlistEditorBuildRemoveLine',
+                       array( &$tools, $title, $title->isRedirect(), $this->getSkin() )
+               );
 
                return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
@@ -611,6 +639,25 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return $form;
        }
 
+       /**
+        * Get a form for clearing the watchlist
+        *
+        * @return HTMLForm
+        */
+       protected function getClearForm() {
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle( 'clear' ) ); // Reset subpage
+               $form = new HTMLForm( array(), $context );
+               $form->setSubmitTextMsg( 'watchlistedit-clear-submit' );
+               # Used message keys: 'accesskey-watchlistedit-clear-submit', 'tooltip-watchlistedit-clear-submit'
+               $form->setSubmitTooltip( 'watchlistedit-clear-submit' );
+               $form->setWrapperLegendMsg( 'watchlistedit-clear-legend' );
+               $form->addHeaderText( $this->msg( 'watchlistedit-clear-explain' )->parse() );
+               $form->setSubmitCallback( array( $this, 'submitClear' ) );
+
+               return $form;
+       }
+
        /**
         * Determine whether we are editing the watchlist, and if so, what
         * kind of editing operation
@@ -625,6 +672,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                switch ( $mode ) {
                        case 'clear':
                        case self::EDIT_CLEAR:
+                               return self::EDIT_CLEAR;
                        case 'raw':
                        case self::EDIT_RAW:
                                return self::EDIT_RAW;
@@ -651,6 +699,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        'view' => array( 'Watchlist', false ),
                        'edit' => array( 'EditWatchlist', false ),
                        'raw' => array( 'EditWatchlist', 'raw' ),
+                       'clear' => array( 'EditWatchlist', 'clear' ),
                );
 
                foreach ( $modes as $mode => $arr ) {
@@ -669,10 +718,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        }
 }
 
-# B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {
-}
-
 /**
  * Extend HTMLForm purely so we can have a more sane way of getting the section headers
  */
index 487d979..bc8e728 100644 (file)
@@ -259,8 +259,14 @@ class SpecialExport extends SpecialPage {
                        ) . '<br />';
                }
 
-               // Enable this when we can do something useful exporting/importing image information. :)
-               //$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
+               /* Enable this when we can do something useful exporting/importing image information.
+               $form .= Xml::checkLabel(
+                               $this->msg( 'export-images' )->text(),
+                               'images',
+                               'wpExportImages',
+                               false
+                       ) . '<br />';
+               */
                $form .= Xml::checkLabel(
                        $this->msg( 'export-download' )->text(),
                        'wpDownload',
@@ -510,7 +516,9 @@ class SpecialExport extends SpecialPage {
         * @return array
         */
        private function getPageLinks( $inputPages, $pageSet, $depth ) {
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $depth > 0; --$depth ) {
+                       // @codingStandardsIgnoreEnd
                        $pageSet = $this->getLinks(
                                $inputPages, $pageSet, 'pagelinks',
                                array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
index 891962b..28e6479 100644 (file)
@@ -99,7 +99,9 @@ class SpecialImport extends SpecialPage {
                $sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
-               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
+               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0
+                       ? 0
+                       : $request->getIntOrNull( 'pagelink-depth' );
                $this->rootpage = $request->getText( 'rootpage' );
 
                $user = $this->getUser();
@@ -242,7 +244,10 @@ class SpecialImport extends SpecialPage {
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+                                       Xml::label(
+                                               $this->msg( 'import-interwiki-rootpage' )->text(),
+                                               'mw-interwiki-rootpage-upload'
+                                       ) .
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::input( 'rootpage', 50, $this->rootpage,
@@ -434,7 +439,9 @@ class ImportReporter extends ContextSource {
        }
 
        function reportNotice( $msg, array $params ) {
-               $this->getOutput()->addHTML( Html::element( 'li', array(), $this->msg( $msg, $params )->text() ) );
+               $this->getOutput()->addHTML(
+                       Html::element( 'li', array(), $this->msg( $msg, $params )->text() )
+               );
        }
 
        function reportLogItem( /* ... */ ) {
@@ -475,7 +482,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
                        } else {
@@ -484,7 +492,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
                                        $successCount )->params( $interwiki )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
                        }
@@ -492,13 +501,23 @@ class ImportReporter extends ContextSource {
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
-                       $nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true, $this->getUser() );
+                       $nullRevision = Revision::newNullRevision(
+                               $dbw,
+                               $title->getArticleID(),
+                               $comment,
+                               true,
+                               $this->getUser()
+                       );
+
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $page, $nullRevision, $latest, $this->getUser() ) );
+                               wfRunHooks(
+                                       'NewRevisionFromEditComplete',
+                                       array( $page, $nullRevision, $latest, $this->getUser() )
+                               );
                        }
                } else {
                        $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
index 7982d5c..1c4f79f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialJavaScriptTest extends SpecialPage {
-
        /**
-        * @var $frameworks Array: Mapping of framework ids and their initilizer methods
+        * @var array Mapping of framework ids and their initilizer methods
         * in this class. If a framework is requested but not in this array,
         * the 'unknownframework' error is served.
         */
-       static $frameworks = array(
+       private static $frameworks = array(
                'qunit' => 'initQUnitTesting',
        );
 
index f9caff6..6b54fe8 100644 (file)
@@ -68,14 +68,20 @@ class SpecialListFiles extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class ImageListPager extends TablePager {
-       var $mFieldNames = null;
+       protected $mFieldNames = null;
+
        // Subclasses should override buildQueryConds instead of using $mQueryConds variable.
-       var $mQueryConds = array();
-       var $mUserName = null;
-       var $mSearch = '';
-       var $mIncluding = false;
-       var $mShowAll = false;
-       var $mTableName = 'image';
+       protected $mQueryConds = array();
+
+       protected $mUserName = null;
+
+       protected $mSearch = '';
+
+       protected $mIncluding = false;
+
+       protected $mShowAll = false;
+
+       protected $mTableName = 'image';
 
        function __construct( IContextSource $context, $userName = null, $search = '',
                $including = false, $showAll = false
@@ -298,7 +304,8 @@ class ImageListPager extends TablePager {
        function reallyDoQuery( $offset, $limit, $asc ) {
                $prevTableName = $this->mTableName;
                $this->mTableName = 'image';
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
                $this->mTableName = $prevTableName;
 
@@ -315,7 +322,8 @@ class ImageListPager extends TablePager {
                }
                $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 );
 
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
 
                $this->mTableName = $prevTableName;
@@ -360,11 +368,17 @@ class ImageListPager extends TablePager {
                                }
                        }
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes1; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes1;
                        $topRes1 = $res1->next();
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes2; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes2;
                        $topRes2 = $res2->next();
                }
index 31034f9..a77b70c 100644 (file)
@@ -29,9 +29,6 @@
  * @author Petr Kadlec <mormegil@centrum.cz>
  */
 class SpecialListGroupRights extends SpecialPage {
-       /**
-        * Constructor
-        */
        function __construct() {
                parent::__construct( 'Listgrouprights' );
        }
@@ -118,11 +115,12 @@ class SpecialListGroupRights extends SpecialPage {
                        $addgroups = isset( $wgAddGroups[$group] ) ? $wgAddGroups[$group] : array();
                        $removegroups = isset( $wgRemoveGroups[$group] ) ? $wgRemoveGroups[$group] : array();
                        $addgroupsSelf = isset( $wgGroupsAddToSelf[$group] ) ? $wgGroupsAddToSelf[$group] : array();
-                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] ) ? $wgGroupsRemoveFromSelf[$group] : array();
+                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] )
+                               ? $wgGroupsRemoveFromSelf[$group]
+                               : array();
 
                        $id = $group == '*' ? false : Sanitizer::escapeId( $group );
-                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ),
-                               "
+                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ), "
                                <td>$grouppage$grouplink</td>
                                        <td>" .
                                        $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
index 95ef951..3382405 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup SpecialPage
  */
 class SpecialLockdb extends FormSpecialPage {
-       var $reason = '';
+       protected $reason = '';
 
        public function __construct() {
                parent::__construct( 'Lockdb', 'siteadmin' );
index dd5ab93..6da6674 100644 (file)
@@ -80,7 +80,9 @@ class SpecialLog extends SpecialPage {
                $type = $opts->getValue( 'type' );
                if ( !LogPage::isLogType( $type ) ) {
                        $opts->setValue( 'type', '' );
-               } elseif ( isset( $wgLogRestrictions[$type] ) && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) ) {
+               } elseif ( isset( $wgLogRestrictions[$type] )
+                       && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] )
+               ) {
                        throw new PermissionsError( $wgLogRestrictions[$type] );
                }
 
index f799fc5..097f1b6 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMergeHistory extends SpecialPage {
-       var $mAction, $mTarget, $mDest, $mTimestamp, $mTargetID, $mDestID, $mComment;
+       /** @var string */
+       protected $mAction;
 
-       /**
-        * @var Title
-        */
-       var $mTargetObj, $mDestObj;
+       /** @var string */
+       protected $mTarget;
+
+       /** @var string */
+       protected $mDest;
+
+       /** @var string */
+       protected $mTimestamp;
+
+       /** @var int */
+       protected $mTargetID;
+
+       /** @var int */
+       protected $mDestID;
+
+       /** @var string */
+       protected $mComment;
+
+       /** @var bool Was posted? */
+       protected $mMerge;
+
+       /** @var bool Was submitted? */
+       protected $mSubmitted;
+
+       /** @var Title */
+       protected $mTargetObj;
+
+       /** @var Title */
+       protected $mDestObj;
 
        public function __construct() {
                parent::__construct( 'MergeHistory', 'mergehistory' );
@@ -57,7 +83,9 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $this->mComment = $request->getText( 'wpComment' );
 
-               $this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+               $this->mMerge = $request->wasPosted()
+                       && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+
                // target page
                if ( $this->mSubmitted ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
@@ -203,7 +231,10 @@ class SpecialMergeHistory extends SpecialPage {
                                        <tr>
                                                <td>&#160;</td>
                                                <td class="mw-submit">' .
-                                       Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+                                       Xml::submitButton(
+                                               $this->msg( 'mergehistory-submit' )->text(),
+                                               array( 'name' => 'merge', 'id' => 'mw-merge-submit' )
+                                       ) .
                                        '</td>
                                        </tr>' .
                                        Xml::closeElement( 'table' ) .
@@ -290,7 +321,8 @@ class SpecialMergeHistory extends SpecialPage {
                $comment = Linker::revComment( $rev );
 
                return Html::rawElement( 'li', array(),
-                       $this->msg( 'mergehistory-revisionrow' )->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
+                       $this->msg( 'mergehistory-revisionrow' )
+                               ->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
        function merge() {
@@ -434,7 +466,11 @@ class SpecialMergeHistory extends SpecialPage {
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
-       public $mForm, $mConds;
+       /** @var IContextSource */
+       public $mForm;
+
+       /** @var array */
+       public $mConds;
 
        function __construct( $form, $conds = array(), $source, $dest ) {
                $this->mForm = $form;
index 91ef797..dce5ad9 100644 (file)
  * @ingroup SpecialPage
  */
 class MovePageForm extends UnlistedSpecialPage {
-       /**
-        * Objects
-        * @var Title
-        */
-       var $oldTitle, $newTitle;
-       // Text input
-       var $reason;
+       /** @var Title */
+       protected $oldTitle;
+
+       /** @var Title */
+       protected $newTitle;
+
+
+       /** @var string Text input */
+       protected $reason;
+
        // Checks
-       var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
+
+       /** @var bool */
+       protected $moveTalk;
+
+       /** @var bool */
+       protected $deleteAndMove;
+
+       /** @var bool */
+       protected $moveSubpages;
+
+       /** @var bool */
+       protected $fixRedirects;
+
+       /** @var bool */
+       protected $leaveRedirect;
+
+       /** @var bool */
+       protected $moveOverShared;
 
        private $watch = false;
 
@@ -163,6 +183,11 @@ class MovePageForm extends UnlistedSpecialPage {
                                        "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
                                        'moveuserpage-warning'
                                );
+                       } elseif ( $this->oldTitle->getNamespace() == NS_CATEGORY ) {
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-movecategorypage-warning\">\n$1\n</div>",
+                                       'movecategorypage-warning'
+                               );
                        }
 
                        $out->addWikiMsg( $wgFixDoubleRedirects ?
@@ -680,17 +705,20 @@ class MovePageForm extends UnlistedSpecialPage {
                                        );
 
                                        $newLink = Linker::linkKnown( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
 
                                        if ( $count >= $wgMaximumMovedPages ) {
-                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
+                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )
+                                                       ->numParams( $wgMaximumMovedPages )->escaped();
                                                break;
                                        }
                                } else {
                                        $oldLink = Linker::linkKnown( $oldSubpage );
                                        $newLink = Linker::link( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                }
                        }
                }
index 1d06071..147d176 100644 (file)
@@ -76,7 +76,7 @@ class NewFilesPager extends ReverseChronologicalPager {
        /**
         * @var ImageGallery
         */
-       var $gallery;
+       protected $gallery;
 
        function __construct( IContextSource $context, $par = null ) {
                $this->like = $context->getRequest()->getText( 'like' );
@@ -183,7 +183,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                        'showbots' => array(
                                'type' => 'check',
-                               'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
+                               'label-message' => 'newimages-showbots',
                                'name' => 'showbots',
                        ),
                        'limit' => array(
index 66ec693..505a1ec 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialNewpages extends IncludableSpecialPage {
-       // Stored objects
-
        /**
         * @var FormOptions
         */
        protected $opts;
        protected $customFilters;
 
-       // Some internal settings
        protected $showNavigation = false;
 
        public function __construct() {
@@ -394,7 +391,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
                }
 
-               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
+               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} "
+                       . "{$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
        }
 
        /**
index 6edf2c0..7554e37 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialProtectedpages extends SpecialPage {
-
        protected $IdLevel = 'level';
        protected $IdType = 'type';
 
@@ -438,7 +437,11 @@ class ProtectedPagesPager extends TablePager {
                                        );
                                } else {
                                        $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_USER, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
                                                if ( $username === false ) {
                                                        $formatted = htmlspecialchars( $value );
                                                } else {
@@ -473,7 +476,11 @@ class ProtectedPagesPager extends TablePager {
                                                $this->msg( 'protectedpages-unknown-reason' )->escaped()
                                        );
                                } else {
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_COMMENT, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
                                                $formatted = Linker::formatComment( $value !== null ? $value : '' );
                                        } else {
                                                $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
index 4edf33c..797f588 100644 (file)
@@ -55,7 +55,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** @var array UI Labels about the current type */
        private $typeLabels;
 
-       /** @var RevDel_List RevDel_List object, storing the list of items to be deleted/undeleted */
+       /** @var RevDelList RevDelList object, storing the list of items to be deleted/undeleted */
        private $revDelList;
 
        /** @var bool Whether user is allowed to perform the action */
@@ -132,7 +132,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // $this->ids = array_map( 'intval', $this->ids );
                $this->ids = array_unique( array_filter( $this->ids ) );
 
-               if ( $request->getVal( 'action' ) == 'historysubmit' || $request->getVal( 'action' ) == 'revisiondelete' ) {
+               if ( $request->getVal( 'action' ) == 'historysubmit'
+                       || $request->getVal( 'action' ) == 'revisiondelete'
+               ) {
                        // For show/hide form submission from history page
                        // Since we are access through index.php?title=XXX&action=historysubmit
                        // getFullTitle() will contain the target title and not our title
@@ -162,7 +164,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
 
                # Allow the list type to adjust the passed target
-               $this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
+               $this->targetObj = RevisionDeleter::suggestTarget(
+                       $this->typeName,
+                       $this->targetObj,
+                       $this->ids
+               );
 
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
@@ -277,7 +283,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Show a deleted file version requested by the visitor.
-        * TODO Mostly copied from Special:Undelete. Refactor.
+        * @todo Mostly copied from Special:Undelete. Refactor.
         * @param string $archiveName
         */
        protected function tryShowFile( $archiveName ) {
@@ -326,7 +332,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # a user without appropriate permissions can toddle off and
                # nab the image, and Squid will serve it
                $this->getRequest()->response()->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
-               $this->getRequest()->response()->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
+               $this->getRequest()->response()->header(
+                       'Cache-Control: no-cache, no-store, max-age=0, must-revalidate'
+               );
                $this->getRequest()->response()->header( 'Pragma: no-cache' );
 
                $key = $oimage->getStorageKey();
@@ -336,7 +344,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Get the list object for this request
-        * @return RevDel_List
+        * @return RevDelList
         */
        protected function getList() {
                if ( is_null( $this->revDelList ) ) {
@@ -364,14 +372,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $numRevisions = 0;
                // Live revisions...
                $list = $this->getList();
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $list->reset(); $list->current(); $list->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $list->current();
+
                        if ( !$item->canView() ) {
                                if ( !$this->submitClicked ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                }
                                $userAllowed = false;
                        }
+
                        $numRevisions++;
                        $this->getOutput()->addHTML( $item->getHTML() );
                }
@@ -413,7 +425,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                                Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
-                                               Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
+                                               Xml::input(
+                                                       'wpReason',
+                                                       60,
+                                                       $this->otherReason,
+                                                       array( 'id' => 'wpReason', 'maxlength' => 100 )
+                                               ) .
                                        '</td>' .
                                "</tr><tr>\n" .
                                        '<td></td>' .
@@ -454,10 +471,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function addUsageText() {
                // Messages: revdelete-text-text, revdelete-text-file, logdelete-text
-               $this->getOutput()->wrapWikiMsg( "<strong>$1</strong>\n$2", $this->typeLabels['text'], 'revdelete-text-others' );
+               $this->getOutput()->wrapWikiMsg(
+                       "<strong>$1</strong>\n$2", $this->typeLabels['text'],
+                       'revdelete-text-others'
+               );
+
                if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
+
                if ( $this->mIsAllowed ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-confirm' );
                }
@@ -473,26 +495,38 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                if ( $list->length() == 1 ) {
                        $list->reset();
                        $bitfield = $list->current()->getBits(); // existing field
+
                        if ( $this->submitClicked ) {
                                $bitfield = RevisionDeleter::extractBitfield( $this->extractBitParams(), $bitfield );
                        }
+
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
                                // revdelete-hide-comment, revdelete-hide-user, revdelete-hide-restricted
                                list( $message, $name, $field ) = $item;
-                               $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
+                               $innerHTML = Xml::checkLabel(
+                                       $this->msg( $message )->text(),
+                                       $name,
+                                       $name,
+                                       $bitfield & $field
+                               );
+
                                if ( $field == Revision::DELETED_RESTRICTED ) {
                                        $innerHTML = "<b>$innerHTML</b>";
                                }
+
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
                                $html .= "<tr>$line</tr>\n";
                        }
                } else {
                        // Otherwise, use tri-state radios
                        $html .= '<tr>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
@@ -535,16 +569,20 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return false;
                }
                $bitParams = $this->extractBitParams();
-               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
+               // from dropdown
+               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' );
                $comment = $listReason;
                if ( $comment != 'other' && $this->otherReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
+                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                               . $this->otherReason;
                } elseif ( $comment == 'other' ) {
                        $comment = $this->otherReason;
                }
                # Can the user set this field?
-               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1
+                       && !$this->getUser()->isAllowed( 'suppressrevision' )
+               ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
@@ -567,7 +605,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function success() {
                // Messages: revdelete-success, logdelete-success
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
-               $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
+               $this->getOutput()->wrapWikiMsg(
+                       "<span class=\"success\">\n$1\n</span>",
+                       $this->typeLabels['success']
+               );
                $this->wasSaved = true;
                $this->revDelList->reloadFromMaster();
                $this->showForm();
@@ -606,7 +647,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
 
        /**
-        * Do the write operations. Simple wrapper for RevDel_*List::setVisibility().
+        * Do the write operations. Simple wrapper for RevDel*List::setVisibility().
         * @param int $bitfield
         * @param string $reason
         * @param Title $title
index 10e7009..63eff36 100644 (file)
@@ -66,12 +66,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                // Constant-time signature verification
                // http://www.emerose.com/timing-attacks-explained
-               // @todo: make a common method for this
+               // @todo Make a common method for this
                if ( !is_string( $rSig ) || strlen( $rSig ) !== strlen( $cSig ) ) {
                        $verified = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $cSig ); $i++ ) {
+                       $cSigLength = strlen( $cSig );
+                       for ( $i = 0; $i < $cSigLength; $i++ ) {
                                $result |= ord( $cSig[$i] ) ^ ord( $rSig[$i] );
                        }
                        $verified = ( $result == 0 );
index c2b5f9b..2713a5f 100644 (file)
@@ -226,7 +226,11 @@ class SpecialSearch extends SpecialPage {
                                $out->addHTML(
                                        Xml::openElement( 'fieldset' ) .
                                        Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
-                                       Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), $this->msg( 'searchdisabled' )->text() ) .
+                                       Xml::element(
+                                               'p',
+                                               array( 'class' => 'mw-searchdisabled' ),
+                                               $this->msg( 'searchdisabled' )->text()
+                                       ) .
                                        $this->msg( 'googlesearch' )->rawParams(
                                                htmlspecialchars( $term ),
                                                'UTF-8',
@@ -284,7 +288,8 @@ class SpecialSearch extends SpecialPage {
                                $stParams
                        );
 
-                       $this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
+                       $this->didYouMeanHtml = '<div class="searchdidyoumean">'
+                               . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
                }
 
                if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
@@ -363,7 +368,10 @@ class SpecialSearch extends SpecialPage {
                        // Show the create link ahead
                        $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
                        if ( $totalRes > $this->limit || $this->offset ) {
-                               $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
+                               $prevnext = $this->getLanguage()->viewPrevNext(
+                                       $this->getPageTitle(),
+                                       $this->offset,
+                                       $this->limit,
                                        $this->powerSearchOptions() + array( 'search' => $term ),
                                        max( $titleMatchesNum, $textMatchesNum ) < $this->limit
                                );
@@ -444,7 +452,11 @@ class SpecialSearch extends SpecialPage {
                } else {
                        $messageName = 'searchmenu-new-nocreate';
                }
-               $params = array( $messageName, wfEscapeWikiText( $title->getPrefixedText() ), Message::numParam( $num ) );
+               $params = array(
+                       $messageName,
+                       wfEscapeWikiText( $title->getPrefixedText() ),
+                       Message::numParam( $num )
+               );
                wfRunHooks( 'SpecialSearchCreateLink', array( $title, &$params ) );
 
                // Extensions using the hook might still return an empty $messageName
@@ -708,7 +720,8 @@ class SpecialSearch extends SpecialPage {
                        &$score, &$size, &$date, &$related,
                        &$html
                ) ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
+                       $html = "<li><div class='mw-search-result-heading'>" .
+                               "{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
                                "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
                                "</li>\n";
                }
@@ -734,7 +747,8 @@ class SpecialSearch extends SpecialPage {
 
                // work out custom project captions
                $customCaptions = array();
-               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
+               // format per line <iwprefix>:<caption>
+               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
                foreach ( $customLines as $line ) {
                        $parts = explode( ":", $line, 2 );
                        if ( count( $parts ) == 2 ) { // validate line
@@ -756,8 +770,7 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-
-               // TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax)..
+               // @todo Should support paging in a non-confusing way (not sure how though, maybe via ajax)..
                $out .= "</ul></div>\n";
 
                // convert the whole thing to desired language variant
index 4006e49..5ce2812 100644 (file)
@@ -435,7 +435,11 @@ class LoginForm extends SpecialPage {
 
                // Normalize the name so that silly things don't cause "invalid username"
                // errors. User::newFromName does some rather strict checking, rejecting
-               // e.g. leading/trailing/multiple spaces.
+               // e.g. leading/trailing/multiple spaces. But first we need to reject
+               // usernames that would be treated as titles with a fragment part.
+               if ( strpos( $this->mUsername, '#' ) !== false ) {
+                       return Status::newFatal( 'noname' );
+               }
                $title = Title::makeTitleSafe( NS_USER, $this->mUsername );
                if ( !is_object( $title ) ) {
                        return Status::newFatal( 'noname' );
index e61d17a..41847dc 100644 (file)
@@ -1113,6 +1113,15 @@ class SpecialVersion extends SpecialPage {
                return $repo->getHeadSHA1();
        }
 
+       /**
+        * @param string $dir Directory of the git checkout
+        * @return bool|string Branch currently checked out
+        */
+       public static function getGitCurrentBranch( $dir ) {
+               $repo = new GitInfo( $dir );
+               return $repo->getCurrentBranch();
+       }
+
        /**
         * Get the list of entry points and their URLs
         * @return string Wikitext
index fc39ef5..490e81f 100644 (file)
@@ -50,6 +50,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $mode !== false ) {
                        if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
+                       } elseif ( $mode === SpecialEditWatchlist::EDIT_CLEAR ) {
+                               $title = SpecialPage::getTitleFor( 'EditWatchlist', 'clear' );
                        } else {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist' );
                        }
index d5b8d8b..33b2400 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Template used when there is no LocalSettings.php file.
  *
index 1c8bbd1..9118701 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for account creation (since 1.22 with VForm appearance).
  *
@@ -22,7 +23,6 @@
  */
 
 class UsercreateTemplate extends BaseTemplate {
-
        /**
         * Extensions (AntiSpoof and TitleBlacklist) call this in response to
         * UserCreateForm hook to add checkboxes to the create account form.
index 29908d7..0aad07d 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for user login (since 1.22 with VForm appearance).
  *
index 746c16d..bef80be 100644 (file)
@@ -44,7 +44,13 @@ abstract class UploadBase {
        protected $mBlackListedExtensions;
        protected $mJavaDetected, $mSVGNSError;
 
-       protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' );
+       protected static $safeXmlEncodings = array(
+               'UTF-8',
+               'ISO-8859-1',
+               'ISO-8859-2',
+               'UTF-16',
+               'UTF-32'
+       );
 
        const SUCCESS = 0;
        const OK = 0;
@@ -120,11 +126,12 @@ abstract class UploadBase {
                                return $permission;
                        }
                }
+
                return true;
        }
 
        // Upload handlers. Should probably just be a global.
-       static $uploadHandlers = array( 'Stash', 'File', 'Url' );
+       private static $uploadHandlers = array( 'Stash', 'File', 'Url' );
 
        /**
         * Create a form of UploadBase depending on wpSourceType and initializes it
@@ -167,6 +174,7 @@ abstract class UploadBase {
                $handler = new $className;
 
                $handler->initializeFromRequest( $request );
+
                return $handler;
        }
 
@@ -179,7 +187,8 @@ abstract class UploadBase {
                return false;
        }
 
-       public function __construct() {}
+       public function __construct() {
+       }
 
        /**
         * Returns the upload type. Should be overridden by child classes
@@ -256,8 +265,9 @@ abstract class UploadBase {
                wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
-                       // @todo just make uploads work with storage paths
-                       // UploadFromStash loads files via virtual URLs
+                       /** @todo Just make uploads work with storage paths UploadFromStash
+                        *  loads files via virtual URLs.
+                        */
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        if ( $tmpFile ) {
                                $tmpFile->bind( $this ); // keep alive with $this
@@ -267,6 +277,7 @@ abstract class UploadBase {
                        $path = $srcPath;
                }
                wfProfileOut( __METHOD__ );
+
                return $path;
        }
 
@@ -282,6 +293,7 @@ abstract class UploadBase {
                 */
                if ( $this->isEmptyFile() ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::EMPTY_FILE );
                }
 
@@ -291,6 +303,7 @@ abstract class UploadBase {
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
                if ( $this->mFileSize > $maxSize ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::FILE_TOO_LARGE,
                                'max' => $maxSize,
@@ -305,6 +318,7 @@ abstract class UploadBase {
                $verification = $this->verifyFile();
                if ( $verification !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::VERIFICATION_ERROR,
                                'details' => $verification
@@ -317,6 +331,7 @@ abstract class UploadBase {
                $result = $this->validateName();
                if ( $result !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $result;
                }
 
@@ -325,10 +340,12 @@ abstract class UploadBase {
                        array( $this->mDestName, $this->mTempPath, &$error ) )
                ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
                }
 
                wfProfileOut( __METHOD__ );
+
                return array( 'status' => self::OK );
        }
 
@@ -351,6 +368,7 @@ abstract class UploadBase {
                                        $result['blacklistedExt'] = $this->mBlackListedExtensions;
                                }
                        }
+
                        return $result;
                }
                $this->mDestName = $this->getLocalFile()->getName();
@@ -374,6 +392,7 @@ abstract class UploadBase {
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-badmime', $mime );
                        }
 
@@ -388,12 +407,14 @@ abstract class UploadBase {
                        foreach ( $ieTypes as $ieType ) {
                                if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return array( 'filetype-bad-ie-mime', $ieType );
                                }
                        }
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -409,6 +430,7 @@ abstract class UploadBase {
                $status = $this->verifyPartialFile();
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -419,6 +441,7 @@ abstract class UploadBase {
                        # XXX: Missing extension will be caught by validateName() via getTitle()
                        if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
                        }
                }
@@ -429,6 +452,7 @@ abstract class UploadBase {
                        if ( !$handlerStatus->isOK() ) {
                                $errors = $handlerStatus->getErrorsArray();
                                wfProfileOut( __METHOD__ );
+
                                return reset( $errors );
                        }
                }
@@ -436,11 +460,13 @@ abstract class UploadBase {
                wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -466,6 +492,7 @@ abstract class UploadBase {
                $status = $this->verifyMimeType( $mime );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -473,12 +500,14 @@ abstract class UploadBase {
                if ( !$wgDisableUploadScriptChecks ) {
                        if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                $svgStatus = $this->detectScriptInSvg( $this->mTempPath );
                                if ( $svgStatus !== false ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $svgStatus;
                                }
                        }
@@ -495,11 +524,13 @@ abstract class UploadBase {
                                $error = reset( $errors );
                                if ( $error[0] !== 'zip-wrong-format' ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $error;
                                }
                        }
                        if ( $this->mJavaDetected ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadjava' );
                        }
                }
@@ -508,10 +539,12 @@ abstract class UploadBase {
                $virus = $this->detectVirus( $this->mTempPath );
                if ( $virus ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'uploadvirus', $virus );
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -541,8 +574,10 @@ abstract class UploadBase {
        }
 
        /**
-        * Alias for verifyTitlePermissions. The function was originally 'verifyPermissions'
-        * but that suggests it's checking the user, when it's really checking the title + user combination.
+        * Alias for verifyTitlePermissions. The function was originally
+        * 'verifyPermissions', but that suggests it's checking the user, when it's
+        * really checking the title + user combination.
+        *
         * @param User $user User object to verify the permissions against
         * @return mixed An array as returned by getUserPermissionsErrors or true
         *   in case the user has proper permissions.
@@ -581,6 +616,7 @@ abstract class UploadBase {
                if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
+
                        return $permErrors;
                }
 
@@ -618,7 +654,8 @@ abstract class UploadBase {
                if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
                        $warnings['badfilename'] = $filename;
                        // Debugging for bug 62241
-                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: '$this->mDesiredDestName', comparableName: '$comparableName'" );
+                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: "
+                               . "'$this->mDesiredDestName', comparableName: '$comparableName'" );
                }
 
                // Check whether the file extension is on the unwanted list
@@ -670,6 +707,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $warnings;
        }
 
@@ -699,12 +737,17 @@ abstract class UploadBase {
 
                if ( $status->isGood() ) {
                        if ( $watch ) {
-                               WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
+                               WatchAction::doWatch(
+                                       $this->getLocalFile()->getTitle(),
+                                       $user,
+                                       WatchedItem::IGNORE_USER_RIGHTS
+                               );
                        }
                        wfRunHooks( 'UploadComplete', array( &$this ) );
                }
 
                wfProfileOut( __METHOD__ );
+
                return $status;
        }
 
@@ -733,6 +776,7 @@ abstract class UploadBase {
                if ( strlen( $this->mFilteredName ) > 240 ) {
                        $this->mTitleError = self::FILENAME_TOO_LONG;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
@@ -747,6 +791,7 @@ abstract class UploadBase {
                if ( is_null( $nt ) ) {
                        $this->mTitleError = self::ILLEGAL_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
                $this->mFilteredName = $nt->getDBkey();
@@ -789,13 +834,16 @@ abstract class UploadBase {
                if ( $this->mFinalExtension == '' ) {
                        $this->mTitleError = self::FILETYPE_MISSING;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                } elseif ( $blackListedExtensions ||
-                               ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
-                                       !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) ) {
+                       ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
+                               !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) )
+               ) {
                        $this->mBlackListedExtensions = $blackListedExtensions;
                        $this->mTitleError = self::FILETYPE_BADTYPE;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
@@ -803,13 +851,15 @@ abstract class UploadBase {
                if ( wfIsWindows() && !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() ) ) {
                        $this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                # If there was more than one "extension", reassemble the base
                # filename to prevent bogus complaints about length
                if ( count( $ext ) > 1 ) {
-                       for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+                       $iterations = count( $ext ) - 1;
+                       for ( $i = 0; $i < $iterations; $i++ ) {
                                $partname .= '.' . $ext[$i];
                        }
                }
@@ -817,10 +867,12 @@ abstract class UploadBase {
                if ( strlen( $partname ) < 1 ) {
                        $this->mTitleError = self::MIN_LENGTH_PARTNAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                $this->mTitle = $nt;
+
                return $this->mTitle;
        }
 
@@ -834,17 +886,21 @@ abstract class UploadBase {
                        $nt = $this->getTitle();
                        $this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
                }
+
                return $this->mLocalFile;
        }
 
        /**
-        * If the user does not supply all necessary information in the first upload form submission (either by accident or
-        * by design) then we may want to stash the file temporarily, get more information, and publish the file later.
+        * If the user does not supply all necessary information in the first upload
+        * form submission (either by accident or by design) then we may want to
+        * stash the file temporarily, get more information, and publish the file
+        * later.
         *
-        * This method will stash a file in a temporary directory for later processing, and save the necessary descriptive info
-        * into the database.
-        * This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
-        * API request to find this stashed file again.
+        * This method will stash a file in a temporary directory for later
+        * processing, and save the necessary descriptive info into the database.
+        * This method returns the file object, which also has a 'fileKey' property
+        * which can be passed through a form or API request to find this stashed
+        * file again.
         *
         * @param User $user
         * @return UploadStashFile Stashed file
@@ -858,11 +914,13 @@ abstract class UploadBase {
                $this->mLocalFile = $file;
 
                wfProfileOut( __METHOD__ );
+
                return $file;
        }
 
        /**
-        * Stash a file in a temporary directory, returning a key which can be used to find the file again. See stashFile().
+        * Stash a file in a temporary directory, returning a key which can be used
+        * to find the file again. See stashFile().
         *
         * @return string File key
         */
@@ -906,6 +964,7 @@ abstract class UploadBase {
        public static function splitExtensions( $filename ) {
                $bits = explode( '.', $filename );
                $basename = array_shift( $bits );
+
                return array( $basename, $bits );
        }
 
@@ -947,10 +1006,12 @@ abstract class UploadBase {
                        if ( !$magic->isRecognizableExtension( $extension ) ) {
                                wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
                                        "unrecognized extension '$extension', can't verify\n" );
+
                                return true;
                        } else {
                                wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
                                        "recognized extension '$extension', so probably invalid file\n" );
+
                                return false;
                        }
                }
@@ -960,19 +1021,22 @@ abstract class UploadBase {
                if ( $match === null ) {
                        if ( $magic->getTypesForExtension( $extension ) !== null ) {
                                wfDebug( __METHOD__ . ": No extension known for $mime, but we know a mime for $extension\n" );
+
                                return false;
                        } else {
                                wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
+
                                return true;
                        }
                } elseif ( $match === true ) {
                        wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
 
-                       #TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
+                       /** @todo If it's a bitmap, make sure PHP or ImageMagick resp. can handle it! */
                        return true;
-
                } else {
-                       wfDebug( __METHOD__ . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+                       wfDebug( __METHOD__
+                               . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+
                        return false;
                }
        }
@@ -1007,6 +1071,7 @@ abstract class UploadBase {
 
                if ( !$chunk ) {
                        wfProfileOut( __METHOD__ );
+
                        return false;
                }
 
@@ -1025,12 +1090,13 @@ abstract class UploadBase {
 
                $chunk = trim( $chunk );
 
-               # @todo FIXME: Convert from UTF-16 if necessary!
+               /** @todo FIXME: Convert from UTF-16 if necessary! */
                wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
 
                # check for HTML doctype
                if ( preg_match( "/<!DOCTYPE *X?HTML/i", $chunk ) ) {
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1039,6 +1105,7 @@ abstract class UploadBase {
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1062,7 +1129,7 @@ abstract class UploadBase {
                        '<a href',
                        '<body',
                        '<head',
-                       '<html',   #also in safari
+                       '<html', #also in safari
                        '<img',
                        '<pre',
                        '<script', #also in safari
@@ -1077,6 +1144,7 @@ abstract class UploadBase {
                        if ( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1092,6 +1160,7 @@ abstract class UploadBase {
                if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1099,6 +1168,7 @@ abstract class UploadBase {
                if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1106,11 +1176,13 @@ abstract class UploadBase {
                if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
                wfDebug( __METHOD__ . ": no scripts found\n" );
                wfProfileOut( __METHOD__ );
+
                return false;
        }
 
@@ -1131,16 +1203,19 @@ abstract class UploadBase {
                                && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                        ) {
                                wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                return true;
                        }
                } elseif ( preg_match( "!<\?xml\b!si", $contents ) ) {
                        // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                        // bytes. There shouldn't be a legitimate reason for this to happen.
                        wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                        return true;
                } elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
                        // EBCDIC encoded XML
                        wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
+
                        return true;
                }
 
@@ -1151,17 +1226,19 @@ abstract class UploadBase {
                        wfSuppressWarnings();
                        $str = iconv( $encoding, 'UTF-8', $contents );
                        wfRestoreWarnings();
-                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
+                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
                                if ( preg_match( $encodingRegex, $matches[1], $encMatch )
                                        && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                                ) {
                                        wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                        return true;
                                }
                        } elseif ( $str != '' && preg_match( "!<\?xml\b!si", $str ) ) {
                                // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                                // bytes. There shouldn't be a legitimate reason for this to happen.
                                wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                                return true;
                        }
                }
@@ -1188,8 +1265,10 @@ abstract class UploadBase {
                        if ( $this->mSVGNSError ) {
                                return array( 'uploadscriptednamespace', $this->mSVGNSError );
                        }
+
                        return array( 'uploadscripted' );
                }
+
                return false;
        }
 
@@ -1204,6 +1283,7 @@ abstract class UploadBase {
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return true;
                }
+
                return false;
        }
 
@@ -1255,8 +1335,9 @@ abstract class UploadBase {
 
                if ( !in_array( $namespace, $validNamespaces ) ) {
                        wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" );
-                       // @TODO return a status object to a closure in XmlTypeCheck, for MW1.21+
+                       /** @todo Return a status object to a closure in XmlTypeCheck, for MW1.21+ */
                        $this->mSVGNSError = $namespace;
+
                        return true;
                }
 
@@ -1265,24 +1346,29 @@ abstract class UploadBase {
                 */
                if ( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
-               # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+               # e.g., <svg xmlns="http://www.w3.org/2000/svg">
+               #  <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
                if ( $strippedElement == 'handler' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
                if ( $strippedElement == 'stylesheet' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # Block iframes, in case they pass the namespace check
                if ( $strippedElement == 'iframe' ) {
                        wfDebug( __METHOD__ . ": iframe in uploaded file.\n" );
+
                        return true;
                }
 
@@ -1291,69 +1377,105 @@ abstract class UploadBase {
                        $value = strtolower( $value );
 
                        if ( substr( $stripped, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with javascript target
                        if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded (text/xml) svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set/animate to add event-handler attribute to parent
-                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' )
+                               && $stripped == 'attributename'
+                               && substr( $value, 0, 2 ) == 'on'
+                       ) {
+                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add href attribute to parent element
-                       if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'attributename'
+                               && strpos( $value, 'href' ) !== false
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add a remote / data / script target to an element
-                       if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'to'
+                               && preg_match( '!(http|https|data|script):!sim', $value )
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use handler attribute with remote / data / script
                        if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script "
+                                       . "'$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use CSS styles to bring in remote code
                        # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-                       if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                       $tagsList = "font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke";
+                       if ( $stripped == 'style'
+                               && preg_match_all(
+                                       '!((?:' . $tagsList . ')\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim',
+                                       $value,
+                                       $matches
+                               )
+                       ) {
                                foreach ( $matches[1] as $match ) {
-                                       if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
-                                               wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+                                       if ( !preg_match( '!(?:' . $tagsList . ')\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+                                               wfDebug( __METHOD__ . ": Found svg setting a style with "
+                                                       . "remote url '$attrib'='$value' in uploaded file.\n" );
+
                                                return true;
                                        }
                                }
                        }
 
                        # image filters can pull in url, which could be svg that executes scripts
-                       if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( $strippedElement == 'image'
+                               && $stripped == 'filter'
+                               && preg_match( '!url\s*\(!sim', $value )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found image filter with url: "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
-
                }
 
                return false; //No scripts detected
@@ -1369,6 +1491,7 @@ abstract class UploadBase {
                $parts = explode( ':', strtolower( $element ) );
                $name = array_pop( $parts );
                $ns = implode( ':', $parts );
+
                return array( $ns, $name );
        }
 
@@ -1379,6 +1502,7 @@ abstract class UploadBase {
        private function stripXmlNamespace( $name ) {
                // 'http://www.w3.org/2000/svg:script' -> 'script'
                $parts = explode( ':', strtolower( $name ) );
+
                return array_pop( $parts );
        }
 
@@ -1399,6 +1523,7 @@ abstract class UploadBase {
                if ( !$wgAntivirus ) {
                        wfDebug( __METHOD__ . ": virus scanner disabled\n" );
                        wfProfileOut( __METHOD__ );
+
                        return null;
                }
 
@@ -1407,6 +1532,7 @@ abstract class UploadBase {
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
                        wfProfileOut( __METHOD__ );
+
                        return wfMessage( 'virus-unknownscanner' )->text() . " $wgAntivirus";
                }
 
@@ -1451,7 +1577,9 @@ abstract class UploadBase {
                        # scan failed (code was mapped to false by $exitCodeMap)
                        wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" );
 
-                       $output = $wgAntivirusRequired ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text() : null;
+                       $output = $wgAntivirusRequired
+                               ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text()
+                               : null;
                } elseif ( $mappedCode === AV_SCAN_ABORTED ) {
                        # scan failed because filetype is unknown (probably imune)
                        wfDebug( __METHOD__ . ": unsupported file type $file (code $exitCode).\n" );
@@ -1478,6 +1606,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $output;
        }
 
@@ -1589,7 +1718,7 @@ abstract class UploadBase {
 
                // Check for files with the same name but a different extension
                $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
-                               "{$partname}.", 1 );
+                       "{$partname}.", 1 );
                if ( count( $similarFiles ) ) {
                        return array(
                                'warning' => 'exists-normalized',
@@ -1600,7 +1729,10 @@ abstract class UploadBase {
 
                if ( self::isThumbName( $file->getName() ) ) {
                        # Check for filenames like 50px- or 180px-, these are mostly thumbnails
-                       $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
+                       $nt_thb = Title::newFromText(
+                               substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension,
+                               NS_FILE
+                       );
                        $file_thb = wfLocalFile( $nt_thb );
                        if ( $file_thb->exists() ) {
                                return array(
@@ -1639,11 +1771,12 @@ abstract class UploadBase {
        public static function isThumbName( $filename ) {
                $n = strrpos( $filename, '.' );
                $partname = $n ? substr( $filename, 0, $n ) : $filename;
+
                return (
-                                       substr( $partname, 3, 3 ) == 'px-' ||
-                                       substr( $partname, 2, 3 ) == 'px-'
-                               ) &&
-                               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
+                       substr( $partname, 3, 3 ) == 'px-' ||
+                       substr( $partname, 2, 3 ) == 'px-'
+               ) &&
+               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
        }
 
        /**
@@ -1670,23 +1803,28 @@ abstract class UploadBase {
                                $blacklist[] = trim( $line );
                        }
                }
+
                return $blacklist;
        }
 
        /**
         * Gets image info about the file just uploaded.
         *
-        * Also has the effect of setting metadata to be an 'indexed tag name' in returned API result if
-        * 'metadata' was requested. Oddly, we have to pass the "result" object down just so it can do that
-        * with the appropriate format, presumably.
+        * Also has the effect of setting metadata to be an 'indexed tag name' in
+        * returned API result if 'metadata' was requested. Oddly, we have to pass
+        * the "result" object down just so it can do that with the appropriate
+        * format, presumably.
         *
         * @param ApiResult $result
         * @return array Image info
         */
        public function getImageInfo( $result ) {
                $file = $this->getLocalFile();
-               // TODO This cries out for refactoring. We really want to say $file->getAllInfo(); here.
-               // Perhaps "info" methods should be moved into files, and the API should just wrap them in queries.
+               /** @todo This cries out for refactoring.
+                *  We really want to say $file->getAllInfo(); here.
+                * Perhaps "info" methods should be moved into files, and the API should
+                * just wrap them in queries.
+                */
                if ( $file instanceof UploadStashFile ) {
                        $imParam = ApiQueryStashImageInfo::getPropertyNames();
                        $info = ApiQueryStashImageInfo::getInfo( $file, array_flip( $imParam ), $result );
@@ -1694,6 +1832,7 @@ abstract class UploadBase {
                        $imParam = ApiQueryImageInfo::getPropertyNames();
                        $info = ApiQueryImageInfo::getInfo( $file, array_flip( $imParam ), $result );
                }
+
                return $info;
        }
 
@@ -1704,6 +1843,7 @@ abstract class UploadBase {
        public function convertVerifyErrorToStatus( $error ) {
                $code = $error['status'];
                unset( $code['status'] );
+
                return Status::newFatal( $this->getVerificationErrorCode( $code ), $error );
        }
 
index d15ae43..6f90280 100644 (file)
@@ -87,6 +87,7 @@ class UploadFromChunks extends UploadFromFile {
 
                // Update db table to reflect initial "chunk" state
                $this->updateChunkStatus();
+
                return $this->mLocalFile;
        }
 
@@ -154,6 +155,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $ret['status'] !== UploadBase::OK ) {
                        wfDebugLog( 'fileconcatenate', "Verification failed for chunked upload" );
                        $status->fatal( $this->getVerificationErrorCode( $ret['status'] ) );
+
                        return $status;
                }
 
@@ -178,6 +180,7 @@ class UploadFromChunks extends UploadFromFile {
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
+
                return $rv;
        }
 
@@ -188,11 +191,11 @@ class UploadFromChunks extends UploadFromFile {
         */
        function getVirtualChunkLocation( $index ) {
                return $this->repo->getVirtualUrl( 'temp' ) .
-                               '/' .
-                               $this->repo->getHashPath(
-                                       $this->getChunkFileKey( $index )
-                               ) .
-                               $this->getChunkFileKey( $index );
+                       '/' .
+                       $this->repo->getHashPath(
+                               $this->getChunkFileKey( $index )
+                       ) .
+                       $this->getChunkFileKey( $index );
        }
 
        /**
@@ -234,6 +237,7 @@ class UploadFromChunks extends UploadFromFile {
                                $status = Status::newFatal( 'invalid-chunk-offset' );
                        }
                }
+
                return $status;
        }
 
@@ -242,7 +246,7 @@ class UploadFromChunks extends UploadFromFile {
         */
        private function updateChunkStatus() {
                wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
-                                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
+                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                $dbw = $this->repo->getMasterDb();
                // Use a quick transaction since we will upload the full temp file into shared
@@ -294,6 +298,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $this->mChunkIndex !== null ) {
                        return $this->mChunkIndex;
                }
+
                return 0;
        }
 
@@ -305,6 +310,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $this->mOffset !== null ) {
                        return $this->mOffset;
                }
+
                return 0;
        }
 
@@ -325,19 +331,20 @@ class UploadFromChunks extends UploadFromFile {
                        $this->repo->getZonePath( 'temp' ) . "/{$hashPath}{$fileKey}" );
 
                // Check for error in stashing the chunk:
-               if ( ! $storeStatus->isOK() ) {
+               if ( !$storeStatus->isOK() ) {
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
                        throw new UploadChunkFileException( "Error storing file in '$chunkPath': " .
                                implode( '; ', $error ) );
                }
+
                return $storeStatus;
        }
 
@@ -345,6 +352,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $index === null ) {
                        $index = $this->getChunkIndex();
                }
+
                return $this->mFileKey . '.' . $index;
        }
 
index 5bc040c..3a1e8bd 100644 (file)
@@ -28,7 +28,6 @@
  * @author Bryan Tong Minh
  */
 class UploadFromFile extends UploadBase {
-
        /**
         * @var WebRequestUpload
         */
index a67fc57..b4e815f 100644 (file)
@@ -157,6 +157,7 @@ class UploadFromStash extends UploadBase {
                // replace mLocalFile with an instance of UploadStashFile, which adds some methods
                // that are useful for stashed files.
                $this->mLocalFile = parent::stashFile( $user );
+
                return $this->mLocalFile;
        }
 
@@ -187,6 +188,7 @@ class UploadFromStash extends UploadBase {
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
                $this->unsaveUploadedFile();
+
                return $rv;
        }
 }
index 9ebd7a9..b605640 100644 (file)
@@ -49,6 +49,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$user->isAllowed( 'upload_by_url' ) ) {
                        return 'upload_by_url';
                }
+
                return parent::isAllowed( $user );
        }
 
@@ -58,6 +59,7 @@ class UploadFromUrl extends UploadBase {
         */
        public static function isEnabled() {
                global $wgAllowCopyUploads;
+
                return $wgAllowCopyUploads && parent::isEnabled();
        }
 
@@ -103,6 +105,7 @@ class UploadFromUrl extends UploadBase {
                        }
                        */
                }
+
                return $valid;
        }
 
@@ -118,6 +121,7 @@ class UploadFromUrl extends UploadBase {
                        wfRunHooks( 'IsUploadAllowedFromUrl', array( $url, &$allowed ) );
                        self::$allowedUrls[$url] = $allowed;
                }
+
                return self::$allowedUrls[$url];
        }
 
@@ -169,6 +173,7 @@ class UploadFromUrl extends UploadBase {
                global $wgUser;
 
                $url = $request->getVal( 'wpUploadFileURL' );
+
                return !empty( $url )
                        && Http::isValidURI( $url )
                        && $wgUser->isAllowed( 'upload_by_url' );
@@ -202,6 +207,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$this->mAsync ) {
                        return $this->reallyFetchFile( $httpOptions );
                }
+
                return Status::newGood();
        }
 
@@ -213,6 +219,7 @@ class UploadFromUrl extends UploadBase {
        protected function makeTemporaryFile() {
                $tmpFile = TempFSFile::factory( 'URL' );
                $tmpFile->bind( $this );
+
                return $tmpFile->getPath();
        }
 
@@ -259,12 +266,12 @@ class UploadFromUrl extends UploadBase {
                $this->mRemoveTempFile = true;
                $this->mFileSize = 0;
 
-               $options = $httpOptions + array(
-                       'followRedirects' => true,
-               );
+               $options = $httpOptions + array( 'followRedirects' => true );
+
                if ( $wgCopyUploadProxy !== false ) {
                        $options['proxy'] = $wgCopyUploadProxy;
                }
+
                if ( $wgCopyUploadTimeout && !isset( $options['timeout'] ) ) {
                        $options['timeout'] = $wgCopyUploadTimeout;
                }
@@ -297,6 +304,7 @@ class UploadFromUrl extends UploadBase {
                if ( $this->mAsync ) {
                        return array( 'status' => UploadBase::OK );
                }
+
                return parent::verifyUpload();
        }
 
@@ -308,8 +316,10 @@ class UploadFromUrl extends UploadBase {
        public function checkWarnings() {
                if ( $this->mAsync ) {
                        $this->mIgnoreWarnings = false;
+
                        return array();
                }
+
                return parent::checkWarnings();
        }
 
@@ -323,6 +333,7 @@ class UploadFromUrl extends UploadBase {
                if ( $this->mAsync ) {
                        return true;
                }
+
                return parent::verifyTitlePermissions( $user );
        }
 
@@ -367,7 +378,7 @@ class UploadFromUrl extends UploadBase {
                ) );
                $job->initializeSessionData();
                JobQueueGroup::singleton()->push( $job );
+
                return $sessionKey;
        }
-
 }
index 33cb0db..a7e7100 100644 (file)
 
 /**
  * UploadStash is intended to accomplish a few things:
- *   - enable applications to temporarily stash files without publishing them to the wiki.
- *      - Several parts of MediaWiki do this in similar ways: UploadBase, UploadWizard, and FirefoggChunkedExtension
- *        And there are several that reimplement stashing from scratch, in idiosyncratic ways. The idea is to unify them all here.
- *       Mostly all of them are the same except for storing some custom fields, which we subsume into the data array.
- *   - enable applications to find said files later, as long as the db table or temp files haven't been purged.
- *   - enable the uploading user (and *ONLY* the uploading user) to access said files, and thumbnails of said files, via a URL.
- *     We accomplish this using a database table, with ownership checking as you might expect. See SpecialUploadStash, which
- *     implements a web interface to some files stored this way.
+ *   - Enable applications to temporarily stash files without publishing them to
+ *     the wiki.
+ *      - Several parts of MediaWiki do this in similar ways: UploadBase,
+ *        UploadWizard, and FirefoggChunkedExtension.
+ *        And there are several that reimplement stashing from scratch, in
+ *        idiosyncratic ways. The idea is to unify them all here.
+ *        Mostly all of them are the same except for storing some custom fields,
+ *        which we subsume into the data array.
+ *   - Enable applications to find said files later, as long as the db table or
+ *     temp files haven't been purged.
+ *   - Enable the uploading user (and *ONLY* the uploading user) to access said
+ *     files, and thumbnails of said files, via a URL. We accomplish this using
+ *     a database table, with ownership checking as you might expect. See
+ *     SpecialUploadStash, which implements a web interface to some files stored
+ *     this way.
  *
- * UploadStash right now is *mostly* intended to show you one user's slice of the entire stash. The user parameter is only optional
- * because there are few cases where we clean out the stash from an automated script. In the future we might refactor this.
+ * UploadStash right now is *mostly* intended to show you one user's slice of
+ * the entire stash. The user parameter is only optional because there are few
+ * cases where we clean out the stash from an automated script. In the future we
+ * might refactor this.
  *
  * UploadStash represents the entire stash of temporary files.
  * UploadStashFile is a filestore for the actual physical disk files.
- * UploadFromStash extends UploadBase, and represents a single stashed file as it is moved from the stash to the regular file repository
+ * UploadFromStash extends UploadBase, and represents a single stashed file as
+ * it is moved from the stash to the regular file repository
  *
  * @ingroup Upload
  */
 class UploadStash {
-
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
 
@@ -95,7 +104,8 @@ class UploadStash {
 
        /**
         * Get a file and its metadata from the stash.
-        * The noAuth param is a bit janky but is required for automated scripts which clean out the stash.
+        * The noAuth param is a bit janky but is required for automated scripts
+        * which clean out the stash.
         *
         * @param string $key Key under which file information is stored
         * @param bool $noAuth (optional) Don't check authentication. Used by maintenance scripts.
@@ -106,7 +116,7 @@ class UploadStash {
         * @return UploadStashFile
         */
        public function getFile( $key, $noAuth = false ) {
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -117,7 +127,8 @@ class UploadStash {
 
                if ( !isset( $this->fileMetadata[$key] ) ) {
                        if ( !$this->fetchFileMetadata( $key ) ) {
-                               // If nothing was received, it's likely due to replication lag.  Check the master to see if the record is there.
+                               // If nothing was received, it's likely due to replication lag.
+                               // Check the master to see if the record is there.
                                $this->fetchFileMetadata( $key, DB_MASTER );
                        }
 
@@ -138,14 +149,15 @@ class UploadStash {
                        }
                }
 
-               if ( ! $this->files[$key]->exists() ) {
+               if ( !$this->files[$key]->exists() ) {
                        wfDebug( __METHOD__ . " tried to get file at $key, but it doesn't exist\n" );
                        throw new UploadStashBadPathException( "path doesn't exist" );
                }
 
                if ( !$noAuth ) {
                        if ( $this->fileMetadata[$key]['us_user'] != $this->userId ) {
-                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't belong to the current user." );
+                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't "
+                                       . "belong to the current user." );
                        }
                }
 
@@ -160,6 +172,7 @@ class UploadStash {
         */
        public function getMetadata( $key ) {
                $this->getFile( $key );
+
                return $this->fileMetadata[$key];
        }
 
@@ -171,14 +184,17 @@ class UploadStash {
         */
        public function getFileProps( $key ) {
                $this->getFile( $key );
+
                return $this->fileProps[$key];
        }
 
        /**
-        * Stash a file in a temp directory and record that we did this in the database, along with other metadata.
+        * Stash a file in a temp directory and record that we did this in the
+        * database, along with other metadata.
         *
         * @param string $path Path to file you want stashed
-        * @param string $sourceType The type of upload that generated this file (currently, I believe, 'file' or null)
+        * @param string $sourceType The type of upload that generated this file
+        *   (currently, I believe, 'file' or null)
         * @throws UploadStashBadPathException
         * @throws UploadStashFileException
         * @throws UploadStashNotLoggedInException
@@ -201,10 +217,11 @@ class UploadStash {
                        $pathWithGoodExtension = $path;
                }
 
-               // If no key was supplied, make one.  a mysql insertid would be totally reasonable here, except
-               // that for historical reasons, the key is this random thing instead.  At least it's not guessable.
+               // If no key was supplied, make one.  a mysql insertid would be totally
+               // reasonable here, except that for historical reasons, the key is this
+               // random thing instead.  At least it's not guessable.
                //
-               // some things that when combined will make a suitably unique key.
+               // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
                $usec = substr( $usec, 2 );
@@ -215,7 +232,7 @@ class UploadStash {
 
                $this->fileProps[$key] = $fileProps;
 
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -224,30 +241,36 @@ class UploadStash {
                // if not already in a temporary area, put it there
                $storeStatus = $this->repo->storeTemp( basename( $pathWithGoodExtension ), $path );
 
-               if ( ! $storeStatus->isOK() ) {
-                       // It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
-                       // are available. We use reset() to pick the "first" thing that was wrong, preferring errors to warnings.
-                       // This is a bit lame, as we may have more info in the $storeStatus and we're throwing it away, but to fix it means
+               if ( !$storeStatus->isOK() ) {
+                       // It is a convention in MediaWiki to only return one error per API
+                       // exception, even if multiple errors are available. We use reset()
+                       // to pick the "first" thing that was wrong, preferring errors to
+                       // warnings. This is a bit lame, as we may have more info in the
+                       // $storeStatus and we're throwing it away, but to fix it means
                        // redesigning API errors significantly.
-                       // $storeStatus->value just contains the virtual URL (if anything) which is probably useless to the caller
+                       // $storeStatus->value just contains the virtual URL (if anything)
+                       // which is probably useless to the caller.
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
-                       // at this point, $error should contain the single "most important" error, plus any parameters.
+                       // At this point, $error should contain the single "most important"
+                       // error, plus any parameters.
                        $errorMsg = array_shift( $error );
-                       throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $errorMsg, $error )->text() );
+                       throw new UploadStashFileException( "Error storing file in '$path': "
+                               . wfMessage( $errorMsg, $error )->text() );
                }
                $stashPath = $storeStatus->value;
 
                // fetch the current user ID
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                // insert the file metadata into the db.
@@ -279,7 +302,8 @@ class UploadStash {
                        __METHOD__
                );
 
-               // store the insertid in the class variable so immediate retrieval (possibly laggy) isn't necesary.
+               // store the insertid in the class variable so immediate retrieval
+               // (possibly laggy) isn't necesary.
                $this->fileMetadata[$key]['us_id'] = $dbw->insertId();
 
                # create the UploadStashFile object for this file.
@@ -297,7 +321,8 @@ class UploadStash {
         */
        public function clear() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" );
@@ -319,18 +344,20 @@ class UploadStash {
         * Remove a particular file from the stash.  Also removes it from the repo.
         *
         * @param string $key
-        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
+        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException
+        * @throws UploadStashWrongOwnerException
         * @return bool Success
         */
        public function removeFile( $key ) {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbw = $this->repo->getMasterDb();
 
-               // this is a cheap query. it runs on the master so that this function still works when there's lag.
-               // it won't be called all that often.
+               // this is a cheap query. it runs on the master so that this function
+               // still works when there's lag. It won't be called all that often.
                $row = $dbw->selectRow(
                        'uploadstash',
                        'us_user',
@@ -343,7 +370,8 @@ class UploadStash {
                }
 
                if ( $row->us_user != $this->userId ) {
-                       throw new UploadStashWrongOwnerException( "Can't delete: the file ($key) doesn't belong to this user." );
+                       throw new UploadStashWrongOwnerException( "Can't delete: "
+                               . "the file ($key) doesn't belong to this user." );
                }
 
                return $this->removeFileNoAuth( $key );
@@ -369,8 +397,9 @@ class UploadStash {
                        __METHOD__
                );
 
-               // TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
-               // for now, ignore.
+               /** @todo Look into UnregisteredLocalFile and find out why the rv here is
+                *  sometimes wrong (false when file was removed). For now, ignore.
+                */
                $this->files[$key]->remove();
 
                unset( $this->files[$key] );
@@ -387,7 +416,8 @@ class UploadStash {
         */
        public function listFiles() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbr = $this->repo->getSlaveDb();
@@ -451,6 +481,7 @@ class UploadStash {
                        // put it in a web accesible directory.
                        return '';
                }
+
                return $extension;
        }
 
@@ -502,6 +533,7 @@ class UploadStash {
                        throw new UploadStashZeroLengthFileException( "File is zero length" );
                }
                $this->files[$key] = $file;
+
                return true;
        }
 }
@@ -512,8 +544,10 @@ class UploadStashFile extends UnregisteredLocalFile {
        protected $url;
 
        /**
-        * A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
-        * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
+        * A LocalFile wrapper around a file that has been temporarily stashed,
+        * so we can do things like create thumbnails for it. Arguably
+        * UnregisteredLocalFile should be handling its own file repo but that
+        * class is a bit retarded currently.
         *
         * @param FileRepo $repo Repository where we should find the path
         * @param string $path Path to file
@@ -528,18 +562,21 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( $repo->isVirtualUrl( $path ) ) {
                        $path = $repo->resolveVirtualUrl( $path );
                } else {
-
-                       // check if path appears to be sane, no parent traversals, and is in this repo's temp zone.
+                       // check if path appears to be sane, no parent traversals,
+                       // and is in this repo's temp zone.
                        $repoTempPath = $repo->getZonePath( 'temp' );
-                       if ( ( ! $repo->validateFilename( $path ) ) ||
-                                       ( strpos( $path, $repoTempPath ) !== 0 ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not valid\n" );
+                       if ( ( !$repo->validateFilename( $path ) ) ||
+                               ( strpos( $path, $repoTempPath ) !== 0 )
+                       ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile "
+                                       . "from a file that should already exist at '$path', but path is not valid\n" );
                                throw new UploadStashBadPathException( 'path is not valid' );
                        }
 
                        // check if path exists! and is a plain file.
-                       if ( ! $repo->fileExists( $path ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not found\n" );
+                       if ( !$repo->fileExists( $path ) ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile from "
+                                       . "a file that should already exist at '$path', but path is not found\n" );
                                throw new UploadStashFileNotFoundException( 'cannot find path, or not a plain file' );
                        }
                }
@@ -552,8 +589,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * A method needed by the file transforming and scaling routines in File.php
         * We do not necessarily care about doing the description at this point
-        * However, we also can't return the empty string, as the rest of MediaWiki demands this (and calls to imagemagick
-        * convert require it to be there)
+        * However, we also can't return the empty string, as the rest of MediaWiki
+        * demands this (and calls to imagemagick convert require it to be there)
         *
         * @return string Dummy value
         */
@@ -566,14 +603,17 @@ class UploadStashFile extends UnregisteredLocalFile {
         * The actual argument is the result of thumbName although we seem to have
         * buggy code elsewhere that expects a boolean 'suffix'
         *
-        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
-        * @return string Path thumbnail should take on filesystem, or containing directory if thumbname is false
+        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ),
+        *   or false to just get the path
+        * @return string Path thumbnail should take on filesystem, or containing
+        *   directory if thumbname is false
         */
        public function getThumbPath( $thumbName = false ) {
                $path = dirname( $this->path );
                if ( $thumbName !== false ) {
                        $path .= "/$thumbName";
                }
+
                return $path;
        }
 
@@ -591,7 +631,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
+        * Helper function -- given a 'subpage', return the local URL,
+        * e.g. /wiki/Special:UploadStash/subpage
         * @param string $subPage
         * @return string Local URL for this subpage in the Special:UploadStash space.
         */
@@ -602,14 +643,16 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * Get a URL to access the thumbnail
         * This is required because the model of how files work requires that
-        * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
-        * (that's hidden in the db)
+        * the thumbnail urls be predictable. However, in our model the URL is
+        * not based on the filename (that's hidden in the db)
         *
-        * @param string $thumbName Basename of thumbnail file -- however, we don't want to use the file exactly
+        * @param string $thumbName Basename of thumbnail file -- however, we don't
+        *   want to use the file exactly
         * @return string URL to access thumbnail, or URL with partial path
         */
        public function getThumbUrl( $thumbName = false ) {
                wfDebug( __METHOD__ . " getting for $thumbName \n" );
+
                return $this->getSpecialUrl( 'thumb/' . $this->getUrlName() . '/' . $thumbName );
        }
 
@@ -620,9 +663,10 @@ class UploadStashFile extends UnregisteredLocalFile {
         * @return string Base url name, like '120px-123456.jpg'
         */
        public function getUrlName() {
-               if ( ! $this->urlName ) {
+               if ( !$this->urlName ) {
                        $this->urlName = $this->fileKey;
                }
+
                return $this->urlName;
        }
 
@@ -636,12 +680,14 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( !isset( $this->url ) ) {
                        $this->url = $this->getSpecialUrl( 'file/' . $this->getUrlName() );
                }
+
                return $this->url;
        }
 
        /**
-        * Parent classes use this method, for no obvious reason, to return the path (relative to wiki root, I assume).
-        * But with this class, the URL is unrelated to the path.
+        * Parent classes use this method, for no obvious reason, to return the path
+        * (relative to wiki root, I assume). But with this class, the URL is
+        * unrelated to the path.
         *
         * @return string Url
         */
@@ -650,7 +696,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Getter for file key (the unique id by which this file's location & metadata is stored in the db)
+        * Getter for file key (the unique id by which this file's location &
+        * metadata is stored in the db)
         *
         * @return string File key
         */
@@ -674,15 +721,32 @@ class UploadStashFile extends UnregisteredLocalFile {
        public function exists() {
                return $this->repo->fileExists( $this->path );
        }
+}
+
+class UploadStashException extends MWException {
+}
+
+class UploadStashNotAvailableException extends UploadStashException {
+}
+
+class UploadStashFileNotFoundException extends UploadStashException {
+}
+
+class UploadStashBadPathException extends UploadStashException {
+}
+
+class UploadStashFileException extends UploadStashException {
+}
+
+class UploadStashZeroLengthFileException extends UploadStashException {
+}
+
+class UploadStashNotLoggedInException extends UploadStashException {
+}
+
+class UploadStashWrongOwnerException extends UploadStashException {
+}
 
+class UploadStashNoSuchKeyException extends UploadStashException {
 }
 
-class UploadStashException extends MWException {};
-class UploadStashNotAvailableException extends UploadStashException {};
-class UploadStashFileNotFoundException extends UploadStashException {};
-class UploadStashBadPathException extends UploadStashException {};
-class UploadStashFileException extends UploadStashException {};
-class UploadStashZeroLengthFileException extends UploadStashException {};
-class UploadStashNotLoggedInException extends UploadStashException {};
-class UploadStashWrongOwnerException extends UploadStashException {};
-class UploadStashNoSuchKeyException extends UploadStashException {};
index 037663c..b6df18b 100644 (file)
@@ -109,7 +109,9 @@ class ArrayUtils {
         * @return int|bool The item index of the lower bound, or false if the target value
         *     sorts before all items.
         */
-       public static function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+       public static function findLowerBound( $valueCallback, $valueCount,
+               $comparisonCallback, $target
+       ) {
                if ( $valueCount === 0 ) {
                        return false;
                }
index f556ee7..b16d4a4 100644 (file)
@@ -158,4 +158,5 @@ abstract class CdbWriter {
  * Exception for Cdb errors.
  * This explicitly doesn't subclass MWException to encourage reuse.
  */
-class CdbException extends Exception {}
+class CdbException extends Exception {
+}
index c178ffe..baba580 100644 (file)
@@ -101,28 +101,28 @@ class CdbFunctions {
  */
 class CdbReaderPHP extends CdbReader {
        /** The filename */
-       var $fileName;
+       protected $fileName;
 
        /* number of hash slots searched under this key */
-       var $loop;
+       protected $loop;
 
        /* initialized if loop is nonzero */
-       var $khash;
+       protected $khash;
 
        /* initialized if loop is nonzero */
-       var $kpos;
+       protected $kpos;
 
        /* initialized if loop is nonzero */
-       var $hpos;
+       protected $hpos;
 
        /* initialized if loop is nonzero */
-       var $hslots;
+       protected $hslots;
 
        /* initialized if findNext() returns true */
-       var $dpos;
+       protected $dpos;
 
        /* initialized if cdb_findnext() returns 1 */
-       var $dlen;
+       protected $dlen;
 
        /**
         * @param $fileName string
@@ -288,8 +288,11 @@ class CdbReaderPHP extends CdbReader {
  * CDB writer class
  */
 class CdbWriterPHP extends CdbWriter {
-       var $hplist;
-       var $numentries, $pos;
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
 
        /**
         * @param $fileName string
diff --git a/includes/utils/ConfEditor.php b/includes/utils/ConfEditor.php
deleted file mode 100644 (file)
index a2fe507..0000000
+++ /dev/null
@@ -1,1125 +0,0 @@
-<?php
-/**
- * Configuration file editor.
- *
- * 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
- *
- * @file
- */
-
-/**
- * This is a state machine style parser with two internal stacks:
- *   * A next state stack, which determines the state the machine will progress to next
- *   * A path stack, which keeps track of the logical location in the file.
- *
- * Reference grammar:
- *
- * file = T_OPEN_TAG *statement
- * statement = T_VARIABLE "=" expression ";"
- * expression = array / scalar / T_VARIABLE
- * array = T_ARRAY "(" [ element *( "," element ) [ "," ] ] ")"
- * element = assoc-element / expression
- * assoc-element = scalar T_DOUBLE_ARROW expression
- * scalar = T_LNUMBER / T_DNUMBER / T_STRING / T_CONSTANT_ENCAPSED_STRING
- */
-class ConfEditor {
-       /** The text to parse */
-       var $text;
-
-       /** The token array from token_get_all() */
-       var $tokens;
-
-       /** The current position in the token array */
-       var $pos;
-
-       /** The current 1-based line number */
-       var $lineNum;
-
-       /** The current 1-based column number */
-       var $colNum;
-
-       /** The current 0-based byte number */
-       var $byteNum;
-
-       /** The current ConfEditorToken object */
-       var $currentToken;
-
-       /** The previous ConfEditorToken object */
-       var $prevToken;
-
-       /**
-        * The state machine stack. This is an array of strings where the topmost
-        * element will be popped off and become the next parser state.
-        */
-       var $stateStack;
-
-       /**
-        * The path stack is a stack of associative arrays with the following elements:
-        *    name              The name of top level of the path
-        *    level             The level (number of elements) of the path
-        *    startByte         The byte offset of the start of the path
-        *    startToken        The token offset of the start
-        *    endByte           The byte offset of thee
-        *    endToken          The token offset of the end, plus one
-        *    valueStartToken   The start token offset of the value part
-        *    valueStartByte    The start byte offset of the value part
-        *    valueEndToken     The end token offset of the value part, plus one
-        *    valueEndByte      The end byte offset of the value part, plus one
-        *    nextArrayIndex    The next numeric array index at this level
-        *    hasComma          True if the array element ends with a comma
-        *    arrowByte         The byte offset of the "=>", or false if there isn't one
-        */
-       var $pathStack;
-
-       /**
-        * The elements of the top of the pathStack for every path encountered, indexed
-        * by slash-separated path.
-        */
-       var $pathInfo;
-
-       /**
-        * Next serial number for whitespace placeholder paths (\@extra-N)
-        */
-       var $serial;
-
-       /**
-        * Editor state. This consists of the internal copy/insert operations which
-        * are applied to the source string to obtain the destination string.
-        */
-       var $edits;
-
-       /**
-        * Simple entry point for command-line testing
-        *
-        * @param $text string
-        *
-        * @return string
-        */
-       static function test( $text ) {
-               try {
-                       $ce = new self( $text );
-                       $ce->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       return $e->getMessage() . "\n" . $e->highlight( $text );
-               }
-
-               return "OK";
-       }
-
-       /**
-        * Construct a new parser
-        */
-       public function __construct( $text ) {
-               $this->text = $text;
-       }
-
-       /**
-        * Edit the text. Returns the edited text.
-        * @param array $ops of operations.
-        *
-        * Operations are given as an associative array, with members:
-        *    type:     One of delete, set, append or insert (required)
-        *    path:     The path to operate on (required)
-        *    key:      The array key to insert/append, with PHP quotes
-        *    value:    The value, with PHP quotes
-        *
-        * delete
-        *    Deletes an array element or statement with the specified path.
-        *    e.g.
-        *        array('type' => 'delete', 'path' => '$foo/bar/baz' )
-        *    is equivalent to the runtime PHP code:
-        *        unset( $foo['bar']['baz'] );
-        *
-        * set
-        *    Sets the value of an array element. If the element doesn't exist, it
-        *    is appended to the array. If it does exist, the value is set, with
-        *    comments and indenting preserved.
-        *
-        * append
-        *    Appends a new element to the end of the array. Adds a trailing comma.
-        *    e.g.
-        *        array( 'type' => 'append', 'path', '$foo/bar',
-        *            'key' => 'baz', 'value' => "'x'" )
-        *    is like the PHP code:
-        *        $foo['bar']['baz'] = 'x';
-        *
-        * insert
-        *    Insert a new element at the start of the array.
-        *
-        * @throws MWException
-        * @return string
-        */
-       public function edit( $ops ) {
-               $this->parse();
-
-               $this->edits = array(
-                       array( 'copy', 0, strlen( $this->text ) )
-               );
-               foreach ( $ops as $op ) {
-                       $type = $op['type'];
-                       $path = $op['path'];
-                       $value = isset( $op['value'] ) ? $op['value'] : null;
-                       $key = isset( $op['key'] ) ? $op['key'] : null;
-
-                       switch ( $type ) {
-                               case 'delete':
-                                       list( $start, $end ) = $this->findDeletionRegion( $path );
-                                       $this->replaceSourceRegion( $start, $end, false );
-                                       break;
-                               case 'set':
-                                       if ( isset( $this->pathInfo[$path] ) ) {
-                                               list( $start, $end ) = $this->findValueRegion( $path );
-                                               $encValue = $value; // var_export( $value, true );
-                                               $this->replaceSourceRegion( $start, $end, $encValue );
-                                               break;
-                                       }
-                                       // No existing path, fall through to append
-                                       $slashPos = strrpos( $path, '/' );
-                                       $key = var_export( substr( $path, $slashPos + 1 ), true );
-                                       $path = substr( $path, 0, $slashPos );
-                                       // Fall through
-                               case 'append':
-                                       // Find the last array element
-                                       $lastEltPath = $this->findLastArrayElement( $path );
-                                       if ( $lastEltPath === false ) {
-                                               throw new MWException( "Can't find any element of array \"$path\"" );
-                                       }
-                                       $lastEltInfo = $this->pathInfo[$lastEltPath];
-
-                                       // Has it got a comma already?
-                                       if ( strpos( $lastEltPath, '@extra' ) === false && !$lastEltInfo['hasComma'] ) {
-                                               // No comma, insert one after the value region
-                                               list( , $end ) = $this->findValueRegion( $lastEltPath );
-                                               $this->replaceSourceRegion( $end - 1, $end - 1, ',' );
-                                       }
-
-                                       // Make the text to insert
-                                       list( $start, $end ) = $this->findDeletionRegion( $lastEltPath );
-
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $lastEltInfo['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $end, $end, $textToInsert );
-                                       break;
-                               case 'insert':
-                                       // Find first array element
-                                       $firstEltPath = $this->findFirstArrayElement( $path );
-                                       if ( $firstEltPath === false ) {
-                                               throw new MWException( "Can't find array element of \"$path\"" );
-                                       }
-                                       list( $start, ) = $this->findDeletionRegion( $firstEltPath );
-                                       $info = $this->pathInfo[$firstEltPath];
-
-                                       // Make the text to insert
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $info['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $start, $start, $textToInsert );
-                                       break;
-                               default:
-                                       throw new MWException( "Unrecognised operation: \"$type\"" );
-                       }
-               }
-
-               // Do the edits
-               $out = '';
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] == 'copy' ) {
-                               $out .= substr( $this->text, $edit[1], $edit[2] - $edit[1] );
-                       } else { // if ( $edit[0] == 'insert' )
-                               $out .= $edit[1];
-                       }
-               }
-
-               // Do a second parse as a sanity check
-               $this->text = $out;
-               try {
-                       $this->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       throw new MWException(
-                               "Sorry, ConfEditor broke the file during editing and it won't parse anymore: " .
-                               $e->getMessage() );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Get the variables defined in the text
-        * @return array( varname => value )
-        */
-       function getVars() {
-               $vars = array();
-               $this->parse();
-               foreach ( $this->pathInfo as $path => $data ) {
-                       if ( $path[0] != '$' ) {
-                               continue;
-                       }
-                       $trimmedPath = substr( $path, 1 );
-                       $name = $data['name'];
-                       if ( $name[0] == '@' ) {
-                               continue;
-                       }
-                       if ( $name[0] == '$' ) {
-                               $name = substr( $name, 1 );
-                       }
-                       $parentPath = substr( $trimmedPath, 0,
-                               strlen( $trimmedPath ) - strlen( $name ) );
-                       if ( substr( $parentPath, -1 ) == '/' ) {
-                               $parentPath = substr( $parentPath, 0, -1 );
-                       }
-
-                       $value = substr( $this->text, $data['valueStartByte'],
-                               $data['valueEndByte'] - $data['valueStartByte']
-                       );
-                       $this->setVar( $vars, $parentPath, $name,
-                               $this->parseScalar( $value ) );
-               }
-
-               return $vars;
-       }
-
-       /**
-        * Set a value in an array, unless it's set already. For instance,
-        * setVar( $arr, 'foo/bar', 'baz', 3 ); will set
-        * $arr['foo']['bar']['baz'] = 3;
-        * @param $array array
-        * @param string $path slash-delimited path
-        * @param $key mixed Key
-        * @param $value mixed Value
-        */
-       function setVar( &$array, $path, $key, $value ) {
-               $pathArr = explode( '/', $path );
-               $target =& $array;
-               if ( $path !== '' ) {
-                       foreach ( $pathArr as $p ) {
-                               if ( !isset( $target[$p] ) ) {
-                                       $target[$p] = array();
-                               }
-                               $target =& $target[$p];
-                       }
-               }
-               if ( !isset( $target[$key] ) ) {
-                       $target[$key] = $value;
-               }
-       }
-
-       /**
-        * Parse a scalar value in PHP
-        * @return mixed Parsed value
-        */
-       function parseScalar( $str ) {
-               if ( $str !== '' && $str[0] == '\'' ) {
-                       // Single-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return strtr( substr( trim( $str ), 1, -1 ),
-                               array( '\\\'' => '\'', '\\\\' => '\\' ) );
-               }
-               if ( $str !== '' && $str[0] == '"' ) {
-                       // Double-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return stripcslashes( substr( trim( $str ), 1, -1 ) );
-               }
-               if ( substr( $str, 0, 4 ) == 'true' ) {
-                       return true;
-               }
-               if ( substr( $str, 0, 5 ) == 'false' ) {
-                       return false;
-               }
-               if ( substr( $str, 0, 4 ) == 'null' ) {
-                       return null;
-               }
-
-               // Must be some kind of numeric value, so let PHP's weak typing
-               // be useful for a change
-               return $str;
-       }
-
-       /**
-        * Replace the byte offset region of the source with $newText.
-        * Works by adding elements to the $this->edits array.
-        */
-       function replaceSourceRegion( $start, $end, $newText = false ) {
-               // Split all copy operations with a source corresponding to the region
-               // in question.
-               $newEdits = array();
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] !== 'copy' ) {
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       $copyStart = $edit[1];
-                       $copyEnd = $edit[2];
-                       if ( $start >= $copyEnd || $end <= $copyStart ) {
-                               // Outside this region
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       if ( ( $start < $copyStart && $end > $copyStart )
-                               || ( $start < $copyEnd && $end > $copyEnd )
-                       ) {
-                               throw new MWException( "Overlapping regions found, can't do the edit" );
-                       }
-                       // Split the copy
-                       $newEdits[] = array( 'copy', $copyStart, $start );
-                       if ( $newText !== false ) {
-                               $newEdits[] = array( 'insert', $newText );
-                       }
-                       $newEdits[] = array( 'copy', $end, $copyEnd );
-               }
-               $this->edits = $newEdits;
-       }
-
-       /**
-        * Finds the source byte region which you would want to delete, if $pathName
-        * was to be deleted. Includes the leading spaces and tabs, the trailing line
-        * break, and any comments in between.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findDeletionRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               // Find the start
-               $this->firstToken();
-               while ( $this->pos != $path['startToken'] ) {
-                       $this->nextToken();
-               }
-               $regionStart = $path['startByte'];
-               for ( $offset = -1; $offset >= -$this->pos; $offset-- ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               // If there is other content on the same line, don't move the start point
-                               // back, because that will cause the regions to overlap.
-                               $regionStart = $path['startByte'];
-                               break;
-                       }
-                       $lfPos = strrpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionStart -= strlen( $token->text );
-                       } else {
-                               // The line start does not include the LF
-                               $regionStart -= strlen( $token->text ) - $lfPos - 1;
-                               break;
-                       }
-               }
-               // Find the end
-               while ( $this->pos != $path['endToken'] ) {
-                       $this->nextToken();
-               }
-               $regionEnd = $path['endByte']; // past the end
-               $count = count( $this->tokens );
-               for ( $offset = 0; $offset < $count - $this->pos; $offset++ ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               break;
-                       }
-                       $lfPos = strpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionEnd += strlen( $token->text );
-                       } else {
-                               // This should point past the LF
-                               $regionEnd += $lfPos + 1;
-                               break;
-                       }
-               }
-
-               return array( $regionStart, $regionEnd );
-       }
-
-       /**
-        * Find the byte region in the source corresponding to the value part.
-        * This includes the quotes, but does not include the trailing comma
-        * or semicolon.
-        *
-        * The end position is the past-the-end (end + 1) value as per convention.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findValueRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               if ( $path['valueStartByte'] === false || $path['valueEndByte'] === false ) {
-                       throw new MWException( "Can't find value region for path \"$pathName\"" );
-               }
-
-               return array( $path['valueStartByte'], $path['valueEndByte'] );
-       }
-
-       /**
-        * Find the path name of the last element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findLastArrayElement( $path ) {
-               // Try for a real element
-               $lastEltPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part2 == '@' ) {
-                               // Do nothing
-                       } elseif ( $part1 == "$path/" ) {
-                               $lastEltPath = $candidatePath;
-                       } elseif ( $lastEltPath !== false ) {
-                               break;
-                       }
-               }
-               if ( $lastEltPath !== false ) {
-                       return $lastEltPath;
-               }
-
-               // Try for an interstitial element
-               $extraPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               $extraPath = $candidatePath;
-                       } elseif ( $extraPath !== false ) {
-                               break;
-                       }
-               }
-
-               return $extraPath;
-       }
-
-       /**
-        * Find the path name of first element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findFirstArrayElement( $path ) {
-               // Try for an ordinary element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part1 == "$path/" && $part2 != '@' ) {
-                               return $candidatePath;
-                       }
-               }
-
-               // Try for an interstitial element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               return $candidatePath;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the indent string which sits after a given start position.
-        * Returns false if the position is not at the start of the line.
-        * @return array
-        */
-       function getIndent( $pos, $key = false, $arrowPos = false ) {
-               $arrowIndent = ' ';
-               if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
-                       $indentLength = strspn( $this->text, " \t", $pos );
-                       $indent = substr( $this->text, $pos, $indentLength );
-               } else {
-                       $indent = false;
-               }
-               if ( $indent !== false && $arrowPos !== false ) {
-                       $arrowIndentLength = $arrowPos - $pos - $indentLength - strlen( $key );
-                       if ( $arrowIndentLength > 0 ) {
-                               $arrowIndent = str_repeat( ' ', $arrowIndentLength );
-                       }
-               }
-
-               return array( $indent, $arrowIndent );
-       }
-
-       /**
-        * Run the parser on the text. Throws an exception if the string does not
-        * match our defined subset of PHP syntax.
-        */
-       public function parse() {
-               $this->initParse();
-               $this->pushState( 'file' );
-               $this->pushPath( '@extra-' . ( $this->serial++ ) );
-               $token = $this->firstToken();
-
-               while ( !$token->isEnd() ) {
-                       $state = $this->popState();
-                       if ( !$state ) {
-                               $this->error( 'internal error: empty state stack' );
-                       }
-
-                       switch ( $state ) {
-                               case 'file':
-                                       $this->expect( T_OPEN_TAG );
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'file 2':
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'statement':
-                                       $token = $this->skipSpace();
-                                       if ( !$this->validatePath( $token->text ) ) {
-                                               $this->error( "Invalid variable name \"{$token->text}\"" );
-                                       }
-                                       $this->nextPath( $token->text );
-                                       $this->expect( T_VARIABLE );
-                                       $this->skipSpace();
-                                       $arrayAssign = false;
-                                       if ( $this->currentToken()->type == '[' ) {
-                                               $this->nextToken();
-                                               $token = $this->skipSpace();
-                                               if ( !$token->isScalar() ) {
-                                                       $this->error( "expected a string or number for the array key" );
-                                               }
-                                               if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                                       $text = $this->parseScalar( $token->text );
-                                               } else {
-                                                       $text = $token->text;
-                                               }
-                                               if ( !$this->validatePath( $text ) ) {
-                                                       $this->error( "Invalid associative array name \"$text\"" );
-                                               }
-                                               $this->pushPath( $text );
-                                               $this->nextToken();
-                                               $this->skipSpace();
-                                               $this->expect( ']' );
-                                               $this->skipSpace();
-                                               $arrayAssign = true;
-                                       }
-                                       $this->expect( '=' );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       if ( $arrayAssign ) {
-                                               $this->pushState( 'expression', 'array assign end' );
-                                       } else {
-                                               $this->pushState( 'expression', 'statement end' );
-                                       }
-                                       break;
-                               case 'array assign end':
-                               case 'statement end':
-                                       $this->endPathValue();
-                                       if ( $state == 'array assign end' ) {
-                                               $this->popPath();
-                                       }
-                                       $this->skipSpace();
-                                       $this->expect( ';' );
-                                       $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                       break;
-                               case 'expression':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == T_ARRAY ) {
-                                               $this->pushState( 'array' );
-                                       } elseif ( $token->isScalar() ) {
-                                               $this->nextToken();
-                                       } elseif ( $token->type == T_VARIABLE ) {
-                                               $this->nextToken();
-                                       } else {
-                                               $this->error( "expected simple expression" );
-                                       }
-                                       break;
-                               case 'array':
-                                       $this->skipSpace();
-                                       $this->expect( T_ARRAY );
-                                       $this->skipSpace();
-                                       $this->expect( '(' );
-                                       $this->skipSpace();
-                                       $this->pushPath( '@extra-' . ( $this->serial++ ) );
-                                       if ( $this->isAhead( ')' ) ) {
-                                               // Empty array
-                                               $this->pushState( 'array end' );
-                                       } else {
-                                               $this->pushState( 'element', 'array end' );
-                                       }
-                                       break;
-                               case 'array end':
-                                       $this->skipSpace();
-                                       $this->popPath();
-                                       $this->expect( ')' );
-                                       break;
-                               case 'element':
-                                       $token = $this->skipSpace();
-                                       // Look ahead to find the double arrow
-                                       if ( $token->isScalar() && $this->isAhead( T_DOUBLE_ARROW, 1 ) ) {
-                                               // Found associative element
-                                               $this->pushState( 'assoc-element', 'element end' );
-                                       } else {
-                                               // Not associative
-                                               $this->nextPath( '@next' );
-                                               $this->startPathValue();
-                                               $this->pushState( 'expression', 'element end' );
-                                       }
-                                       break;
-                               case 'element end':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == ',' ) {
-                                               $this->endPathValue();
-                                               $this->markComma();
-                                               $this->nextToken();
-                                               $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                               // Look ahead to find ending bracket
-                                               if ( $this->isAhead( ")" ) ) {
-                                                       // Found ending bracket, no continuation
-                                                       $this->skipSpace();
-                                               } else {
-                                                       // No ending bracket, continue to next element
-                                                       $this->pushState( 'element' );
-                                               }
-                                       } elseif ( $token->type == ')' ) {
-                                               // End array
-                                               $this->endPathValue();
-                                       } else {
-                                               $this->error( "expected the next array element or the end of the array" );
-                                       }
-                                       break;
-                               case 'assoc-element':
-                                       $token = $this->skipSpace();
-                                       if ( !$token->isScalar() ) {
-                                               $this->error( "expected a string or number for the array key" );
-                                       }
-                                       if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                               $text = $this->parseScalar( $token->text );
-                                       } else {
-                                               $text = $token->text;
-                                       }
-                                       if ( !$this->validatePath( $text ) ) {
-                                               $this->error( "Invalid associative array name \"$text\"" );
-                                       }
-                                       $this->nextPath( $text );
-                                       $this->nextToken();
-                                       $this->skipSpace();
-                                       $this->markArrow();
-                                       $this->expect( T_DOUBLE_ARROW );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       $this->pushState( 'expression' );
-                                       break;
-                       }
-               }
-               if ( count( $this->stateStack ) ) {
-                       $this->error( 'unexpected end of file' );
-               }
-               $this->popPath();
-       }
-
-       /**
-        * Initialise a parse.
-        */
-       protected function initParse() {
-               $this->tokens = token_get_all( $this->text );
-               $this->stateStack = array();
-               $this->pathStack = array();
-               $this->firstToken();
-               $this->pathInfo = array();
-               $this->serial = 1;
-       }
-
-       /**
-        * Set the parse position. Do not call this except from firstToken() and
-        * nextToken(), there is more to update than just the position.
-        */
-       protected function setPos( $pos ) {
-               $this->pos = $pos;
-               if ( $this->pos >= count( $this->tokens ) ) {
-                       $this->currentToken = ConfEditorToken::newEnd();
-               } else {
-                       $this->currentToken = $this->newTokenObj( $this->tokens[$this->pos] );
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Create a ConfEditorToken from an element of token_get_all()
-        * @return ConfEditorToken
-        */
-       function newTokenObj( $internalToken ) {
-               if ( is_array( $internalToken ) ) {
-                       return new ConfEditorToken( $internalToken[0], $internalToken[1] );
-               } else {
-                       return new ConfEditorToken( $internalToken, $internalToken );
-               }
-       }
-
-       /**
-        * Reset the parse position
-        */
-       function firstToken() {
-               $this->setPos( 0 );
-               $this->prevToken = ConfEditorToken::newEnd();
-               $this->lineNum = 1;
-               $this->colNum = 1;
-               $this->byteNum = 0;
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the current token
-        */
-       function currentToken() {
-               return $this->currentToken;
-       }
-
-       /**
-        * Advance the current position and return the resulting next token
-        */
-       function nextToken() {
-               if ( $this->currentToken ) {
-                       $text = $this->currentToken->text;
-                       $lfCount = substr_count( $text, "\n" );
-                       if ( $lfCount ) {
-                               $this->lineNum += $lfCount;
-                               $this->colNum = strlen( $text ) - strrpos( $text, "\n" );
-                       } else {
-                               $this->colNum += strlen( $text );
-                       }
-                       $this->byteNum += strlen( $text );
-               }
-               $this->prevToken = $this->currentToken;
-               $this->setPos( $this->pos + 1 );
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the token $offset steps ahead of the current position.
-        * $offset may be negative, to get tokens behind the current position.
-        * @return ConfEditorToken
-        */
-       function getTokenAhead( $offset ) {
-               $pos = $this->pos + $offset;
-               if ( $pos >= count( $this->tokens ) || $pos < 0 ) {
-                       return ConfEditorToken::newEnd();
-               } else {
-                       return $this->newTokenObj( $this->tokens[$pos] );
-               }
-       }
-
-       /**
-        * Advances the current position past any whitespace or comments
-        */
-       function skipSpace() {
-               while ( $this->currentToken && $this->currentToken->isSkip() ) {
-                       $this->nextToken();
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Throws an error if the current token is not of the given type, and
-        * then advances to the next position.
-        */
-       function expect( $type ) {
-               if ( $this->currentToken && $this->currentToken->type == $type ) {
-                       return $this->nextToken();
-               } else {
-                       $this->error( "expected " . $this->getTypeName( $type ) .
-                               ", got " . $this->getTypeName( $this->currentToken->type ) );
-               }
-       }
-
-       /**
-        * Push a state or two on to the state stack.
-        */
-       function pushState( $nextState, $stateAfterThat = null ) {
-               if ( $stateAfterThat !== null ) {
-                       $this->stateStack[] = $stateAfterThat;
-               }
-               $this->stateStack[] = $nextState;
-       }
-
-       /**
-        * Pop a state from the state stack.
-        * @return mixed
-        */
-       function popState() {
-               return array_pop( $this->stateStack );
-       }
-
-       /**
-        * Returns true if the user input path is valid.
-        * This exists to allow "/" and "@" to be reserved for string path keys
-        * @return bool
-        */
-       function validatePath( $path ) {
-               return strpos( $path, '/' ) === false && substr( $path, 0, 1 ) != '@';
-       }
-
-       /**
-        * Internal function to update some things at the end of a path region. Do
-        * not call except from popPath() or nextPath().
-        */
-       function endPath() {
-               $key = '';
-               foreach ( $this->pathStack as $pathInfo ) {
-                       if ( $key !== '' ) {
-                               $key .= '/';
-                       }
-                       $key .= $pathInfo['name'];
-               }
-               $pathInfo['endByte'] = $this->byteNum;
-               $pathInfo['endToken'] = $this->pos;
-               $this->pathInfo[$key] = $pathInfo;
-       }
-
-       /**
-        * Go up to a new path level, for example at the start of an array.
-        */
-       function pushPath( $path ) {
-               $this->pathStack[] = array(
-                       'name' => $path,
-                       'level' => count( $this->pathStack ) + 1,
-                       'startByte' => $this->byteNum,
-                       'startToken' => $this->pos,
-                       'valueStartToken' => false,
-                       'valueStartByte' => false,
-                       'valueEndToken' => false,
-                       'valueEndByte' => false,
-                       'nextArrayIndex' => 0,
-                       'hasComma' => false,
-                       'arrowByte' => false
-               );
-       }
-
-       /**
-        * Go down a path level, for example at the end of an array.
-        */
-       function popPath() {
-               $this->endPath();
-               array_pop( $this->pathStack );
-       }
-
-       /**
-        * Go to the next path on the same level. This ends the current path and
-        * starts a new one. If $path is \@next, the new path is set to the next
-        * numeric array element.
-        */
-       function nextPath( $path ) {
-               $this->endPath();
-               $i = count( $this->pathStack ) - 1;
-               if ( $path == '@next' ) {
-                       $nextArrayIndex =& $this->pathStack[$i]['nextArrayIndex'];
-                       $this->pathStack[$i]['name'] = $nextArrayIndex;
-                       $nextArrayIndex++;
-               } else {
-                       $this->pathStack[$i]['name'] = $path;
-               }
-               $this->pathStack[$i] =
-                       array(
-                               'startByte' => $this->byteNum,
-                               'startToken' => $this->pos,
-                               'valueStartToken' => false,
-                               'valueStartByte' => false,
-                               'valueEndToken' => false,
-                               'valueEndByte' => false,
-                               'hasComma' => false,
-                               'arrowByte' => false,
-                       ) + $this->pathStack[$i];
-       }
-
-       /**
-        * Mark the start of the value part of a path.
-        */
-       function startPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueStartToken'] = $this->pos;
-               $path['valueStartByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the end of the value part of a path.
-        */
-       function endPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueEndToken'] = $this->pos;
-               $path['valueEndByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the comma separator in an array element
-        */
-       function markComma() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['hasComma'] = true;
-       }
-
-       /**
-        * Mark the arrow separator in an associative array element
-        */
-       function markArrow() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['arrowByte'] = $this->byteNum;
-       }
-
-       /**
-        * Generate a parse error
-        */
-       function error( $msg ) {
-               throw new ConfEditorParseError( $this, $msg );
-       }
-
-       /**
-        * Get a readable name for the given token type.
-        * @return string
-        */
-       function getTypeName( $type ) {
-               if ( is_int( $type ) ) {
-                       return token_name( $type );
-               } else {
-                       return "\"$type\"";
-               }
-       }
-
-       /**
-        * Looks ahead to see if the given type is the next token type, starting
-        * from the current position plus the given offset. Skips any intervening
-        * whitespace.
-        * @return bool
-        */
-       function isAhead( $type, $offset = 0 ) {
-               $ahead = $offset;
-               $token = $this->getTokenAhead( $offset );
-               while ( !$token->isEnd() ) {
-                       if ( $token->isSkip() ) {
-                               $ahead++;
-                               $token = $this->getTokenAhead( $ahead );
-                               continue;
-                       } elseif ( $token->type == $type ) {
-                               // Found the type
-                               return true;
-                       } else {
-                               // Not found
-                               return false;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the previous token object
-        */
-       function prevToken() {
-               return $this->prevToken;
-       }
-
-       /**
-        * Echo a reasonably readable representation of the tokenizer array.
-        */
-       function dumpTokens() {
-               $out = '';
-               foreach ( $this->tokens as $token ) {
-                       $obj = $this->newTokenObj( $token );
-                       $out .= sprintf( "%-28s %s\n",
-                               $this->getTypeName( $obj->type ),
-                               addcslashes( $obj->text, "\0..\37" ) );
-               }
-               echo "<pre>" . htmlspecialchars( $out ) . "</pre>";
-       }
-}
-
-/**
- * Exception class for parse errors
- */
-class ConfEditorParseError extends MWException {
-       var $lineNum, $colNum;
-
-       function __construct( $editor, $msg ) {
-               $this->lineNum = $editor->lineNum;
-               $this->colNum = $editor->colNum;
-               parent::__construct( "Parse error on line {$editor->lineNum} " .
-                       "col {$editor->colNum}: $msg" );
-       }
-
-       function highlight( $text ) {
-               $lines = StringUtils::explode( "\n", $text );
-               foreach ( $lines as $lineNum => $line ) {
-                       if ( $lineNum == $this->lineNum - 1 ) {
-                               return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
-                       }
-               }
-
-               return '';
-       }
-}
-
-/**
- * Class to wrap a token from the tokenizer.
- */
-class ConfEditorToken {
-       var $type, $text;
-
-       static $scalarTypes = array( T_LNUMBER, T_DNUMBER, T_STRING, T_CONSTANT_ENCAPSED_STRING );
-       static $skipTypes = array( T_WHITESPACE, T_COMMENT, T_DOC_COMMENT );
-
-       static function newEnd() {
-               return new self( 'END', '' );
-       }
-
-       function __construct( $type, $text ) {
-               $this->type = $type;
-               $this->text = $text;
-       }
-
-       function isSkip() {
-               return in_array( $this->type, self::$skipTypes );
-       }
-
-       function isScalar() {
-               return in_array( $this->type, self::$scalarTypes );
-       }
-
-       function isEnd() {
-               return $this->type == 'END';
-       }
-}
index c7bb4f3..e2013b0 100644 (file)
@@ -278,7 +278,9 @@ class UIDGenerator {
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
                        try {
                                $cache = ObjectCache::newAccelerator( array() );
-                       } catch ( MWException $e ) {} // not supported
+                       } catch ( MWException $e ) {
+                               // not supported
+                       }
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
index 964cd9f..38d3af5 100644 (file)
@@ -1908,12 +1908,9 @@ class Language {
                        $data[0] = 'Offset';
                }
 
-               $minDiff = 0;
                if ( $data[0] == 'System' || $tz == '' ) {
-                       #  Global offset in minutes.
-                       if ( isset( $wgLocalTZoffset ) ) {
-                               $minDiff = $wgLocalTZoffset;
-                       }
+                       # Global offset in minutes.
+                       $minDiff = $wgLocalTZoffset;
                } elseif ( $data[0] == 'Offset' ) {
                        $minDiff = intval( $data[1] );
                } else {
index 98938b2..65d74e9 100644 (file)
@@ -754,6 +754,9 @@ class LanguageConverter {
                global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest;
                $isredir = $wgRequest->getText( 'redirect', 'yes' );
                $action = $wgRequest->getText( 'action' );
+               if ( $action == 'edit' && $wgRequest->getBool( 'redlink' ) ) {
+                       $action = 'view';
+               }
                $linkconvert = $wgRequest->getText( 'linkconvert', 'yes' );
                $disableLinkConversion = $wgDisableLangConversion
                        || $wgDisableTitleConversion;
index 64e08a2..838f0e6 100644 (file)
@@ -5,7 +5,8 @@
                        "Csisc",
                        "Kuwaity26",
                        "Malekbr",
-                       "아라"
+                       "아라",
+                       "Aħmedbaɛl"
                ]
        },
        "tog-underline": "ضع خطا تحت الوصلات:",
        "booksources-go": "اذهب",
        "log": "سجلات",
        "allpages": "kol ess'afa7at",
-       "alphaindexline": "$1 إلى $2",
        "allarticles": "kol ess'afa7at",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
+       "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
+       "watchlistedit-clear-titles": "Elɛanawin",
+       "watchlistedit-too-many": "Famma barcha pajet w'manajmouch nħotouhom lkol lahné",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 6ab0ee6..b2ba785 100644 (file)
        "permalink": "Permanente skakel",
        "print": "Druk",
        "view": "Wys",
+       "view-foreign": "Wys op $1",
        "edit": "Wysig",
+       "edit-local": "Wysig plaaslike beskrywing",
        "create": "Skep",
+       "create-local": "Voeg plaaslike beskrywing by",
        "editthispage": "Wysig hierdie bladsy",
        "create-this-page": "Skep hierdie bladsy",
        "delete": "Skrap",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "U versoek om af te teken is geïgnoreer omdat dit lyk asof dit deur 'n gebreekte webleser of instaanbediener gestuur is.",
        "createacct-another-realname-tip": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om u erkenning vir u werk te gee.",
+       "pt-login": "Meld aan",
+       "pt-login-button": "Meld aan",
+       "pt-createaccount": "Skep gebruiker",
+       "pt-userlogout": "Meld af",
        "php-mail-error-unknown": "Onbekende fout in PHP se mail()-funksie",
        "user-mail-no-addy": "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
        "user-mail-no-body": "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
        "edit-gone-missing": "Die bladsy is nie gewysig nie.\nDit lyk of dit verwyder is.",
        "edit-conflict": "Wysigingskonflik",
        "edit-no-change": "U wysiging was geignoreer omdat die teks nie verander is nie.",
+       "postedit-confirmation-created": "Die bladsy is geskep.",
+       "postedit-confirmation-restored": "Die bladsy is teruggeplaas.",
        "postedit-confirmation-saved": "U wysigings is gestoor.",
        "edit-already-exists": "Die bladsy is nie geskep nie.\nDit bestaan alreeds.",
        "defaultmessagetext": "Verstekteks",
        "search-section": "(afdeling $1)",
        "search-suggest": "Het u $1 bedoel?",
        "search-interwiki-caption": "Susterprojekte",
-       "search-interwiki-default": "$1 resultate:",
+       "search-interwiki-default": "Resultate van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwante",
        "searcheverything-enable": "Soek in alle naamruimtes",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
+       "rcshowhideminor-show": "Wys",
+       "rcshowhideminor-hide": "Versteek",
        "rcshowhidebots": "$1 robotte",
+       "rcshowhidebots-show": "Wys",
+       "rcshowhidebots-hide": "Versteek",
        "rcshowhideliu": "$1 geregistreerde gebruikers",
+       "rcshowhideliu-show": "Wys",
+       "rcshowhideliu-hide": "Versteek",
        "rcshowhideanons": "$1 anonieme gebruikers",
+       "rcshowhideanons-show": "Wys",
+       "rcshowhideanons-hide": "Versteek",
        "rcshowhidepatr": "$1 gekontroleerde wysigings",
+       "rcshowhidepatr-show": "Wys",
+       "rcshowhidepatr-hide": "Versteek",
        "rcshowhidemine": "$1 my wysigings",
+       "rcshowhidemine-show": "Wys",
+       "rcshowhidemine-hide": "Versteek",
        "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3",
        "diff": "verskil",
        "hist": "geskiedenis",
        "protectedpages": "Beskermde bladsye",
        "protectedpages-indef": "Slegs blokkades sonder vervaldatum",
        "protectedpages-cascade": "Slegs blokkades wat neergolf",
+       "protectedpages-noredirect": "Versteek aansture",
        "protectedpagesempty": "Geen bladsye is tans met die parameters beveilig nie.",
+       "protectedpages-timestamp": "Tydstip",
+       "protectedpages-page": "Bladsy",
+       "protectedpages-expiry": "Verval",
+       "protectedpages-reason": "Rede",
+       "protectedpages-unknown-timestamp": "Onbekend",
+       "protectedpages-unknown-performer": "Onbekende gebruiker",
        "protectedtitles": "Beskermde titels",
        "protectedtitlesempty": "Geen titels is tans met die parameters beveilig nie.",
        "listusers": "Gebruikerslys",
        "log-title-wildcard": "Soek bladsye wat met die naam begin",
        "showhideselectedlogentries": "Wys/versteek gekose logboekreëls",
        "allpages": "Alle bladsye",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende blad ($1)",
        "prevpage": "Vorige bladsye ($1)",
        "allpagesfrom": "Wys bladsye vanaf:",
        "listgrouprights-removegroup-self": "Die volgende {{PLURAL:$2|groep|groepe}} verwyder van eie gebruiker: $1",
        "listgrouprights-addgroup-self-all": "Alle groepe byvoeg tot eie gebruiker",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
+       "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories-name": "Boodskapnaam",
+       "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
+       "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "mailnologin": "Geen versendadres beskikbaar",
        "mailnologintext": "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
        "emailuser": "Stuur e-pos na hierdie gebruiker",
        "contributions-title": "$1 se bydraes",
        "mycontris": "Bydraes",
        "contribsub2": "Vir {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Die gebruiker \"$1\" is nie geregistreer nie.",
        "nocontribs": "Geen veranderinge wat by hierdie kriteria pas, is gevind nie.",
        "uctop": "(laaste wysiging)",
        "month": "Vanaf maand (en vroeër):",
        "sp-contributions-newbies-sub": "Vir nuwe gebruikers",
        "sp-contributions-newbies-title": "Bydraes van nuwe gebruikers",
        "sp-contributions-blocklog": "blokkeer-logboek",
+       "sp-contributions-suppresslog": "onderdrukte gebruikersbydraes",
        "sp-contributions-deleted": "geskrapte gebruikersbydraes",
        "sp-contributions-uploads": "oplaaie",
        "sp-contributions-logs": "logboeke",
        "blockip": "Blokkeer gebruiker",
        "blockip-legend": "Blokkeer gebruiker of IP-adres",
        "blockiptext": "Gebruik die vorm hier onder om skryftoegang vir 'n gebruiker of IP-adres in te trek.\nDit mag slegs as beskerming teen vandalisme en in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]] gedoen word.\nVul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat gevandaliseer is, aan).",
-       "ipadressorusername": "IP-adres of gebruikersnaam:",
+       "ipaddressorusername": "IP-adres of gebruikersnaam:",
        "ipbexpiry": "Duur:",
        "ipbreason": "Rede:",
        "ipbreason-dropdown": "*Algemene redes vir versperring\n** Invoeg van valse inligting\n** Skrap van bladsyinhoud\n** \"Spam\" van skakels na eksterne webwerwe\n** Invoeg van gemors op bladsye\n** Intimiderende gedrag (teistering)\n** Misbruik van veelvuldige rekeninge\n** Onaanvaarbare gebruikersnaam",
        "newimages-summary": "Die spesiale bladsy wys die nuutste lêers wat na die wiki opgelaai is.",
        "newimages-legend": "Filter",
        "newimages-label": "Lêernaam (of deel daarvan):",
-       "showhidebots": "($1 robotte)",
        "noimages": "Niks te sien nie.",
        "ilsubmit": "Soek",
        "bydate": "volgens datum",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies 'n opsie",
+       "htmlform-cloner-delete": "Verwyder",
+       "htmlform-cloner-required": "Ten minste één waarde verwag.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
index a1078aa..3752ef0 100644 (file)
        "blockip": "ተጠቃሚውን ለማገድ",
        "blockip-legend": "ተጠቃሚ ለማገድ",
        "blockiptext": "ከዚህ ታች ያለው ማመልከቻ በአንድ ቁጥር አድርሻ ወይም ብዕር ስም ላይ ማገጃ (ማዕቀብ) ለመጣል ይጠቀማል።  ይህ በ[[{{MediaWiki:Policy-url}}|መርመርያዎቻችን]] መሠረት ተንኮል ወይም ጉዳት ለመከልከል ብቻ እንዲደረግ ይገባል። ከዚህ ታች የተለየ ምክንያት (ለምሣሌ የተጎዳው ገጽ በማጠቆም) ይጻፉ።",
-       "ipadressorusername": "የቁ. አድራሻ ወይም የብዕር ስም፦",
+       "ipaddressorusername": "የቁ. አድራሻ ወይም የብዕር ስም፦",
        "ipbexpiry": "የሚያልቅበት፦",
        "ipbreason": "ምክንያቱ፦",
        "ipbreason-dropdown": "*ተራ የማገጃ ምክንያቶች\n** የሀሠት መረጃ መጨምር\n** ከገጾች ይዞታውን መደምሰስ\n** የ'ስፓም' ማያያዣ ማብዛት\n** እንቶ ፈንቶ መጨምር\n** ዛቻ ማብዛት\n** በአድራሻዎች ብዛት መተንኮል\n** የማይገባ ብዕር ስም",
        "newimages": "የአዳዲስ ሥዕሎች ማሳያ አዳራሽ",
        "imagelisttext": "$1 የተጨመሩ ሥእሎች ወይም ፋይሎች ከታች ይዘረዝራሉ ($2)።",
        "newimages-legend": "ማጣሪያ",
-       "showhidebots": "(«bots» $1)",
        "noimages": "ምንም የለም!",
        "ilsubmit": "ፍለጋ",
        "bydate": "በተጨመሩበት ወቅት",
index 1d54dbd..1c2bcae 100644 (file)
        "blockip": "Bloqueyar usuario",
        "blockip-legend": "Bloqueyar usuario",
        "blockiptext": "Replene o siguient formulario ta bloqueyar l'acceso\nd'escritura dende una cuenta d'usuario u una adreza IP especifica.\nIsto habría de fer-se nomás ta privar vandalismos, y d'alcuerdo con\nas [[{{MediaWiki:Policy-url}}|politicas]].\nEscriba a razón especifica ta o bloqueyo (por exemplo, quaternando\nas pachinas que s'han vandalizato).",
-       "ipadressorusername": "Adreza IP u nombre d'usuario",
+       "ipaddressorusername": "Adreza IP u nombre d'usuario",
        "ipbexpiry": "Circumducción:",
        "ipbreason": "Razón:",
        "ipbreason-dropdown": "*Razons comuns de bloqueyo\n** Meter información falsa\n** Borrar conteniu d'as pachinas\n** Fer publicidat ficando vinclos con atras pachinas web\n** Meter sinconisions u vasuera en as pachinas\n** Portar-se de traza intimidatoria u violenta / atosegar\n** Abusar de multiples cuentas\n** Nombre d'usuario inacceptable",
        "newimages-summary": "Ista pachina especial amuestra os zaguers fichers cargatos.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nombre d'o fichero (u bella parte d'el):",
-       "showhidebots": "($1 bots)",
        "noimages": "No bi ha cosa a veyer.",
        "ilsubmit": "Mirar",
        "bydate": "por a calendata",
index d97103a..2f93057 100644 (file)
        "right-move": "نقل الصفحات",
        "right-move-subpages": "نقل الصفحات مع صفحاتها الفرعية",
        "right-move-rootuserpages": "نقل صفحات المستخدمين الأساسية",
+       "right-move-categorypages": "انقل صفحات التصنيف",
        "right-movefile": "نقل الملفات",
        "right-suppressredirect": "عدم إنشاء تحويلة من الاسم القديم عند نقل صفحة",
        "right-upload": "رفع الملفات",
        "action-move": "نقل هذه الصفحة",
        "action-move-subpages": "نقل هذه الصفحة، وصفحاتها الفرعية",
        "action-move-rootuserpages": "نقل صفحات المستخدمين الأساسية",
+       "action-move-categorypages": "انقل صفحات التصنيف",
        "action-movefile": "نقل هذا الملف",
        "action-upload": "رفع هذا الملف",
        "action-reupload": "الكتابة على هذا الملف الموجود",
        "log-title-wildcard": "ابحث عن عناوين تبدأ بهذا النص",
        "showhideselectedlogentries": "إطهار/إخفاء سجلات الدخول المختارة",
        "allpages": "كل الصفحات",
-       "alphaindexline": "$1 إلى $2",
        "nextpage": "الصفحة التالية ($1)",
        "prevpage": "الصفحة السابقة ($1)",
        "allpagesfrom": "اعرض الصفحات ابتداء من:",
        "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
        "listgrouprights-namespaceprotection-namespace": "النطاق",
        "trackingcategories-name": "اسم الرسالة",
+       "trackingcategories-desc": "معايير إدراج تصنيف",
        "trackingcategories-disabled": "التصنيف غير مفعل",
        "mailnologin": "لا يوجد عنوان للإرسال",
        "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
        "blockip": "منع المستخدم",
        "blockip-legend": "منع المستخدم",
        "blockiptext": "استخدم النموذج التالي لمنع مستخدم، أو عنوان آيبي، معين من التعديل أو إنشاء حسابات جديدة. تُستخدم هذه العملية لمنع التخريب فقط، ويجب أن تتماشى مع [[{{MediaWiki:Policy-url}}|سياسة المنع]]. أدخل تعليلاً واضحًا لسبب المنع في الخانة المخصصة لذلك (مثلاً: ذكر صفحات محددة تمّ تخريبها من قبل المستخدم).",
-       "ipadressorusername": "عنوان الأيبي أو اسم المستخدم:",
+       "ipaddressorusername": "عنوان الأيبي أو اسم المستخدم:",
        "ipbexpiry": "مدة المنع:",
        "ipbreason": "السبب:",
        "ipbreason-dropdown": "*أسباب المنع الشائعة\n** كتابة معلومات زائفة\n** إزالة المحتوى من الصفحات\n** سبام وصلات لمواقع خارجية\n** كتابة كلام لا معنى له في الصفحات\n** سلوك عدواني\n** إساءة استخدام حسابات متعددة\n** اسم مستخدم غير مقبول",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
-       "showhidebots": "($1 بوتات)",
+       "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "noimages": "لا شيء للعرض.",
        "ilsubmit": "بحث",
        "bydate": "حسب التاريخ",
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+       "watchlistedit-clear-titles": "العناوين:",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 58b9e0b..ae9538a 100644 (file)
        "blockip": "منع يوزر",
        "blockip-legend": "منع اليوزر",
        "blockiptext": "استخدم الاستمارة اللى تحت لمنع عنوان أيبى أو يوزر معين من الكتابة.\nدا لازم يحصل بس علشان تمنع التخريب ،و على حسب\n[[{{MediaWiki:Policy-url}}|السياسة]].\nاكتب سبب محدد تحت (يعنى مثلا، اكتب الصفحات المعينة اللى اتخربت بسببه).",
-       "ipadressorusername": "عنوان الأيبى أو اسم اليوزر:",
+       "ipaddressorusername": "عنوان الأيبى أو اسم اليوزر:",
        "ipbexpiry": "مدة المنع:",
        "ipbreason": "السبب:",
        "ipbreason-dropdown": "*أسباب المنع المشهورة\n** تدخيل معلومات غلط\n** مسح المحتوى من الصفحات\n** سبام لينك لمواقع خارجية\n** كتابة كلام مالوش معنى فى الصفحات\n** سلوك عدواني/تحرش\n** إساءة استخدام اكتر من حسابات\n** اسم يوزر مش مقبول",
        "newimages-summary": "الصفحةالمخصوصة دى بتعرض آخر الملفات المتحملة",
        "newimages-legend": "اسم الملف",
        "newimages-label": "اسم الملف (او حتة منه):",
-       "showhidebots": "($1 بوتات)",
        "noimages": "مافيش حاجة للعرض.",
        "ilsubmit": "تدوير",
        "bydate": "على حسب التاريخ",
index 891f16d..b4bcaf5 100644 (file)
        "accmailtext": "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিকভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । \nএই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত শব্দতো সলনি কৰি ল’ব পাৰিব ।",
        "newarticle": "(নতুন)",
        "newarticletext": "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।\n\nইচ্ছা কৰিলে আপুনিয়েই এই প্ৰবন্ধটো লিখা আৰম্ভ কৰিব পাৰে। [$1 ইয়াত] সহায় পাব।\n\nআপুনি যদি ইয়ালৈ ভুলতে আহিছে, তেনেহলে আপোনাৰ ব্ৰাওজাৰৰ '''BACK''' বুটামত টিপা মাৰক।",
-       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87 à¥¤\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয à¥¤\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87 ।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
+       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87।\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয।\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
        "noarticletext": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই ।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}| এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>",
        "noarticletext-nopermission": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}|এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
        "action-edit": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
        "action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
-       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  সৃষ্টি কৰক",
+       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f সৃষ্টি কৰক",
        "action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
        "action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
        "action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
        "log-title-wildcard": "এই পাঠেৰে আৰম্ভ হোৱা শিৰোনামাসমূহ অনুসন্ধান কৰক",
        "showhideselectedlogentries": "নিৰ্বাচিত ল'গ ভুক্তি দেখুৱাওক/লুকুৱাওক",
        "allpages": "সকলোবোৰ পৃষ্ঠা",
-       "alphaindexline": "$1 -ৰ পৰা $2 -লৈ",
        "nextpage": "পৰৱৰ্তী পৃষ্ঠা ($1)",
        "prevpage": "পিছৰ পৃষ্ঠা($1)",
        "allpagesfrom": "ইয়াৰে আৰম্ভ হোৱা পৃষ্ঠাবোৰ দেখুৱাওক:",
        "blockip": "সদস্য বাৰণ কৰক",
        "blockip-legend": "সদস্য বাৰণ কৰক",
        "blockiptext": "তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি কোনো নিৰ্দিষ্ট আই.পি. ঠিকনা বা সদস্যনামৰ লিখাৰ অধিকাৰ বাৰণ কৰিব পাৰে ।\nকেৱল ধ্বংসপ্ৰৱণতা ৰোধ কৰিবলৈ আৰু [[{{MediaWiki:Policy-url}}|নীতি]] মানি চলি এনে কৰক ।\nতলত এটা নিৰ্দিষ্ট কাৰণ উল্লেখ কৰক (যেনে, ধ্বংসসাধন কৰা পৃষ্ঠাৰ নাম) ।",
-       "ipadressorusername": "আই-পি ঠিকনা বা সদস্যনাম:",
+       "ipaddressorusername": "আই-পি ঠিকনা বা সদস্যনাম:",
        "ipbexpiry": "ম্যাদ উকলিব:",
        "ipbreason": "কাৰণ:",
        "ipbreason-dropdown": "*প্ৰতিবন্ধকৰ সাধাৰণ কাৰণসমূহ\n** ভুল তথ্য দিয়া\n** পৃষ্ঠাৰ বিষয়বস্তু আঁতৰাই পেলোৱা\n** কোনো বাহিৰা চাইটলৈ স্পাম সংযোগ দিয়া\n** পৃষ্ঠাত অৰ্থহীন বিষয়বস্তু প্ৰৱেশ কৰোৱা\n** ভীতি উদ্ৰেককাৰী আচৰণ/হাৰাশাস্তি\n** একাধিক একাউণ্টৰ অপব্যৱহাৰ\n** অগ্ৰহণযোগ্য সদস্যনাম",
        "blocklogtext": "এই অভিলেখ অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।\nস্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।\nসাম্প্ৰতিক কাৰ্যৰত নিষেধ আৰু প্ৰতিবন্ধকৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।",
        "unblocklogentry": "$1 বাৰণ উঠাই লোৱা হ’ল",
        "block-log-flags-anononly": "কেৱল বেনামী সদস্য",
-       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
+       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ণ্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noautoblock": "স্বয়ংক্ৰিয়-প্ৰতিবন্ধক নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noemail": "ই-মেইল অৱৰোধ কৰা হৈছে",
        "block-log-flags-nousertalk": "নিজৰ কথা-বতৰা পৃষ্ঠা সম্পাদনা কৰিব নোৱাৰি",
        "block-log-flags-angry-autoblock": "বৰ্ধিত স্বয়ংক্ৰিয়-প্ৰতিবন্ধক সক্ৰিয় কৰা হৈছে",
        "block-log-flags-hiddenname": "সদস্যনাম গোপন কৰা হ’ল",
-       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।",
+       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে।",
        "ipb_expiry_invalid": "অবৈধ ম্যাদ উকলা সময়",
        "ipb_expiry_temp": "গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ’ব লাগিব ।",
        "ipb_hide_invalid": "এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত {{PLURAL:$1|এটা সম্পাদনা|$1টা সম্পাদনা}} আছে ।",
        "newimages-summary": "এই বিশেষ পৃষ্ঠাখনত সৰ্বশেষত আপল'ড কৰা ফাইলসমূহ দেখিব ।",
        "newimages-legend": "ছেকনী",
        "newimages-label": "নথিৰ নাম (বা তাৰ এটা অংশ)",
-       "showhidebots": "(বট $1)",
        "noimages": "চাবলৈ একো নাই ।",
        "ilsubmit": "সন্ধান কৰক",
        "bydate": "তাৰিখ অনুযায়ী",
index d23c839..6b1b0cc 100644 (file)
        "tog-hideminor": "Anubrir les ediciones menores nos cambeos recientes",
        "tog-hidepatrolled": "Anubrir les ediciones vixilaes nos cambeos recientes",
        "tog-newpageshidepatrolled": "Anubrir les páxines vixilaes na llista de páxines nueves",
-       "tog-extendwatchlist": "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
-       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de vixilancia",
+       "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
+       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
        "tog-showtoolbar": "Amosar la barra de ferramientes d'edición",
        "tog-editondblclick": "Editar páxines con doble clic",
        "tog-editsectiononrightclick": "Activar la edición de seiciones calcando col botón drechu nos títulos de seición",
-       "tog-watchcreations": "Amestar les páxines que creo y los ficheros que cargo a la mio llista de vixilancia",
-       "tog-watchdefault": "Amestar les páxines y ficheros qu'edito a la mio llista de vixilancia",
-       "tog-watchmoves": "Amestar les páxines y ficheros que muevo a la mio llista de vixilancia",
-       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicio a la mio llista de vixilancia",
+       "tog-watchcreations": "Amestar les páxines que cree y los ficheros que xuba a la mio llista de siguimientu",
+       "tog-watchdefault": "Amestar les páxines y ficheros qu'edite a la mio llista de siguimientu",
+       "tog-watchmoves": "Amestar les páxines y ficheros que tresllade a la mio llista de siguimientu",
+       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicie a la mio llista de siguimientu",
        "tog-minordefault": "Marcar toles ediciones como menores de mou predetermináu",
        "tog-previewontop": "Amosar previsualización enantes del cuadru d'edición",
        "tog-previewonfirst": "Amosar previsualización na primera edición",
-       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de vixilancia",
+       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de siguimientu",
        "tog-enotifusertalkpages": "Mandame un corréu cuando camude la mio páxina d'alderique",
        "tog-enotifminoredits": "Mandame tamién un corréu cuando heba ediciones menores de les páxines y ficheros",
        "tog-enotifrevealaddr": "Amosar la mio direición de corréu nos correos de notificación",
        "tog-fancysig": "Tratar la firma como testu wiki (ensin enllaz automáticu)",
        "tog-uselivepreview": "Usar vista previa en tiempu real (experimental)",
        "tog-forceeditsummary": "Avisame cuando grabe col resume d'edición en blanco",
-       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de vixilancia",
-       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de vixilancia",
-       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de vixilancia",
-       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
-       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
-       "tog-watchlisthidepatrolled": "Anubrir les ediciones vixilaes de la llista de vixilancia",
+       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de siguimientu",
+       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de siguimientu",
+       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de siguimientu",
+       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
+       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
+       "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esta páxina.\nPor favor espera un ratu enantes d'intentar otra vuelta entrar a esta páxina.\n\n$1",
+       "generic-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esti recursu.\nPor favor espera un momentu enantes d'intentar otra vuelta acceder a esti recursu.",
        "pool-timeout": "Tiempu escosáu esperando pal bloquéu",
        "pool-queuefull": "La cola de trabayu ta enllena",
        "pool-errorunknown": "Fallu desconocíu",
        "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
        "edit-conflict": "Conflictu d'edición.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
+       "postedit-confirmation-created": "Creóse la páxina.",
+       "postedit-confirmation-restored": "Restauróse la páxina.",
        "postedit-confirmation-saved": "Guardose la edición.",
        "edit-already-exists": "Nun pudo crease una páxina nueva.\nEsta yá esiste.",
        "defaultmessagetext": "Testu predetermináu",
        "prefs-user-pages": "Páxines d'usuariu",
        "prefs-personal": "Perfil del usuariu",
        "prefs-rc": "Cambios recientes",
-       "prefs-watchlist": "Llista de vixilancia",
-       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de vixilancia:",
+       "prefs-watchlist": "Llista de siguimientu",
+       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de siguimientu:",
        "prefs-watchlist-days-max": "Máximo $1 {{PLURAL:$1|día|díes}}",
-       "prefs-watchlist-edits": "Númberu d'ediciones qu'amosar na llista de vixilancia espandida:",
+       "prefs-watchlist-edits": "Númberu máximu d'ediciones qu'amosar na llista de siguimientu espandida:",
        "prefs-watchlist-edits-max": "Númberu máximu: 1000",
-       "prefs-watchlist-token": "Marca de la llista de vixilancia:",
+       "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
        "prefs-resetpass": "Camudar la conseña",
        "prefs-changeemail": "Camudar el corréu electrónicu",
        "right-move": "Treslladar páxines",
        "right-move-subpages": "Treslladar les páxines coles sos subpáxines",
        "right-move-rootuserpages": "Treslladar páxines d'un usuariu root",
+       "right-move-categorypages": "Treslladar les páxines de categoría",
        "right-movefile": "Treslladar archivos",
        "right-suppressredirect": "Nun crear una redireición dende'l nome antiguu cuando se tresllada una páxina",
        "right-upload": "Xubir ficheros",
        "action-createpage": "crear páxines",
        "action-createtalk": "crear páxines d'alderique",
        "action-createaccount": "crear esta cuenta d'usuariu",
+       "action-history": "ver l'historial d'esta páxina",
        "action-minoredit": "marcar esta edición como menor",
        "action-move": "treslladar esta páxina",
        "action-move-subpages": "treslladar esta páxina y les sos subpáxines",
        "action-move-rootuserpages": "treslladar páxines d'un usuariu root",
+       "action-move-categorypages": "treslladar les páxines de categoría",
        "action-movefile": "treslladar esti archivu",
        "action-upload": "xubir esti archivu",
        "action-reupload": "sobreescribir esti archivu esistente",
        "recentchangeslinked-feed": "Cambios rellacionaos",
        "recentchangeslinked-toolbox": "Cambios rellacionaos",
        "recentchangeslinked-title": "Cambios rellacionaos con \"$1\"",
-       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada). Les páxines de [[Special:Watchlist|la to llista de vixilancia]] tán en '''negrina'''.",
+       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
        "upload": "Xubir ficheru",
        "pageswithprop-prophidden-binary": "valor de propiedá binaria tapecíu ($1)",
        "doubleredirects": "Redireiciones dobles",
        "doubleredirectstext": "Esta páxina llista páxines que redireicionen a otres páxines de redireición.\nCada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu \"real\", onde tendría d'empobinar la primer redireición.\nLes entraes <del>tachaes</del> tan resueltes.",
-       "double-redirect-fixed-move": "[[$1]] foi treslladáu, agora ye una redireición haza [[$2]]",
-       "double-redirect-fixed-maintenance": "Iguando la doble redireición de [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] treslladóse.\nAnovóse automáticamente y agora redirixe haza [[$2]].",
+       "double-redirect-fixed-maintenance": "Iguando automáticamente la doble redireición de [[$1]] a [[$2]] nuna xera de mantenimientu.",
        "double-redirect-fixer": "Iguador de redireiciones",
        "brokenredirects": "Redireiciones rotes",
        "brokenredirectstext": "Les siguientes redireiciones enllacien a páxines non esistentes:",
        "log-title-wildcard": "Buscar títulos qu'emprimen con esti testu",
        "showhideselectedlogentries": "Amosar/anubrir les entraes del rexistru seleicionaes",
        "allpages": "Toles páxines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Páxina siguiente ($1)",
        "prevpage": "Páxina anterior ($1)",
        "allpagesfrom": "Amosar páxines qu'entamen por:",
        "emailuserfooter": "Esti corréu electrónicu unviolu $1 a $2 per aciu de la función \"Manda-y un corréu a un usuariu\" de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
-       "watchlist": "Llista de vixilancia",
-       "mywatchlist": "Llista de vixilancia",
+       "watchlist": "Llista de siguimientu",
+       "mywatchlist": "Llista de siguimientu",
        "watchlistfor2": "Pa $1 $2",
-       "nowatchlist": "La to llista de vixilancia ta vacia.",
-       "watchlistanontext": "Por favor $1 pa ver o editar entraes na to llista de vixilancia.",
+       "nowatchlist": "La to llista de siguimientu ta vacia.",
+       "watchlistanontext": "Tienes d'$1 pa ver o editar entraes de la to llista de siguimientu.",
        "watchnologin": "Non identificáu",
-       "addwatch": "Amestar a la llista de vixilancia",
-       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de vixilancia]].\nLos futuro cambeos nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
-       "removewatch": "Desaniciar de la llista de vixilancia",
-       "removedwatchtext": "Desapuntóse la páxina \"[[:$1]]\" de la [[Special:Watchlist|to llista de vixilancia]].",
+       "addwatch": "Amestar a la llista de siguimientu",
+       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de llista de siguimientu]].\nLos cambeos futuros nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
+       "removewatch": "Desaniciar de la llista de siguimientu",
+       "removedwatchtext": "La páxina \"[[:$1]]\" desanicióse de la [[Special:Watchlist|to llista de siguimientu]].",
        "watch": "Vixilar",
        "watchthispage": "Vixilar esta páxina",
        "unwatch": "Dexar de vixilar",
        "unwatchthispage": "Dexar de vixilar",
        "notanarticle": "Nun ye un artículu",
        "notvisiblerev": "Esborróse la revisión",
-       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia, ensin cuntar aparte les páxines d'alderique.",
+       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de siguimientu, ensin cuntar aparte les páxines d'alderique.",
        "wlheader-enotif": "La notificación per corréu electrónicu ta activada.",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
        "wlnote2": "Abaxo tan los cambios {{PLURAL:$1|na cabera hora|nes caberes <strong>$1</strong> hores}}, el día $2 a les $3.",
        "wlshowlast": "Amosar les últimes $1 hores $2 díes $3",
-       "watchlist-options": "Opciones de la llista de vixilancia",
+       "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
-       "watcherrortext": "Hebo un fallu al camudar la configuración de la to llista de vixilancia pa «$1».",
+       "watcherrortext": "Hebo un error al camudar la configuración de la to llista de siguimientu pa «$1».",
        "enotif_reset": "Marcar toles páxines visitaes",
        "enotif_impersonal_salutation": "Usuariu de {{SITENAME}}",
        "enotif_subject_deleted": "{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}",
        "enotif_lastvisited": "Mira en $1 pa ver tolos cambios dende la cabera visita.",
        "enotif_lastdiff": "Mira en $1 pa ver esti cambéu.",
        "enotif_anon_editor": "usuariu anónimu $1",
-       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPonte en contautu col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de vixilancia los marcadores de notificación de toles páxines que tengas vixilaes.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de vixilancia, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de vixilancia, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
+       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPa comunicate col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de siguimientu los marcadores de notificación de toles páxines que sigues.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de siguimientu, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de siguimientu, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
        "created": "creada",
        "changed": "camudada",
        "deletepage": "Esborrar páxina",
        "blockip": "Bloquiar usuariu",
        "blockip-legend": "Bloquiar usuariu",
        "blockiptext": "Usa'l siguiente formulariu pa bloquiar el permisu d'escritura a una IP o a un usuariu concretu.\nEsto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWiki:Policy-url}}|polítiques]]. Da un motivu específicu (como por exemplu citar páxines que fueron vandalizaes).",
-       "ipadressorusername": "Direición IP o nome d'usuariu:",
+       "ipaddressorusername": "Direición IP o nome d'usuariu:",
        "ipbexpiry": "Caducidá:",
        "ipbreason": "Motivu:",
        "ipbreason-dropdown": "*Motivos comunes de bloquéu\n** Enxertamientu d'información falso\n** Dexar les páxines en blanco\n** Enllaces spam a páxines esternes\n** Enxertamientu de babayaes/enguedeyos nes páxines\n** Comportamientu intimidatoriu o d'acosu\n** Abusu de cuentes múltiples\n** Nome d'usuariu inaceutable",
        "ipbnounblockself": "Nun tienes permisu pa desbloquiate tu mesmu",
        "lockdb": "Protexer la base de datos",
        "unlockdb": "Desprotexer la base de datos",
-       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de vixilancia y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que vas desbloquiar la base de datos cuando fines col mantenimientu.",
-       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de vixilancia y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
+       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de siguimientu y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que desbloquiarás la base de datos cuando fines col mantenimientu.",
+       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de siguimientu y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
        "lockconfirm": "Si, quiero candar daveres la base de datos.",
        "unlockconfirm": "Sí, quiero descandar daveres la base de datos.",
        "lockbtn": "Protexer la base de datos",
        "movepagetalktext": "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''\n*Yá esista una páxina d'alderique non vacia col nuevu nome, o\n*Desactives la caxella d'equí baxo.\n\nNestos casos vas tener que treslladar o fusionar la páxina manualmente.",
        "movearticle": "Treslladar la páxina:",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
+       "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "movenologintext": "Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.",
        "movenotallowed": "Nun tienes permisu pa mover páxines.",
        "movenotallowedfile": "Nun tienes permisu pa mover ficheros.",
        "cant-move-user-page": "Nun tienes permisu pa treslladar páxines d'usuariu (independientemente de les subpáxines).",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
+       "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
+       "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
        "newtitle": "Al títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "tooltip-ca-delete": "Desaniciar esta páxina",
        "tooltip-ca-undelete": "Restaura les ediciones feches nesta páxina enantes de que fuera esborrada",
        "tooltip-ca-move": "Tresllada esta páxina",
-       "tooltip-ca-watch": "Amiesta esta páxina na to llista de vixilancia",
-       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de vixilancia",
+       "tooltip-ca-watch": "Amiesta esta páxina a la to llista de siguimientu",
+       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de siguimientu",
        "tooltip-search": "Busca en {{SITENAME}}",
        "tooltip-search-go": "Dir a una páxina con esti nome exautu si esiste",
        "tooltip-search-fulltext": "Busca páxines con esti testu",
        "tooltip-preview": "Vista previa de los cambios, ¡usa esto enantes de guardar!",
        "tooltip-diff": "Amuesa los cambios que fixisti nel testu.",
        "tooltip-compareselectedversions": "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
-       "tooltip-watch": "Amiesta esta páxina a la to llista de vixilancia",
+       "tooltip-watch": "Amiesta esta páxina a la to llista de siguimientu",
        "tooltip-watchlistedit-normal-submit": "Desaniciar títulos",
        "tooltip-watchlistedit-raw-submit": "Anovar llista de vixilancia",
        "tooltip-recreate": "Vuelve a crear la páxina magar que se tenga esborrao",
        "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.",
        "newimages-legend": "Peñera",
        "newimages-label": "Nome d'archivu (o una parte d'él):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Ver les xubíes de los bots",
        "noimages": "Nun hai nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "size-gigabytes": "$1 XB",
        "lag-warn-normal": "Los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
        "lag-warn-high": "Pola mor d'un importante retrasu nel sirvidor de la base de datos, los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
-       "watchlistedit-normal-title": "Editar la llista de vixilancia",
-       "watchlistedit-normal-legend": "Eliminar títulos de la llista de vixilancia",
-       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia.\nPa desaniciar un títulu, marca la caxella d'al llau d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista en bruto]].",
+       "watchlistedit-normal-title": "Editar la llista de siguimientu",
+       "watchlistedit-normal-legend": "Quitar títulos de la llista de siguimientu",
+       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu.\nPa desaniciar un títulu, marca la caxella cabo d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista ensin formatu]].",
        "watchlistedit-normal-submit": "Desaniciar títulos",
-       "watchlistedit-normal-done": "{{PLURAL:$1|Eliminóse un títulu|Elimináronse $1 títulos}} de la to llista de vixilancia:",
-       "watchlistedit-raw-title": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-legend": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia, y puen editase amestándolos o desaniciándolos de la llista; un títulu per llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Desanicióse un títulu|Desaniciáronse $1 títulos}} de la to llista de siguimientu:",
+       "watchlistedit-raw-title": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-legend": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu, y puen editase amestándolos o desaniciándolos de la llista;\nun títulu por llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
        "watchlistedit-raw-titles": "Títulos:",
-       "watchlistedit-raw-submit": "Anovar llista de vixilancia",
-       "watchlistedit-raw-done": "La to llista de vixilancia foi actualizada.",
+       "watchlistedit-raw-submit": "Anovar la llista de siguimientu",
+       "watchlistedit-raw-done": "Anovóse la to llista de siguimientu.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Añadióse un títulu|Añadiéronse $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eliminóse ún títulu|Elimináronse $1 títulos}}:",
+       "watchlistedit-clear-title": "Llimpióse la llista de siguimientu",
+       "watchlistedit-clear-legend": "Llimpiar la llista de siguimientu",
+       "watchlistedit-clear-explain": "Desaniciaránse tolos títulos de la to llista de siguimientu",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)",
+       "watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:",
+       "watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.",
+       "watchlisttools-clear": "Llimpiar la llista de siguimientu",
        "watchlisttools-view": "Ver cambios relevantes",
-       "watchlisttools-edit": "Ver y editar la llista de vixilancia",
-       "watchlisttools-raw": "Editar la llista de vixilancia (en bruto)",
+       "watchlisttools-edit": "Ver y editar la llista de siguimientu",
+       "watchlisttools-raw": "Editar la llista de siguimientu (ensin formatu)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|alderique]])",
        "unknown_extension_tag": "Etiqueta d'estensión \"$1\" desconocida",
        "duplicate-defaultsort": "Avisu: La clave d'ordenación predeterminada \"$2\" anula la clave d'ordenación anterior \"$1\".",
        "htmlform-no": "Non",
        "htmlform-yes": "Sí",
        "htmlform-chosen-placeholder": "Seleicione una opción",
+       "htmlform-cloner-create": "Amestar más",
+       "htmlform-cloner-delete": "Desaniciar",
+       "htmlform-cloner-required": "Necesítase polo menos un valor.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "sqlite-no-fts": "$1 ensin sofitu pa busca de testu completu",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
index 4cdc88c..a93e2de 100644 (file)
        "blockip": "Elekara va IP mane ok favesik",
        "blockip-legend": "Elekara va favesik",
        "blockiptext": "Ta suterafa elekara va vansara male pilkovafe IP mane ok favesikyolt va vlevefa erurateza favel !\nMana sabegara zo goskur ta weyonara va cidara is dotrakason va [[{{MediaWiki:Policy-url}}|gotarkan vexeem]].\nVa lazavanha (tulon ozwason va cidayanu bu se) vlevon bazel !",
-       "ipadressorusername": "IP mane ok favesikyolt",
+       "ipaddressorusername": "IP mane ok favesikyolt",
        "ipbexpiry": "Elekaracek",
        "ipbreason": "Elekaradanda :",
        "ipbcreateaccount": "Djira va pataredura",
        "newimages-summary": "Batu aptafu bu va ironokaf kalvajayan iyeltakeem nedir.",
        "newimages-legend": "Espara",
        "newimages-label": "Iyeltak (ok ki) :",
-       "showhidebots": "($1 stiernik)",
        "noimages": "Mecoba rowina",
        "ilsubmit": "Aneyara",
        "bydate": "kan evla",
index e5b0a6d..bd8c2bf 100644 (file)
        "unblock": "İstifadəçinin blokunu götür",
        "blockip": "İstifadəçini blokla",
        "blockip-legend": "İstifadəçinin bloklanması",
-       "ipadressorusername": "IP-ünvanı və ya istifadəçi adı",
+       "ipaddressorusername": "IP-ünvanı və ya istifadəçi adı",
        "ipbexpiry": "Bitmə müddəti:",
        "ipbreason": "Səbəb:",
        "ipbreason-dropdown": "*Bloklama səbəbləri:\n** Yalan məlumatların əlavə edilməsi\n** Səhifənin məzmununun silinməsi\n** Xarici saytlara spam-keçidlər\n** Səhifəyə mənasız və yararsız əlavələrə görə\n** Hədə və təqiblərə görə\n** Təhqirə görə\n** Çoxsaylı hesabdan sui istifadəyə görə\n** Qadağan olunmuş istifadəçi adına görə",
        "newimages": "Yeni faylların siyahısı",
        "newimages-legend": "Filtrlər",
        "newimages-label": "Faylın (və ya onun bir hissəsinin) adı:",
-       "showhidebots": "($1 bot redaktə)",
        "noimages": "Heç nəyi görməmək.",
        "ilsubmit": "Axtar",
        "bydate": "tarixə görə",
index 7315895..d86190a 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "باغلانتیلارین آلتینی خطله:",
-       "tog-hideminor": "سÙ\88Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©â\80\8cلری گیزلت",
-       "tog-hidepatrolled": "نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت",
-       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر سیاهی‌سیندان گیزلت",
-       "tog-extendwatchlist": "ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر",
+       "tog-underline": "باغلانتیلارین آلتینی خطله:",
+       "tog-hideminor": "سÙ\88Ù\92Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©لری گیزلت",
+       "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
+       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر لیستین‌دن گیزلت",
+       "tog-extendwatchlist": "گؤزله‌دیکلری، یالنیز یئنیلر اۆچون یوْخ، بۆتون دییشیکلیکلری گؤسترمک اۆچون، گئنیشلندیر.",
        "tog-usenewrc": "دَییشیکلیکلری سون دَییشیکلیکلر صحیفه‌سینده ایزله‌دیکلر صحیفه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)",
-       "tog-numberheadings": "باشلیق‌لاری اوتوماتیک نومره‌له",
-       "tog-showtoolbar": "دَییشدیرمه آراج چوبوغونو گؤستر",
-       "tog-editondblclick": "صحیفه‌‌لری ایکی کلیک‌ده دَییشدیر",
-       "tog-editsectiononrightclick": "بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
-       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يوکله‌دیگیم فايل‌لاری ایزله‌مه‌لریمه آرتیر",
-       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-minordefault": "دیفالت اولاراق بوتون دَییشدیر‌مه‌لریمی کیچیک دَییشدیر کیمی نیشانلا",
-       "tog-previewontop": "اؤن‌گؤستریشی يازماق قوتوسوندان قاباق گؤستر",
+       "tog-numberheadings": "باشلیقلاری اوْتوماتیک نۆمره‌له",
+       "tog-showtoolbar": "دَییشدیرمک آراج-چۇبوغونو گؤستر",
+       "tog-editondblclick": "صحیفه‌‌لری ایکی کیلیک‌ده دَییشدیر",
+       "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیقلارین اۆزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
+       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يۆکله‌دیگیم فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-minordefault": "وارساییلان اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی نیشانلا",
+       "tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤستر",
        "tog-previewonfirst": "ایلک دَییشدیرمه‌ده اؤن‌گؤستریشی گؤستر",
-       "tog-enotifwatchlistpages": "ایزله‌دیکلریم‌ده اولان صحیفه یوخسا فایل دَییشدیریلنده، منه ایمیل گؤندر",
+       "tog-enotifwatchlistpages": "گؤزله‌دیکلریم‌ده اولان بیر صحیفه یا فایل دَییشدیریلنده، منه ایمیل گؤندر",
        "tog-enotifusertalkpages": "دانیشیق صحیفه‌‌م دَییشدیریلنده منه ایمیل گؤندر",
        "tog-enotifminoredits": "صحیفه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر",
-       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø®Ø¨Ø± Ù\88ئرÙ\85Ù\87 ایمیل‌لرینده گؤستر",
-       "tog-shownumberswatching": "ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر",
+       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø¨Û\8cÙ\84دÛ\8cرÛ\8cØ´ ایمیل‌لرینده گؤستر",
+       "tog-shownumberswatching": "گؤزله‌ین ایستیفاده‌چیلرین سایینی گؤستر",
        "tog-oldsig": "ایندی‌کی ایمضا:",
-       "tog-fancysig": "ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)",
-       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تست مرحله‌سینده)",
+       "tog-fancysig": "ایمضانی ویکی-متن کیمی نظره آل (اوْتوماتیک باغلانتی‌سیز)",
+       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
        "tog-forceeditsummary": "دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر",
-       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidebots": "بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-ccmeonemails": "باشÙ\82ا Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88پیلرینی منه گؤندر",
-       "tog-diffonly": "موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
+       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidebots": "بوْت دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-ccmeonemails": "Ø¢Û\8cرÛ\8c Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88Ù\92پیلرینی منه گؤندر",
+       "tog-diffonly": "مۇقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
        "tog-showhiddencats": "گیزلی بؤلمه‌لری گؤستر",
        "tog-norollbackdiff": "قایتاراندان سونرا موقاییسه گؤسترمه",
-       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\87 Ú\86Û\8cØ®Û\8cØ´ Ø²Ø§Ù\85اÙ\86Û\8cØ\8c Ø¢Ú\86Û\8cÙ\82 Ù\88 Ù\82ئÛ\8cد Ø§Ù\88Ù\84Ù\85اÛ\8cاÙ\86 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87 Ù\88ارسا Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئرÛ\8cÙ\84سÛ\8cÙ\86",
+       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\86 Ú\86Û\8cخاÙ\86داØ\8c Ù\82ئÛ\8cد Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Û\8cØ´ Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ù\88Ù\92Ù\84ساØ\8c Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئر",
        "tog-prefershttps": "هر زامان گیریش ائتمگه امن باغلانتی ایشلت",
-       "underline-always": "همیشه",
+       "underline-always": "هر زامان",
        "underline-never": "هئچ واخت",
-       "underline-default": "دیفالت قابیق یوخسا براوزر",
-       "editfont-style": "دَییشدیرمه قوتوطونون فونت نؤوعو:",
-       "editfont-default": "براوزر دیفالتی",
-       "editfont-monospace": "ثابیت آرالی فونت",
-       "editfont-sansserif": "بوجاق‌سیز فونت",
-       "editfont-serif": "بوجاق‌لی فونت",
-       "sunday": "سود گونو(یکشنبه)",
-       "monday": "دوزگونو(دوشنبه)",
-       "tuesday": "آرا گون(سه‌شنبه)",
-       "wednesday": "اوْدگونو(چهارشنبه)",
-       "thursday": "سوگونو(پنجشنبه)",
-       "friday": "جÙ\88Ù\85ا(Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86)",
-       "saturday": "يئل‌گونو(شنبه)",
-       "sun": "سود گونو(یکشنبه)",
-       "mon": "دوزگونو(دوشنبه)",
-       "tue": "سÙ\87â\80\8cØ´Ù\86بÙ\87(آرا Ú¯Ù\88Ù\86)",
+       "underline-default": "وارساییلان قابیق یا براوزِر",
+       "editfont-style": "دَییشدیرمه قۇتوسونون فوْنتی:",
+       "editfont-default": "براوزِر وارساییلانی",
+       "editfont-monospace": "ثابÛ\8cت Ø¢Ø±Ø§Ù\84Û\8c Ù\81Ù\88Ù\92Ù\86ت",
+       "editfont-sansserif": "بۇجاق‌سیز فوْنت",
+       "editfont-serif": "بۇجاق‌لی فوْنت",
+       "sunday": "سۆدگونو (یکشنبه)",
+       "monday": "دۇزگونو (دوشنبه)",
+       "tuesday": "آراگون (سه‌شنبه)",
+       "wednesday": "اوْدگونو (چهارشنبه)",
+       "thursday": "سۇگونو (پنجشنبه)",
+       "friday": "Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86 (جÛ\86Ù\85عÙ\87)",
+       "saturday": "يئل‌گونو (شنبه)",
+       "sun": "سۆدگونو (یکشنبه)",
+       "mon": "دۇزگونو (دوشنبه)",
+       "tue": "آراگÙ\88Ù\86 (سÙ\87â\80\8cØ´Ù\86بÙ\87)",
        "wed": "اوْدگونو (چهارشنبه)",
-       "thu": "سوگونو(پنجشنبه)",
-       "fri": "آینی‌گون(جوما)",
-       "sat": "يئل‌گونو(شنبه)",
+       "thu": "سۇگونو (پنجشنبه)",
+       "fri": "آینی‌گون (جۆمعه)",
+       "sat": "يئل‌گونو (شنبه)",
        "january": "ژانویه",
        "february": "فئوریه",
        "march": "مارس",
        "july": "ژولای",
        "august": "آقوست",
        "september": "سئپتامبر",
-       "october": "اوکتوبر",
-       "november": "نووامبر",
+       "october": "اوْکتوبر",
+       "november": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "december": "دئسامبر",
        "january-gen": "ژانویه",
-       "february-gen": "فوریه",
+       "february-gen": "فئوریه",
        "march-gen": "مارس",
        "april-gen": "آوریل",
-       "may-gen": "مِی",
+       "may-gen": "مئی",
        "june-gen": "ژوئن",
        "july-gen": "جولای",
        "august-gen": "آقوست",
        "jul": "ژولای",
        "aug": "آقوست",
        "sep": "سئپتامبر",
-       "oct": "اوکتوبر",
-       "nov": "نووامبر",
+       "oct": "اوْکتوبر",
+       "nov": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "dec": "دئسامبر",
        "january-date": "ژانویه‌نین $1-ی",
-       "february-date": "$1 فئوریه",
+       "february-date": "فئوریه‌نین $1-ی",
        "march-date": "مارسین $1-ی",
        "april-date": "آوریلین $1-ی",
-       "may-date": "$1 مئی",
+       "may-date": "مئیین $1-ی",
        "june-date": "ژوئنین $1-ی",
-       "july-date": "$1 ژولای",
-       "august-date": "$1 آقوست",
-       "september-date": "$1 سئپتامبر",
-       "october-date": "$1 اوکتوبر",
-       "november-date": "$1 نووامبر",
-       "december-date": "$1 دئسامبر",
+       "july-date": "ژولایین $1-ی",
+       "august-date": "آقوستون $1-ی",
+       "september-date": "سئپتامبرین $1-ی",
+       "october-date": "اوْکتوبرون $1-ی",
+       "november-date": "نوْوامبرین $1-ی",
+       "december-date": "دئسامبرین $1-ی",
        "pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
-       "category_header": "«$1» بؤلمه‌سین‌ده‌کی مقاله‌لر",
-       "subcategories": "آلت بؤلمه‌لر",
-       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
-       "category-empty": "''بو بؤلمه‌نین ایندی فایل یوخسا مئدیاسی یوخدور.''",
+       "category_header": "«$1» بؤلمه‌سین‌ده صحیفه‌لر",
+       "subcategories": "آلتبؤلمه‌لر",
+       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
+       "category-empty": "<em>بو بؤلمه‌ده ایندی فایل یا مئدیا یوْخدور.</em>",
        "hidden-categories": "{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}",
        "hidden-category-category": "گیزلی بؤلمه‌لر",
-       "category-subcat-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} آلت‌بؤلمه وار؛ بو بؤلمه‌نین جمعاً $2 آلت‌بؤلمه‌سی وار.",
-       "category-subcat-count-limited": "بو بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
-       "category-article-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} صحیفه وار؛ بو بؤلمه‌نین جمعاً $2 صحیفه‌سی وار.",
-       "category-article-count-limited": "بو بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|یارپاق|$1 یارپاق}} واردیر.",
-       "category-file-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} فایل وار؛ بو بؤلمه‌نین جمعاً $2 فایلی وار.",
-       "category-file-count-limited": "بؤلمه‌ده، بو {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
+       "category-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، توپلام $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
+       "category-subcat-count-limited": "بۇ بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
+       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی صحیفه واردیر.|بۇ بؤلمه‌ده توْپلام $2 صحیفه‌دن، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.}}",
+       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.",
+       "category-file-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی فایل واردیر.|بۇ بؤلمه‌ده توْپلام $1-دن، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.}}",
+       "category-file-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
        "listingcontinuesabbrev": "(قالانی)",
-       "index-category": "ایندئکس‌لشدیریلمیش یارپاقلار",
-       "noindex-category": "ایندئکس‌لشدیریلمه‌ین یارپاقلار",
-       "broken-file-category": "Ù\81اÛ\8cÙ\84â\80\8cÙ\84ارا Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\84اÙ\86 Û\8cارپاÙ\82Ù\84ار",
-       "about": "گؤره",
-       "article": "ایچری‌لی یارپاق",
+       "index-category": "ایندئکس‌لشدیریلمیش صحیفه‌لر",
+       "noindex-category": "ایندئکس‌لشدیریلمه‌میش صحیفه‌لر",
+       "broken-file-category": "Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ù\81اÛ\8cÙ\84 Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\92Ù\84اÙ\86 ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر",
+       "about": "حاقیندا",
+       "article": "ایچری‌لی صحیفه",
        "newwindow": "(یئنی پنجره‌ده آچیلیر)",
-       "cancel": "Ù\84غÙ\88 Ø§Ø¦Øª",
+       "cancel": "Ù\88ازگئÚ\86",
        "moredotdotdot": "داها...",
-       "morenotlisted": "بو لیست کامل دئییل.",
-       "mypage": "مقاله",
+       "morenotlisted": "بۇ لیست کامل دئییل.",
+       "mypage": "صحیفه",
        "mytalk": "دانیشیق",
        "anontalk": "بو آی‌پی آدرسینه دانیشیق",
-       "navigation": "دولانماق",
+       "navigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "and": "&#32;و",
        "qbfind": "تاپ",
-       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cد",
+       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cرت",
        "qbedit": "دَییشدیر",
-       "qbpageoptions": "بو صحیفه‌‌",
-       "qbmyoptions": "منیم صحیفه‌‌لریم",
-       "faq": "چوخ سوروشولان سواللار",
-       "faqpage": "Project:چوخلو سوروشولان سورغولار",
-       "vector-action-addsection": "قونو آرتیر",
+       "qbpageoptions": "بۇ صحیفه‌‌",
+       "qbmyoptions": "صحیفه‌‌لریم",
+       "faq": "چوْخ سوْروشولان سوْال‌لار",
+       "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
+       "vector-action-addsection": "Ù\82Ù\88Ù\92Ù\86Ù\88 Ø¢Ø±ØªÛ\8cر",
        "vector-action-delete": "سیل",
-       "vector-action-move": "آدÛ\8cÙ\86Û\8c Ø¯Ù\8aÙ\8eÛ\8cشدÛ\8cر",
-       "vector-action-protect": "قورو",
+       "vector-action-move": "داشÛ\8c",
+       "vector-action-protect": "قوْرو",
        "vector-action-undelete": "سیلمگی قایتار",
-       "vector-action-unprotect": "قوروماغی دَییشدیر",
+       "vector-action-unprotect": "قوْروماغی دَییشدیر",
        "vector-view-create": "یارات",
        "vector-view-edit": "دَییشدیر",
        "vector-view-history": "گئچمیشه باخ",
-       "vector-view-view": "اوخو",
+       "vector-view-view": "اوْخو",
        "vector-view-viewsource": "قایناغا باخ",
-       "actions": "ایشلر",
-       "namespaces": "آدلار فضاسی",
+       "actions": "چالیشمالار",
+       "namespaces": "آد فضالاری",
        "variants": "واریانتلار",
-       "navigation-heading": "دولانماق مِنوسو",
+       "navigation-heading": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82 Ù\85Ù\90Ù\86Ù\88سÙ\88",
        "errorpagetitle": "خطا",
        "returnto": "$1-ه قاییت.",
        "tagline": "{{SITENAME}} سایتیندان",
        "searcharticle": "گئت",
        "history": "صحیفه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
-       "updatedmarker": "سÙ\88Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø¨Ù\88Û\8cاÙ\86اØ\8c Û\8cئÙ\86Û\8câ\80\8cÙ\84Ø´یب‌دیر",
-       "printableversion": "چاپ ائتمه‌لی نوسخه",
+       "updatedmarker": "سÙ\88Ù\92Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø³Ù\88Ù\92Ù\86را Û\8cئÙ\86Û\8câ\80\8cÙ\84Ù\86یب‌دیر",
+       "printableversion": "یازدیریرا بیلن نۆسخه",
        "permalink": "قالان باغلانتی",
        "print": "یازدیر",
        "view": "باخ",
        "edit": "دَییشدیر",
        "create": "یارات",
-       "editthispage": "بو صحیفه‌‌نی دَییشدیر",
-       "create-this-page": "بو صحیفه‌‌نی يارات",
+       "editthispage": "بۇ صحیفه‌‌نی دَییشدیر",
+       "create-this-page": "بۇ صحیفه‌‌نی يارات",
        "delete": "سیل",
-       "deletethispage": "بو صحیفه‌‌نی سیل",
-       "undeletethispage": "بو صحیفه‌نی دیریلت",
-       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت",
-       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر",
-       "protect": "قوروماق",
+       "deletethispage": "بۇ صحیفه‌‌نی سیل",
+       "undeletethispage": "بۇ صحیفه‌نی دیریلت",
+       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} قایتار",
+       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگه باخ",
+       "protect": "قوْرو",
        "protect_change": "ديَیشدیر",
-       "protectthispage": "بو صحیفه‌‌نی قورو",
-       "unprotect": "قوروماغی دَییشدیر",
-       "unprotectthispage": "بو یارپاغین قوروماسینی دَییشدیر",
+       "protectthispage": "بۇ صحیفه‌‌نی قوْرو",
+       "unprotect": "قوْروماغی دَییشدیر",
+       "unprotectthispage": "بۇ صحیفه‌نین قوْروماسینی دَییشدیر",
        "newpage": "يئنی صحیفه‌‌",
-       "talkpage": "بو صحیفه‌یه گؤره دانیشیق آپارین",
+       "talkpage": "بۇ صحیفه‌نی دانیش",
        "talkpagelinktext": "دانیشیق",
        "specialpage": "اؤزل صحیفه",
        "personaltools": "شخصی آراجلار",
        "postcomment": "يئنی بؤلوم",
-       "articlepage": "مقاله‌یه باخین",
+       "articlepage": "ایچری‌لی صحیفه‌یه باخ",
        "talk": "دانیشیق",
        "views": "گؤرونوشلر",
        "toolbox": "آراجلار",
-       "userpage": "ایستیفاده‌چی صحیفه‌‌سینی باخین",
-       "projectpage": "پروژه صحیفه‌سینه باخین",
-       "imagepage": "فایل صحیفه‌سینه باخین",
-       "mediawikipage": "مئساژ صحیفه‌سینه باخین",
-       "templatepage": "شابلون صحیفه‌سینه باخین",
-       "viewhelppage": "یاردیم صحیفه‌سینه باخین",
-       "categorypage": "بؤلمه صحیفه‌‌سینی گؤستر",
-       "viewtalkpage": "دانیشیغا باخین",
+       "userpage": "ایستیفاده‌چی صحیفه‌‌سینه باخ",
+       "projectpage": "پروژه صحیفه‌سینه باخ",
+       "imagepage": "فایل صحیفه‌سینه باخ",
+       "mediawikipage": "مئساژ صحیفه‌سینه باخ",
+       "templatepage": "شابلون صحیفه‌سینه باخ",
+       "viewhelppage": "یاردیم صحیفه‌سینه باخ",
+       "categorypage": "بؤلمه صحیفه‌‌سینه باخ",
+       "viewtalkpage": "دانیشیغا باخ",
        "otherlanguages": "آیری دیل‌لرده",
-       "redirectedfrom": "($1 صحیفه‌‌سیندن يؤنلن‌دیریلمیش‌دیر)",
-       "redirectpagesub": "Û\8cÙ\88Ù\84لاندیرما صحیفه‌سی",
-       "lastmodifiedat": "بو صحیفه‌‌ سون دفعه‌‌ $1، $2 چاغیندا دَییشیلیب‌دیر.",
-       "viewcount": "بو یارپاق {{PLURAL:$1|بیر|$1}} دفعه گؤرونوب‌دور.",
-       "protectedpage": "قورونموش یارپاق",
-       "jumpto": "آتلان:",
-       "jumptonavigation": "دولانماق",
+       "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
+       "redirectpagesub": "Û\8cÙ\88Ù\92Ù\84â\80\8cلاندیرما صحیفه‌سی",
+       "lastmodifiedat": "بۇ صحیفه‌‌ سوْن دفعه‌‌ $1، $2 چاغیندا دَییشیلمیشدیر.",
+       "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
+       "protectedpage": "قوْرونموش صحیفه",
+       "jumpto": "آتیل:",
+       "jumptonavigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "jumptosearch": "آختار",
-       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یوک آلتیندادیلار.\nچوخلو ایشلدنلر بو یارپاغی گؤرمک ایسته‌ییرلر.\nلوطفاً یئنی‌دن بو یارپاغا ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
-       "pool-timeout": "قیفیلا دؤزمک واختی قورتاردی",
-       "pool-queuefull": "مخزن صفی دولودور",
-       "pool-errorunknown": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ خطا",
-       "aboutsite": "{{SITENAME}}-ا گؤره",
+       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یۆک آلتیندادیلار.\nچوْخلو ایستیفاده‌چیلر بۇ صحیفه‌نی گؤرمک ایسته‌ییرلر.\nلۆطفاً یئنی‌دن بۇ صحیفه‌یه ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
+       "pool-timeout": "قیفیلا دؤزماغین واختی بیتیردی",
+       "pool-queuefull": "Ù\85خزÙ\86 ØµÙ\81Û\8c Ø¯Ù\88Ù\92Ù\84Ù\88دÙ\88ر",
+       "pool-errorunknown": "بÛ\8cÙ\84Û\8cÙ\86Ù\85Ù\87â\80\8cÛ\8cÙ\86 خطا",
+       "aboutsite": "{{SITENAME}} حاقیندا",
        "aboutpage": "Project:حاقیندا",
        "copyright": "ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.",
-       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù¾Û\8c Ø­Ø§Ù\82ی",
+       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù\92Ù¾Û\8c Ø­Ø§Ù\82Ù\84اری",
        "currentevents": "ایندیکی اولایلار",
        "currentevents-url": "Project:ایندیکی اولایلار",
        "disclaimers": "رد ائتمک",
        "disclaimerpage": "Project:عمومی رد ائتمک",
-       "edithelp": "ديَیشیکلیک‌لر اوچون یاردیم",
+       "edithelp": "ديَیشتیرمک یاردیمی",
        "mainpage": "آنا صحیفه",
        "mainpage-description": "آنا صحیفه",
        "policy-url": "Project:قایدالار",
-       "portal": "تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
-       "portal-url": "Project:تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
+       "portal": "تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
+       "portal-url": "Project:تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
        "privacy": "گیزلیلیک سیاستی",
        "privacypage": "Project:گیزلیلیک سیاستی",
-       "badaccess": "یول وئرمه خطاسی",
-       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوخدور.",
-       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، تکجه بو {{PLURAL:$2|قروپ|قروپلار}}داکی ایشلدنلره وئریلیب‌دیر: $1.",
-       "versionrequired": "مدئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر",
-       "versionrequiredtext": "بو یارپاغی ایشلتدماغا، مئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر.\n[[Special:Version|نوسخه یارپاغینا]] باخین.",
-       "ok": "اÙ\88Ù\84دÙ\88",
+       "badaccess": "ایجازه خطاسی",
+       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوْخدور.",
+       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، یالنیز بۇ {{PLURAL:$2|قروپ‌داکی|قروپلارین بیرینده‌کی}} ایستیفاده‌چیلره وئریلیب‌دیر: $1.",
+       "versionrequired": "مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیمدیر",
+       "versionrequiredtext": "بۇ صحیفه‌نی ایشلتمک اۆچون، مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیم‌دیر.\n[[Special:Version|نۆسخه صحیفه‌سینه]] باخ.",
+       "ok": "اÙ\88Ù\92Ù\84سÙ\88Ù\86",
        "retrievedfrom": "«$1»-دن آلینمیشدیر",
        "youhavenewmessages": "سیزین $1 ($2) وارینیزدیر.",
        "youhavenewmessagesfromusers": "سیزین {{PLURAL:$3|بیر آیری ایستیفاده‌چی‌دن|$3 ایستیفاده‌چی‌دن}} $1 وارینیزدیر ($2).",
-       "youhavenewmessagesmanyusers": "سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).",
+       "youhavenewmessagesmanyusers": "سیزین چوْخلو ایستیفاده‌چیلردن $1 وارینیزدیر ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|بیر یئنی مئساژ|999=یئنی مئساژلار}}",
        "newmessagesdifflinkplural": "سون {{PLURAL:$1|دَییشیکلیک|999=دَییشیکلیکلر}}",
-       "youhavenewmessagesmulti": "$1-دا یئنی بیلدیرینیز وار.",
+       "youhavenewmessagesmulti": "$1-ده یئنی مئساژینیز وار.",
        "editsection": "دَییشدیر",
        "editold": "دَییشدیر",
        "viewsourceold": "قایناغا باخ",
        "toc": "ایچینده‌کیلر",
        "showtoc": "گؤستر",
        "hidetoc": "گیزلت",
-       "collapsible-collapse": "گیزلت",
-       "collapsible-expand": "گئنیشلندیر",
-       "thisisdeleted": "$1-نا باخ یا اونو قایتار؟",
+       "collapsible-collapse": "ییغیشلات",
+       "collapsible-expand": "گئنیشلت",
+       "thisisdeleted": "$1-Ù\86ا Ø¨Ø§Ø® Û\8cا Ø§Ù\88Ù\92Ù\86Ù\88 Ù\82اÛ\8cتارØ\9f",
        "viewdeleted": "$1 گؤستریلسین؟",
-       "restorelink": "{{PLURAL:$1|بیر سیلینمیش دَییشیکلیک|$1 سیلینمیش دَییشیکلیکلر}}",
-       "feedlinks": "بسÙ\84Ù\85Ù\87",
-       "feed-invalid": "گئچرسیز آبونه کانال جورو.",
-       "feed-unavailable": "سیندیکاسیا خطلری ال‌ده دئییل‌لر",
+       "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
+       "feedlinks": "بسÙ\84Ù\87â\80\8cÙ\85Ù\87:",
+       "feed-invalid": "گئچرسیز آبونه بسله‌مه جۆرو.",
+       "feed-unavailable": "سیندیکالاشما خطلری ال‌ده دئییل‌لر",
        "site-rss-feed": "$1 آراِس‌اِس فید",
        "site-atom-feed": "$1 آتوم فید",
        "page-rss-feed": "«$1» آراِس‌اِس فید",
        "page-atom-feed": "«$1» آتوم فید",
-       "red-link-title": "$1 (صحیفه یوخدور)",
+       "red-link-title": "$1 (صحیفه یوْخدور)",
        "sort-descending": "آزالان سیرالاماق",
-       "sort-ascending": "چوخالان سیرالاماق",
-       "nstab-main": "مقاله",
+       "sort-ascending": "چوْخالان سیرالاماق",
+       "nstab-main": "صحیفه",
        "nstab-user": "ایستیفاده‌چی صحیفه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
        "nstab-special": "اؤزل صحیفه",
        "nstab-template": "شابلون",
        "nstab-help": "یاردیم صحیفه‌سی",
        "nstab-category": "بؤلمه",
-       "nosuchaction": "بئله چالیشما یوخدور",
-       "nosuchactiontext": "URL-ده گؤستریلن ایش گئچرسیزدیر.\nاولا بیلر کی URL-ی یانلیش یازیب یوخسا یانلیش باغلانتی‌لا گلمیشسینیز.\nهمده بو، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
-       "nosuchspecialpage": "بئله اؤزل یارپاق یوخدور",
-       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل یارپاغینی ایسته‌میسینیز.</strong>\nدوزگون اؤزل یارپاق‌لارین سیاهی‌سینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
+       "nosuchaction": "بئله چالیشما یوْخدور",
+       "nosuchactiontext": "URL طرفیندن بیلینن ایش گئچرسیزدیر.\nURL-ی یانلیش یازمیش، یا یانلیش بیر باغلانتی ایله گلمیش، اوْلابیلرسیز.\nهم‌ده بۇ، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
+       "nosuchspecialpage": "بئله اؤزل صحیفه یوْخدور",
+       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل صحیفه ایسته‌میسینیز.</strong>\n\nدۆزگون اؤزل صحیفه‌لرین لیستینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
        "error": "خطا",
-       "databaseerror": "دیتابیس خطاسی",
+       "databaseerror": "دِیتابِیس خطاسی",
        "laggedslavemode": "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
        "readonly": "دیتابیس باغلانیب",
        "enterlockreason": "باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین",
        "action-viewmyprivateinfo": "گیزلی بیلگیلرینی گؤر",
        "action-editmyprivateinfo": "گیزلی بیلگیلرینی دَییشدیر",
        "nchanges": "$1 {{PLURAL:$1|دَییشیکلیک}}",
+       "enhancedrc-history": "گئچمیش",
        "recentchanges": "سون دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
        "recentchanges-summary": "بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.",
        "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
+       "rcshowhideminor-show": "گؤستر",
+       "rcshowhideminor-hide": "گیزلت",
        "rcshowhidebots": "بوتلاری $1",
-       "rcshowhideliu": "ایچری گیرمیش ایستیفاده‌چیلری $1",
+       "rcshowhidebots-show": "گؤستر",
+       "rcshowhidebots-hide": "گیزلت",
+       "rcshowhideliu": "یازیلمیش ایستفاده‌چیلری $1",
+       "rcshowhideliu-show": "گؤستر",
+       "rcshowhideliu-hide": "گیزلت",
        "rcshowhideanons": "تانینمامیش ایستیفاده‌چیلری $1",
+       "rcshowhideanons-show": "گؤستر",
+       "rcshowhideanons-hide": "گیزلت",
        "rcshowhidepatr": "نظارت ائدیلن دَییشیکلیکلری $1",
+       "rcshowhidepatr-show": "گؤستر",
+       "rcshowhidepatr-hide": "گیزلت",
        "rcshowhidemine": "منیم دَییشیکلریمی $1",
+       "rcshowhidemine-show": "گؤستر",
+       "rcshowhidemine-hide": "گیزلت",
        "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
        "diff": "فرق",
        "hist": "گئچمیش",
        "rc_categories_any": "هر",
        "rc-change-size-new": "دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت",
        "newsectionsummary": "/* $1 */ یئنی بؤلمه",
-       "rc-enhanced-expand": "تفصیلاتی گؤستر (جاوااسکریپت لازیم‌دیر)",
+       "rc-enhanced-expand": "تفصیل‌لری گؤستر",
        "rc-enhanced-hide": "تفصیل‌لری گیزلت",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
        "recentchangeslinked": "ایلگیلی دَییشیکلیکلر",
        "fileexists-shared-forbidden": "بو آددا بیر فايل اورتاق آمباردا مؤوجود دیر. \nفايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری گئدیب يئنی بیر آد ایستیفاده ائدین. \n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "بو فایل آشاغی‌داکی {{PLURAL:$1 | فایلین | فایل‌لارین}} تکراری سی‌دیر:",
        "file-deleted-duplicate": "بو فایلین عینی اولان باشقا بیر فایل([[:$1]])داها اول‌دن سیلیندی. بو فای‌لی یئنی‌دن یوکلمه‌دن اول دیگر فایلین سیلینمه‌سی قئیدلرینی ایداره ائتملیسینیز.",
+       "file-deleted-duplicate-notitle": "قاباقجا بۇ فایلا عینی اولان بیر فایل سیلینمیشدیر، و بۇ فایل آدی قاداغان اوْلموشدور.\nاوْنی یئنی‌دن یۆکله‌مک‌دن اؤنجه، قاداغان اوْلونموش فایل‌لارا باخماق ایجازه‌سی اوْلان بیر ایستیفاده‌چی‌دن، وضعیتی گؤزدن گئچیرمگی ایسته‌مه‌لیسینیز.",
        "uploadwarning": "يوکله‌مه خبردارلیغی",
        "uploadwarning-text": "خاهیش ائدیریک آشاغی‌داکی فایل شرحینی دییش‌دیرین و یئنی‌دن جهد ائدین.",
        "savefile": "فايلی قئيد ائت",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "upload-source": "قایناق فايلی",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
        "upload_source_url": "(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)",
        "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
-       "listfiles-summary": "بو اؤزل صحیفه، بوتون یوکله‌نیلن فایل‌لاری گؤستریر.\nایستیفاده‌چیه فیلتر اولوناندا، یالنیز او ایستیفاده‌چی سون نوسخه‌لرینی یوکله‌ین فایل‌لار گؤستریلیر.",
+       "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "imgfile": "فایل",
        "listfiles": "فایل لیستی",
        "listfiles_size": "اؤلچو",
        "listfiles_description": "شرح",
        "listfiles_count": "نوسخه‌لر",
+       "listfiles-show-all": "عکسلرین اسکی نۆسخه‌لرینی ایچینه آل.",
+       "listfiles-latestversion": "ایندیکی نۆسخه",
+       "listfiles-latestversion-yes": "بلی",
+       "listfiles-latestversion-no": "یوخ",
        "file-anchor-link": "فایل",
        "filehist": "فايل گئچمیشی",
        "filehist-help": "فايلین اول‌کی وئرسیياسینی گؤرمک اۆچون گۆن/تاریخ بؤلمه‌سینده‌کی تاریخلری تێقلايین.",
        "download": "اندیر",
        "unwatchedpages": "ایزلنمه‌میش صحیفه‌لر",
        "listredirects": "یول‌لاندیرمالارین لیستی",
+       "listduplicatedfiles": "کوْپی‌لری اولان فایل‌لاری لیستی",
+       "listduplicatedfiles-summary": "بۇرا، سوْن نۆسخه‌لری آیری بیر فایلین سوْن نۆسخه‌سی‌نین کوْپی‌سی اوْلان فایل‌لارین لیستیدیر. یالنیز یئرلی فایل‌لار گؤز آلتینا آلینیبلار.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]-ین [[$3|{{PLURAL:$2|بیر کوْپی‌سی|$2 کوْپی‌سی}}]] واردیر.",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
        "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
        "randompage": "راست‌گله صحیفه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
+       "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
+       "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
+       "randomincategory-selectcategory": "بؤلمه‌دن آلیناجاق راست‌گله صحیفه: $1 $2.",
+       "randomincategory-selectcategory-submit": "گئت",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "pageswithprop-text": "بو صحیفه‌ده، بیر خاص صحیفه اؤزل‌لیگی ایشلدن صحیفه‌لرین لیستی واردیر.",
        "pageswithprop-prop": "اؤزل‌لیک آدی:",
        "pageswithprop-submit": "گئت",
+       "pageswithprop-prophidden-long": "اۇزون یازی اؤزل‌لیک دَیَری گیزلی ($1)",
+       "pageswithprop-prophidden-binary": "ایکی‌لی اؤزل‌لیک دَیَری گیزلی ($1)",
        "doubleredirects": "ایکی‌قات یول‌لاندیرمالار",
        "doubleredirectstext": "بو صحیفه دیگر ایستیقامتلندیرمه صحیفه‌لرینه ایستیقامتلندیرمه ائدن صحیفه‌لری سیاهی‌لار.\nهر سطرین ائهتیوا ائتدیگی کئچیدلر؛ بیرینجی و ایکینجی ایستیقامتلندیرمه، هم‌چی‌نین ایکینجی ایستیقامتلن‌دیرمک هدفی، کی بو عمومیتله بیرینجی ایستیقامتلن‌دیرمک گؤسترمه‌سی لازیم اولان \"گئرچک\" هدف صحیفه‌سی‌دیر.\n<del> اوستو خط لنیب </del> دوزلمیش دیر.",
-       "double-redirect-fixed-move": "[[$1]] Ø¯Û\8cÛ\8cشدÛ\8cرÛ\8cÙ\84Û\8cب.\nحاضردا [[$2]]-Û\8cÙ\87 Ø§Û\8cستÛ\8cÙ\82اÙ\85تÙ\84Ù\86Û\8cب.",
-       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-یه ایکی‌قات ایستیقامتلنمه دوزلدیلیر.",
+       "double-redirect-fixed-move": "[[$1]] Ø¢Ù¾Ø§Ø±Û\8cÙ\84Ù\85Û\8cØ´â\80\8cدÛ\8cر.\nاÙ\88Ù\92تÙ\88Ù\85اتÛ\8cÚ© Ø§Ù\88Ù\92Ù\84اراÙ\82 Ú¯Û\86Ù\86جÙ\84â\80\8cÙ\84Ù\87â\80\8cÙ\86Û\8cبدÛ\8cر Ù\88 Ø§Û\8cÙ\86دÛ\8c [[$2]]-Ù\87 Û\8cÙ\88Ù\92Ù\84â\80\8cÙ\84اÙ\86دÛ\8cرÛ\8cر.",
+       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-ه ایکی‌قات یوْل‌لاندیرما، بیر ساخلاما ایشین‌ده، اوْتوماتیک اوْلاراق دۆزلدیلیر.",
        "double-redirect-fixer": "يؤنلندیرمه تعمیرجیسی",
        "brokenredirects": "خطالی ایستیقامتلندیرمه",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "ninterwikis": "{{PLURAL:$1|بیر|$1}} ویکی‌آراسی",
        "nlinks": "{{PLURAL:$1|بیر|$1}} باغلانتی",
        "nmembers": "{{PLURAL:$1|بیر|$1}} عوضو",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|عۆضو}}",
        "nrevisions": "{{PLURAL:$1|بیر|$1}} نوسخه",
        "nviews": "{{PLURAL:$1|بیر|$1}} گؤرونوش",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "mostrevisions": "ان چوخ نظردن کئچیریلمیش (وئرسیا‌لی) مقاله‌لر",
        "prefixindex": "بوتون اؤن‌اَکلی صحیفه‌لر",
        "prefixindex-namespace": "بوتون صفحه لر (آد فضاسی$1) قاباق دان یاپیشیقی وار",
+       "prefixindex-strip": "لیست‌ده، اؤن‌اَکی قوْپارت",
        "shortpages": "قیسا صحیفه‌‌لر",
        "longpages": "اوزون صحیفه‌‌لر",
        "deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
        "deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
        "protectedpages": "محافظه‌‌لی صحیفه‌‌لر",
        "protectedpages-indef": "يالنیز مدتسیز محافظه‌‌لر",
+       "protectedpages-summary": "بۇ صحیفه، ایندیکی قوْرونان موْجود اوْلان صحیفه‌لری لیست ائدیر. یارانماق‌دان قوْرونان باشلیقلارین لیستینی گؤرمک اۆچون [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]-ه باخین.",
        "protectedpages-cascade": "یالنیز کاسکاد محافظه‌لر",
+       "protectedpages-noredirect": "یوْل‌لاندیرمالاری گیزلت",
        "protectedpagesempty": "حال-حاضردا بو پارامئتره اویغون هئچ بیر محافظه‌لی صحیفه یوخ‌دور",
+       "protectedpages-timestamp": "واخت دامغاسی",
+       "protectedpages-page": "صحیفه",
+       "protectedpages-expiry": "بیتمک تاریخی",
+       "protectedpages-performer": "قوْرویان ایستیفاده‌چی",
+       "protectedpages-params": "قوْروماق پارامئترلری",
+       "protectedpages-reason": "نَدَن‌لیگی",
+       "protectedpages-unknown-timestamp": "بیلینمه‌ین",
+       "protectedpages-unknown-performer": "بیلینمه‌ین ایستیفاده‌چی",
        "protectedtitles": "محافظه‌لی باش‌لیق‌لار",
+       "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
        "listusers": "ایستیفاده‌چی سیياهیسی",
        "listusers-editsonly": "يالنیز دَییشدیرمه ائدن ایستیفاده‌چیلری گؤستر",
        "listusers-creationsort": "يارانما تاریخینه گؤره سیرالا",
+       "listusers-desc": "آزالان سیرادا سیرالا",
        "usereditcount": "$1 {{PLURAL:$1|دَییشدیرمه}}",
        "usercreated": "$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}",
        "newpages": "يئنی صحیفه‌‌‌لر",
        "log-title-wildcard": "بو متنله باشلایان باش‌لیق‌لاری آختار",
        "showhideselectedlogentries": "گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون",
        "allpages": "بوتون صحیفه‌لر",
-       "alphaindexline": "$1-دن $2-یه",
        "nextpage": "سونراکی صحیفه‌‌ ($1)",
        "prevpage": "اولکی صحیفه ($1)",
        "allpagesfrom": "بو حرفله باشلایان صحیفه‌لری گؤستر:",
        "activeusers-noresult": "هئچ ایستیفاده‌چی تاپیلمادی.",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\nتک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
+       "listgrouprights-key": "یوْل گؤستری:\n* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
        "listgrouprights-group": "قروپ",
        "listgrouprights-rights": "حاقلار",
        "listgrouprights-helppage": "Help:قروپ حاقلاری",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|گروپو|گروپلاری}} اؤز حسابیندان سیل: $1",
        "listgrouprights-addgroup-self-all": "بوتون گروپلاری اؤز حسابینا آرتیر",
        "listgrouprights-removegroup-self-all": "بوتون گروپلاری اؤز حسابیندان سیل",
+       "listgrouprights-namespaceprotection-header": "آدفضاسی محدودیتلری",
+       "listgrouprights-namespaceprotection-namespace": "آدفضاسی",
+       "listgrouprights-namespaceprotection-restrictedto": "ایستیفاده‌چی‌نین بۇنلاری دَییشدیرمک حاق(لار)ی",
+       "trackingcategories": "ایزله‌مک بؤلمه‌لری",
+       "trackingcategories-msg": "ایزله‌مک بؤلومو",
+       "trackingcategories-name": "مئساژ آدی",
+       "trackingcategories-desc": "بؤلمه ایچری آلماق معیارلاری",
        "mailnologin": "گؤندرمه آدرسی یوخدور",
        "mailnologintext": "باشقا ایستیفاده‌چیلره ایمیل گؤندرک اوچون، [[Special:UserLogin|گیریش]] ائدیب و [[Special:Preferences|ترجیحلر]]ینیزده گئچرلی ایمیل آدرسی وئرمه‌لیسینیز.",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "blockip": "ایستیفاده چی نی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
        "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).",
-       "ipadressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
+       "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
        "ipbexpiry": "بیتمه مدتی:",
        "ipbreason": "ندن:",
        "ipbreason-dropdown": "*باغلانما سبب‌لری:\n** یالان معلومات‌لارین علاوه ائدیلمه‌سی\n** صحیفه‌نین مزمونونون سیلینمه‌سی\n** خاریجی سایت‌لارا ایسپام-کئچیدلر\n** صحیفه‌یه معنا‌سیز و یارارسیز علاوه‌لره گؤره\n** حده و تعقیب‌لره گؤره\n** تحقیره گؤره\n** چوخسای‌لی حساب‌دان سوی ایستیفاده‌یه گؤره\n** قاداغان اولونموش ایستیفاده‌چی آدینا گؤره",
        "allmessages-prefix": "اؤنک ایله فیلترلی:",
        "allmessages-language": "دیل:",
        "allmessages-filter-submit": "گئت",
+       "allmessages-filter-translate": "چئویر",
        "thumbnail-more": "بؤیوت",
        "filemissing": "فایل تاپیلمادی",
        "thumbnail_error": "کیچیک شکیل یاراتما خطاسی: $1",
        "newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
        "newimages-legend": "سۆزگَج",
        "newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
-       "showhidebots": "($1 روبات دییشدیر)",
        "noimages": "هئچ نیی گؤرممک.",
        "ilsubmit": "آختار",
        "bydate": "تاریخین اوستوندن",
        "imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
        "imgmultigo": "گئت!",
        "imgmultigoto": "$1 صحیفه‌‌يه گئت",
+       "img-lang-default": "(وارساییلان دیل)",
+       "img-lang-go": "گئت",
        "ascending_abbrev": "آرتما سیراسینا گؤره",
        "descending_abbrev": "آزالما سیراسینا گؤره",
        "table_pager_next": "سونراکی صحیفه",
        "version-hook-name": "چنگه‌لین آدی",
        "version-hook-subscribedby": "طرفیندن گیریش‌‌میش",
        "version-version": "(نسخه $1)",
-       "version-license": "لیسانس",
+       "version-license": "مِدیاویکی لیسانسی",
+       "version-ext-license": "لیسانس",
        "version-poweredby-credits": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "tags-tag": "یاپیشقان آدی",
        "tags-display-header": "ديَیشیکلیک لیستئلئریندئکی گؤرونوش",
        "tags-description-header": "آنلامینین تام آچیقلاماسی",
+       "tags-active-header": "چالیشقلان؟",
        "tags-hitcount-header": "یاپیشقانلی دییشیک‌لیک‌لر",
+       "tags-active-yes": "بلی",
+       "tags-active-no": "یوْخ",
        "tags-edit": "دَییشدیر",
        "tags-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
        "duration-decades": "{{PLURAL:$1|بیر|$1}} اون‌ایل",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
-       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر"
+       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expand_templates_generate_rawhtml": "چیی اچ‌تی‌ام‌ال گؤستر",
+       "expand_templates_preview": "اؤن‌گؤستریش"
 }
index 90dfa10..65c22ab 100644 (file)
        "blockip": "Ҡатнашыусыны бикләү",
        "blockip-legend": "Ҡатнашыусыны бикләү",
        "blockiptext": "Билдәләнгән IP адрестан яҙыу мөмкинлеген бикләү өсөн, түбәндәге форманы ҡулланығыҙ.\nБыл бары тик вандаллыҡҡа юл ҡуймау өсөн генә һәм [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынса ғына эшләнергә тейеш.\nТүбәндә бикләү сәбәбен күрһәтегеҙ (мәҫәлән, вандаллыҡ эҙҙәре булған бер нисә биттең цитатаһын килтерегеҙ).",
-       "ipadressorusername": "Ҡатнашыусының IP-адресы йәки исеме:",
+       "ipaddressorusername": "Ҡатнашыусының IP-адресы йәки исеме:",
        "ipbexpiry": "Тамамлана:",
        "ipbreason": "Сәбәп:",
        "ipbreason-dropdown": "*Ғәҙәттәге бикләү сәбәптәре \n** Ялған мәғлүмәт өҫтәү\n** Биттәрҙең эстәлеген юйыу\n** Тышҡы сайттарға һылтанмалар спамлау\n** Биттәргә мәғәнәһеҙ яҙмалар (ҡый) өҫтәү \n** Ҡатнашыусыларға янау (эҙәрлекләү)\n** Бер нисә иҫәп яҙмаларын артығы менән булдырыу\n** Килешһеҙ иҫәп яҙмаһы",
        "newimages-summary": "Был махсус бит һуңғы тейәлгән файлдарҙы күрһәтә.",
        "newimages-legend": "Һайлау",
        "newimages-label": "Файл исеме (йәки өлөшө):",
-       "showhidebots": "(боттарҙы $1)",
        "noimages": "Рәсемдәр юҡ.",
        "ilsubmit": "Эҙләү",
        "bydate": "булдырыу көнө буйынса",
index 0a7074d..d2efc3a 100644 (file)
        "blockip": "IP-Adress/Benytzer sperrn",
        "blockip-legend": "IP-Adresse/Benutzer sperrn",
        "blockiptext": "Mid dem Formular sperrst a IP-Adress oder an Benytzernåmen, das vo durten aus koane Endarungen mer vurgnumma wern kennan.\nDes soid nur dafoing, um an Vandalismus z' vahindern und in Yweraistimmung mid d' [[{{MediaWiki:Policy-url}}|Richtlinien]].\nGib bittschee an Grund fyr d' Sperrn å.",
-       "ipadressorusername": "IP-Adress oder Benytzernåm:",
+       "ipaddressorusername": "IP-Adress oder Benytzernåm:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Oigmoahne Sperrgrynd\n** Eihfyng voh voische Informaziónen\n** Laarn voh Seiten\n** Massenweiss Eihfyng voh externe Links\n** Eihstön voh unsinnige Inhoite auf Seiten\n** néd åbrochts Vahoiden\n** Missbrauch mid mererne Benutzerkontós\n** néd geigneter Benutzernåm",
index d6a66f9..f98f58a 100644 (file)
        "blockip": "محدود کتن کاربر",
        "blockip-legend": "کاربر محدود کن",
        "blockiptext": "چه ای فرم جهلی په نوشتن دسترسی په یک خاصین آدرس آی پی یا نام کاربری استفاده کن.\nشی فقط انجام بیت په خاطر جلوگیری چه هرابکاری  په اساس [[{{MediaWiki:Policy-url}}|سیاست]].\nیک حاصین دلیلی بنویس جهلء (مثلا، گوشگ صفخات خاصی که هراب بپتگنت).",
-       "ipadressorusername": "آدرس آي پی یا نام کاربری:",
+       "ipaddressorusername": "آدرس آي پی یا نام کاربری:",
        "ipbexpiry": "وهد هلگ:",
        "ipbreason": "دلیل:",
        "ipbreason-dropdown": "* متداولین دلایل محدودیت\n** وارد کتن غلطین اطلاحات\n** زورگ محتوا چه صفحات\n** لینکان اسپمی په دراین سایت\n**وارد کتن بی ربطین/نامفومین چیز په صفحات\n** ترسناکین رفتار/ آزار\n**سوء استفاده چه چنت حساب\n** غیر قابل قبولین نام کاربری",
        "newimages-summary": "ای حاصین صفحه اهرین آپلود بوتگین فایلان پیشداریت",
        "newimages-legend": "فیلتر",
        "newimages-label": "نام فایل ( یا چنڈی چه آيی):",
-       "showhidebots": "(روباتان $1 )",
        "noimages": "هیچی په دیستن",
        "ilsubmit": "گردگ",
        "bydate": "گون تاریح",
index 9b3c2df..2a84873 100644 (file)
        "blockip": "Bagáton an paragamit",
        "blockip-legend": "Kubkuba an paragamit",
        "blockiptext": "Gamiton an pormularyo sa babâ para bagaton an pagsurat kan sarong espesipikong IP o ngaran nin parágamit.\nDapat gibohon sana ini para maibitaran vandalismo, asin kompirmi sa [[{{MediaWiki:Policy-url}}|palakaw]].\nMagkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang rinaot).",
-       "ipadressorusername": "direksyon nin IP o gahâ:",
+       "ipaddressorusername": "direksyon nin IP o gahâ:",
        "ipbexpiry": "Pasó:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Mga komon na rason sa pagbagat\n** Nagkakaag nin salang impormasyon\n** Naghahalî nin mga laog kan páhina\n** Nagkakaag nin mga takod na ''spam'' kan mga panluwas na ''site''\n** Nagkakaag nin kalokohan/ringaw sa mga pahina\n** Gawî-gawing makatakót/makauyám\n** Nag-aabuso nin mga lain-lain na ''account''\n** Dai akong ngaran nin parágamit",
        "newimages-summary": "Ining espesyal na pahina minaphiling kan huring pinagkargang mga sagunson.",
        "newimages-legend": "An saraan",
        "newimages-label": "Ngaran nin sagunson (o sarong parte kaini):",
-       "showhidebots": "($1 na bots)",
        "noimages": "Mayong mahihilíng.",
        "ilsubmit": "Hanápon",
        "bydate": "sa petsa",
index 03f5363..7fd07b4 100644 (file)
        "badtitle": "Няслушная назва",
        "badtitletext": "Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.",
        "perfcached": "Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.",
-       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікаў|вынікі}}.",
+       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.",
        "querypage-no-updates": "Абнаўленьні гэтай старонкі цяпер адключаныя. Зьвесткі ня будуць абнаўляцца.",
        "viewsource": "Паказаць крыніцу",
        "viewsource-title": "Прагляд крыніцы для $1",
        "right-move": "перанос старонак",
        "right-move-subpages": "перанос старонак разам зь іх падстаронкамі",
        "right-move-rootuserpages": "Перанос карэнных старонак удзельнікаў",
+       "right-move-categorypages": "перанос старонак катэгорыяў",
        "right-movefile": "перайменаваньне файлаў",
        "right-suppressredirect": "не ствараць перанакіраваньне са старой назвы пасьля пераносу старонкі",
        "right-upload": "загрузка файлаў",
        "action-move": "перанос гэтай старонкі",
        "action-move-subpages": "перанос гэтай старонкі і яе падстаронак",
        "action-move-rootuserpages": "перанос карэнных старонак удзельнікаў",
+       "action-move-categorypages": "перанос старонак катэгорыяў",
        "action-movefile": "перайменаваць гэты файл",
        "action-upload": "загрузку гэтага файла",
        "action-reupload": "перазапіс гэтага файла",
        "log-title-wildcard": "Шукаць назвы, якія пачынаюцца з гэтага тэксту",
        "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы ў журнале",
        "allpages": "Усе старонкі",
-       "alphaindexline": "ад $1 да $2",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "allpagesfrom": "Паказаць старонкі, пачынаючы з:",
        "index-category-desc": "На старонцы знаходзіцца магічнае слова <code><nowiki>__INDEX__</nowiki></code> (пры гэтым старонка знаходзіцца ў прасторы назваў, дзе дазволены гэты сьцяг), таму яна індэксуецца пошукавымі робатамі ў тых выпадках, калі звычайна гэтага не адбываецца.",
        "post-expand-template-inclusion-category-desc": "Пасьля разгортваньня ўсіх шаблёнаў, памер старонкі перавысіў <code>$wgMaxArticleSize</code>, таму некаторыя шаблёны не былі паказаныя цалкам.",
        "post-expand-template-argument-category-desc": "Пасьля раскрыцьця аргумэнту шаблёну (нешта ў трайных дужках, напрыклад, <code>{{{Foo}}}</code>), старонка перавышае памер <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "На старонцы ўжываецца зашмат рэсурсаёмістых функцыяў парсэру (такіх, як <code>#ifexist</code>). Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Катэгорыя дадаецца, калі старонка ўтрымлівае няслушную спасылку на файл (спасылку на файл, які не існуе).",
+       "hidden-category-category-desc": "Гэта катэгорыя з дададзенай меткай <code><nowiki>__HIDDENCAT__</nowiki></code> у ёй, што па змоўчаньні не адлюстроўвае яе на старонках у сьпісе катэгорыяў.",
+       "trackingcategories-nodesc": "Апісаньне адсутнічае.",
        "mailnologin": "Няма адрасу атрымальніка",
        "mailnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
        "emailuser": "Даслаць ліст",
        "blockip": "Заблякаваць",
        "blockip-legend": "Заблякаваць удзельніка",
        "blockiptext": "Наступная форма дазваляе заблякаваць магчымасьць рэдагаваньня з пэўнага IP-адрасу альбо імя ўдзельніка. Гэта трэба рабіць толькі дзеля прадухіленьня вандалізму і згодна з [[{{MediaWiki:Policy-url}}|правіламі]]. Пазначце ніжэй дакладную прычыну (напрыклад, пералічыце асобныя старонкі, на якіх былі парушэньні).",
-       "ipadressorusername": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
+       "ipaddressorusername": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
        "ipbexpiry": "Тэрмін:",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "* Агульныя прычыны блякаваньняў\n** Даданьне ілжывай інфармацыі\n** Выдаленьне зьместу старонак\n** Спам\n** Даданьне бязглузьдзіцы\n** Абразы/пагрозы\n** Злоўжываньне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
        "newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
        "newimages-legend": "Фільтар",
        "newimages-label": "Назва файла (альбо яе частка):",
-       "showhidebots": "($1 робатаў)",
        "noimages": "Выявы адсутнічаюць.",
        "ilsubmit": "Шукаць",
        "bydate": "па даце",
index 8ac3bf8..25f6b13 100644 (file)
        "blockip": "Заблакаваць удзельніка",
        "blockip-legend": "Заблакаваць удзельніка",
        "blockiptext": "Гэты фармуляр дазваляе заблакаваць магчымасць запісу для пэўнага адрасу IP ці імя ўдзельніка.\nГэта трэба рабіць толькі дзеля засцерагання ад вандалізму і ў адпаведнасці з [[{{MediaWiki:Policy-url}}|правіламі]].\nНіжэй трэба ўпісаць канкрэтную прычыну (напрыклад, пералічваючы канкрэтныя старонкі, якія былі вандалізаваныя).",
-       "ipadressorusername": "IP-адрас ці імя ўдзельніка:",
+       "ipaddressorusername": "IP-адрас ці імя ўдзельніка:",
        "ipbexpiry": "Згасае:",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "*Звычайныя прычыны блоку\n** Упісванне несапраўднай інфармацыі\n** Сціранне інфармацыі са старонак\n** Спамавыя спасылкі на вонкавыя сайты\n** Упісванне бессэнсоўнай інфармацыі\n** Некультурныя паводзіны/пераследаванне\n** Злоўжыванне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
        "newimages-summary": "Тут паказаныя нядаўна ўкладзеныя файлы.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файла (або яе частка):",
-       "showhidebots": "($1 робатаў)",
        "noimages": "Тут нічога няма.",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
index 2762dc0..1763074 100644 (file)
        "blockip": "Блокиране",
        "blockip-legend": "Блокиране на потребител",
        "blockiptext": "Формулярът по-долу се използва, за да се забрани правото на писане\nна определен IP-адрес или потребител.\nТова трябва да се направи само за да се предотвратят прояви на вандализъм\nи в съответствие с [[{{MediaWiki:Policy-url}}|политиката за поведение]] в {{SITENAME}}.\nНеобходимо е да се посочи и причина за блокирането (например заглавия на страници, станали обект на вандализъм).",
-       "ipadressorusername": "IP-адрес или потребител:",
+       "ipaddressorusername": "IP-адрес или потребител:",
        "ipbexpiry": "Срок:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Общи причини за блокиране\n** Въвеждане на невярна информация\n** Премахване на съдържание от страниците\n** Добавяне на спам/нежелани външни препратки\n** Въвеждане на безсмислици в страниците\n** Заплашително поведение/тормоз\n** Злупотреба с няколко потребителски сметки\n** Неприемливо потребителско име",
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
-       "showhidebots": "($1 на ботове)",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
index 18b51c7..290cdbb 100644 (file)
        "blockip": "Blukir pamuruk",
        "blockip-legend": "Blukir pamuruk",
        "blockiptext": "Puruk purmulir di bawah hagan mamblukir hak ungkai manulis matan sabuah alamat IP atawa ngaran-pamuruk.\nNgini dipuruk hagan mancagah vandalisma haja, wan sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan]].\nIsi sabuah alasan khas di bawah (gasan cuntuh, manulisakan tutungkaran nang suah divandal)",
-       "ipadressorusername": "Alamat IP atawa ngaran pamuruk:",
+       "ipaddressorusername": "Alamat IP atawa ngaran pamuruk:",
        "ipbexpiry": "Kadaluwarsa:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan awam pamblukiran\n** Mambuati panjalasan salah\n** Mambuang isi matan tutungkaran\n** Spam tautan ka luar\n** Mambuati pandiran kusung/ratik ka tutungkaran\n** Parilaku palecehan/intimidasi\n** Panyalahpurukan akun banyak\n** Ngaran-pamuruk kada-kawa-ditarima",
        "newimages-summary": "Tungkaran istimiwa ngini manampaikan babarakas nang hahanyar dihunggah.",
        "newimages-legend": "Saringan",
        "newimages-label": "Ngaran barakas (atawa sapalihnya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Kadada nang dijanaki.",
        "ilsubmit": "Gagai",
        "bydate": "ulih tanggal",
index ebd81d3..b615b1f 100644 (file)
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "edit-conflict": "সম্পাদনা সংঘাত।",
        "edit-no-change": "আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।",
+       "postedit-confirmation-created": "পাতাটি তৈরি হয়েছে।",
+       "postedit-confirmation-restored": "পাতাটি পুনরুদ্ধার করা হয়েছে।",
        "postedit-confirmation-saved": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "defaultmessagetext": "আদি টেক্সট",
        "log-title-wildcard": "এই টেক্সট দিয়ে শুরু হওয়া শিরোনামগুলি অনুসন্ধান করা হোক",
        "showhideselectedlogentries": "নির্বাচিত লগগুলো দেখাও/লুকাও",
        "allpages": "সব পাতা",
-       "alphaindexline": "$1 হতে $2",
        "nextpage": "পরবর্তী পাতা ($1)",
        "prevpage": "পূর্ববর্তী পাতা ($1)",
        "allpagesfrom": "এই অক্ষর দিয়ে শুরু হওয়া পাতাগুলো দেখাও:",
        "blockip": "ব্যবহারকারীকে বাধা দাও",
        "blockip-legend": "ব্যবহারকারীকে বাধা দেওয়া হোক",
        "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।",
-       "ipadressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
+       "ipaddressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
        "ipbexpiry": "যখন মেয়াদোত্তীর্ণ হবে:",
        "ipbreason": "কারণ:",
        "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণ\n** মিথ্যা তথ্য ঢোকানো\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** বাইরের কোন সাইটের সংযোগ স্প্যাম করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু ঢোকানো\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অ-গ্রহণযোগ্য",
        "newimages-summary": "এই বিশেষ পাতা সর্বশেষ আপলোডকৃত ফাইল দেখাবে।",
        "newimages-legend": "ছাকনী",
        "newimages-label": "ফাইলের নাম (অথবা এর কোন অংশ):",
-       "showhidebots": "($1 বট)",
        "noimages": "দেখার মত কিছু নেই।",
        "ilsubmit": "অনুসন্ধান",
        "bydate": "তারিখ অনুযায়ী",
index 1438612..c8fc14a 100644 (file)
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "edit-conflict": "Tabut kemmañ.",
        "edit-no-change": "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
+       "postedit-confirmation-created": "Krouet eo bet ar bajenn.",
+       "postedit-confirmation-restored": "Adsavet eo bet ar bajenn.",
        "postedit-confirmation-saved": "Enrollet eo bet ho kemmoù.",
        "edit-already-exists": "N'eus ket bet gallet krouiñ ur bajenn nevez.\nKrouet e oa bet c'hoazh.",
        "defaultmessagetext": "Testenn dre ziouer",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
        "allpages": "An holl bajennoù",
-       "alphaindexline": "$1 da $2",
        "nextpage": "Pajenn war-lerc'h ($1)",
        "prevpage": "Pajenn gent ($1)",
        "allpagesfrom": "Diskouez ar pajennoù adal :",
        "blockip": "Stankañ ur chomlec'h IP",
        "blockip-legend": "Stankañ an implijer",
        "blockiptext": "Grit gant ar furmskrid a-is evit stankañ ar moned skrivañ ouzh ur chomlec'h IP pe un implijer bennak.\nSeurt diarbennoù n'hallont bezañ kemeret nemet evit mirout ouzh ar vandalerezh hag a-du gant an [[{{MediaWiki:Policy-url}}|erbedadennoù ha reolennoù da heuliañ]].\nRoit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou outo).",
-       "ipadressorusername": "Chomlec'h IP pe anv implijer",
+       "ipaddressorusername": "Chomlec'h IP pe anv implijer",
        "ipbexpiry": "Pad ar stankadenn",
        "ipbreason": "Abeg :",
        "ipbreason-dropdown": "*Abegoù stankañ boutinañ\n** Degas titouroù faos\n** Tennañ danvez eus ar pajennoù\n** Degas liammoù Strobus war-du lec'hiennoù diavaez\n** Degas danvez diboell/dizoare er pajennoù\n** Emzalc'h hegazus/handeus betek re\n** Mont re bell gant implij meur a gont\n** Anv implijer n'eo ket aotreet",
        "newimages-summary": "Diskouez a ra ar bajenn dibar-mañ roll ar restroù diwezhañ bet enporzhiet.",
        "newimages-legend": "Sil",
        "newimages-label": "Anv ar restr (pe darn anezhi) :",
-       "showhidebots": "($1 bot)",
        "noimages": "Netra da welet.",
        "ilsubmit": "Klask",
        "bydate": "dre an deiziad anezho",
        "htmlform-no": "Ket",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Diuzañ un dibarzh",
+       "htmlform-cloner-create": "Ouzhpennañ muioc'h",
+       "htmlform-cloner-delete": "Dilemel",
+       "htmlform-cloner-required": "Un dalvoudenn a zo ret da vihanañ.",
        "sqlite-has-fts": "$1 gant enklask eus an destenn a-bezh embreget",
        "sqlite-no-fts": "$1 hep enklask eus an destenn a-bezh embreget",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
index be9020c..2310ae3 100644 (file)
        "blockip": "Blokiraj korisnika",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  Ovo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. Unesite konkretan razlog ispod (na primjer, navodeći koje stranice su vandalizovane).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Netačne informacije\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
        "newimages-summary": "Ova specijalna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
index d628e5e..aab937e 100644 (file)
        "right-move": "Moure pàgines",
        "right-move-subpages": "Moure pàgines amb les seves subpàgines",
        "right-move-rootuserpages": "Reanomenar la pàgina principal d'un usuari",
+       "right-move-categorypages": "Mou les pàgines de categoria",
        "right-movefile": "Moure fitxers",
        "right-suppressredirect": "No crear redireccions quan es reanomena una pàgina",
        "right-upload": "Carregar fitxers",
        "action-createpage": "crear pàgines",
        "action-createtalk": "crear pàgines de discussió",
        "action-createaccount": "crear aquest compte d'usuari",
+       "action-history": "mostra l'historial de la pàgina",
        "action-minoredit": "marcar aquesta modificació com a menor",
        "action-move": "moure aquesta pàgina",
        "action-move-subpages": "moure aquesta pàgina, i llurs subpàgines",
        "action-move-rootuserpages": "reanomenar la pàgina principal d'un usuari",
+       "action-move-categorypages": "mou les pàgines de categoria",
        "action-movefile": "moure aquest fitxer",
        "action-upload": "carregar aquest fitxer",
        "action-reupload": "substituir aquest fitxer",
        "log-title-wildcard": "Cerca els títols que comencin amb aquest text",
        "showhideselectedlogentries": "Mostra/amaga les entrades de registre seleccionades",
        "allpages": "Totes les pàgines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pàgina següent ($1)",
        "prevpage": "Pàgina anterior ($1)",
        "allpagesfrom": "Mostra les pàgines que comencin per:",
        "sp-contributions-blocklog": "Registre de bloquejos",
        "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
        "sp-contributions-deleted": "contribucions d'usuari esborrades",
-       "sp-contributions-uploads": "pujades",
+       "sp-contributions-uploads": "càrregues",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
        "sp-contributions-userrights": "gestió de drets d'usuari",
        "blockip": "Bloqueig d'usuaris",
        "blockip-legend": "Bloca l'usuari",
        "blockiptext": "Empreu el següent formulari per blocar l'accés\nd'escriptura des d'una adreça IP específica o des d'un usuari determinat.\naixò només s'hauria de fer per prevenir el vandalisme, i\nd'acord amb la [[{{MediaWiki:Policy-url}}|política del projecte]].\nEmpleneu el diàleg de sota amb un motiu específic (per exemple, citant\nquines pàgines en concret estan sent vandalitzades).",
-       "ipadressorusername": "Adreça IP o nom de l'usuari",
+       "ipaddressorusername": "Adreça IP o nom de l'usuari",
        "ipbexpiry": "Venciment",
        "ipbreason": "Motiu:",
        "ipbreason-dropdown": "*Motius de bloqueig més freqüents\n** Inserció d'informació falsa\n** Supressió de contingut sense justificació\n** Inserció d'enllaços promocionals (spam)\n** Inserció de contingut sense cap sentit\n** Conducta intimidatòria o hostil\n** Abús de comptes d'usuari múltiples\n** Nom d'usuari no acceptable",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeix una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu la opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "movearticle": "Reanomena la pàgina",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
+       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "movenotallowed": "No teniu permís per a moure pàgines.",
        "movenotallowedfile": "No teniu el permís per a moure fitxers.",
        "cant-move-user-page": "No teniu permís per a moure pàgines d'usuari (independentment de les subpàgines).",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
+       "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
+       "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
        "newtitle": "A títol nou",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "newimages-legend": "Nom del fitxer",
        "newimages-label": "Nom de fitxer (o part d'ell):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostra les càrregues dels bots",
        "noimages": "Res per veure.",
        "ilsubmit": "Cerca",
        "bydate": "per data",
        "watchlistedit-raw-done": "S'ha actualitzat la vostra llista de seguiment.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} afegit:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} eliminat:",
+       "watchlistedit-clear-title": "S'ha netejat la llista de seguiment",
+       "watchlistedit-clear-legend": "Neteja la llista de seguiment",
+       "watchlistedit-clear-explain": "Se suprimiran tots els títols de la vostra llista de seguiment",
+       "watchlistedit-clear-titles": "Títols:",
+       "watchlistedit-clear-submit": "Neteja la llista de seguiment (això és permanent!)",
+       "watchlistedit-clear-done": "S'ha netejat la vostra llista de seguiment.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|S'ha suprimit 1 títol|S'han suprimit $1 títols}}:",
+       "watchlistedit-too-many": "Hi ha massa pàgines per mostrar-les aquí.",
+       "watchlisttools-clear": "Neteja la llista de seguiment",
        "watchlisttools-view": "Visualitza els canvis rellevants",
        "watchlisttools-edit": "Visualitza i edita la llista de seguiment",
        "watchlisttools-raw": "Edita la llista de seguiment sense format",
index e6f18d2..11dac8d 100644 (file)
        "listingcontinuesabbrev": "(кхин дlа)",
        "index-category": "Меттигтерахьйо агlонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
-       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Ð\91олÑ\85 Ñ\86абеÑ\88 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80онаÑ\88}}",
+       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "article": "Яззам",
        "newwindow": "(керлачу корехь)",
        "rows": "МогӀанаш:",
        "columns": "БӀогӀамаш:",
        "searchresultshead": "Лаха",
-       "stub-threshold": "Ð\9aеÑ\87 Ñ\8fÑ\80ан Ð´Ð¾Ð·Ð° <a href=\"#\" class=\"stub\">коÑ\8cÑ\80Ñ\82амогÓ\80амна Ñ\85Ñ\8cажоÑ\80агаÑ\88</a> (байÑ\82аÑ\88каÑ\85):",
+       "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
        "stub-threshold-disabled": "ДӀадайина",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "recentchangesdays-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
-       "withoutinterwiki": "ЮкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88",
+       "withoutinterwiki": "Юкъарвики-хьажоргаш йоцу агӀонаш",
        "withoutinterwiki-summary": "Лахара агӀонийн юкъарвики-хьажоргаш яц:",
        "withoutinterwiki-submit": "Гайта",
        "fewestrevisions": "ЧIогIа кIезиг башхонаш йолу агIонаш",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "allpages": "Массо агӀонаш",
-       "alphaindexline": "тӀера $1 $2 кхаччалц",
        "nextpage": "Тlаьхьа йогlу агlо ($1)",
        "prevpage": "Хьалхалера агlо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "whatlinkshere-hideredirs": "$1 дӀасахьажорш",
        "whatlinkshere-hidetrans": "$1 латораш",
        "whatlinkshere-hidelinks": "$1 хьажоргаш",
-       "whatlinkshere-hideimages": "$1 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88",
+       "whatlinkshere-hideimages": "$1 файлийн хьажоргаш",
        "whatlinkshere-filters": "Литтарш",
        "autoblockid": "Ша блоккхетар #$1",
        "block": "Декъашхочун блоктохар",
        "blockip": "Блоктоха",
        "blockip-legend": "Декъашхочун блоктохар",
        "blockiptext": "Бухахь йолу форманца блоктоха IP-адресна цунтӏера дӏаяздарш ца дайта.\nБлоктоха магийна цо зенаш деш делахь кхин хӏокху [[{{MediaWiki:Policy-url}}|низам ца]].\nЛахахь билгалде блоктохарна бахьна.",
-       "ipadressorusername": "IP-адрес я декъашхочун цӀе:",
+       "ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
        "ipbexpiry": "Хан чекхйолу:",
        "ipbreason": "Бахьна:",
        "ipbreason-dropdown": "* Белхан некъ дӀакъовлар бахьанаш:\n** Харца хаам бар\n** АгӀонан чураниг дӀаяккхар\n** Спам-хьажорагаш арахьара сайташна\n** МаьӀна доцу текст тӀетохар\n** Декъашхой хьийзабар, кхерамаш тиссар\n** Масийтта лараман яздар зуламан лелаяр\n** Магитина йоцу декъашхочун цӀе",
        "newimages": "Керлачу файлийн галерей",
        "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.",
        "newimages-legend": "Литтар",
-       "showhidebots": "$1 боташ",
        "noimages": "Суьрташ дац.",
        "ilsubmit": "Лаха",
        "bydate": "терахьашца",
index 4a517a9..782d910 100644 (file)
        "protectedpages": "پەڕە پارێزراوەکان",
        "protectedpages-indef": "تەنیا پاراستنە بێسنوورەکان",
        "protectedpages-cascade": "تەنیا پاراستنە زنجیرییەکان",
+       "protectedpages-noredirect": "ڕەوانەکەرەکان بشارەوە",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
        "protectedpages-page": "پەڕە",
+       "protectedpages-params": "پارامەترەکانی پاراستن",
+       "protectedpages-reason": "ھۆکار",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "log-title-wildcard": "گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن",
        "showhideselectedlogentries": "بابەتەکانی ھەڵبژێردراوی لۆگ نیشان بدە/بشارەوە",
        "allpages": "ھەموو پەڕەکان",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "allpagesfrom": "نیشاندانی پەڕەکان بە دەستپێکردن لە:",
        "blockip": "بەربەستنی بەکارھێنەر",
        "blockip-legend": "بەربەست‌کردنی بەکارهێنەر",
        "blockiptext": "لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.\nئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].\nلە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).",
-       "ipadressorusername": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
+       "ipaddressorusername": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
        "ipbexpiry": "بەسەرچوون:",
        "ipbreason": "هۆکار:",
        "ipbreason-dropdown": "*ھۆکارە ھاوبەشەکانی بەربستن\n**دانانی زانیاریی ھەڵە\n**لابردنی ناوەرۆکی پەڕەکان\n**بەستەر بۆ پەڕەی دەرەکی نەگونجاو\n**نووسینی قسەی بێ‌مانا و بێ‌سوود\n**ھەڵسوکەوت یان وتاری ھاندەر بۆ توندوتیژی\n**بەکارھێنانی چەند ھەژمار پێکەوە\n**ناوی بەکارھێنەریی نەگونجاو",
        "newimages-summary": "ئەم پەڕە تایبەتە دوایین پەڕگە بارکراوەکان نیشان دەدات.",
        "newimages-legend": "پاڵاوتن",
        "newimages-label": "ناوی پەڕگە (یان بەشێکیی):",
-       "showhidebots": "(بۆتەکان $1)",
        "noimages": "هیچ بۆ بینین نییە.",
        "ilsubmit": "بگەڕێ",
        "bydate": "بەپێی ڕێکەوت",
index 7a1d270..c3c0736 100644 (file)
        "log": "Righjistramenti",
        "all-logs-page": "Tutte l'azzioni",
        "allpages": "Tutte e pagine",
-       "alphaindexline": "da $1 à $2",
        "nextpage": "Pagina seguente ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mustrà e pagine à parte da:",
        "whatlinkshere-links": "$1 ligami",
        "whatlinkshere-hidetrans": "inclusione",
        "whatlinkshere-hidelinks": "$1 ligami",
-       "ipadressorusername": "Adrizzu IP o nome di cuntributore",
+       "ipaddressorusername": "Adrizzu IP o nome di cuntributore",
        "ipbreason": "Mutivu:",
        "ipboptions": "2 ore:2 hours,1 ghjornu:1 day,3 ghjorni:3 days,1 sittimana:1 week,2 sittimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 annu:1 year,infinitu:infinite",
        "ipblocklist": "Cuntributori bluccati",
        "file-nohires": "Una diversione incù una risoluzione più alta ùn hè micca dispunibile.",
        "show-big-image": "Schedariu originale",
        "show-big-image-other": "{{PLURAL:$2|Altra risuluzione|Altre risuluzioni}}: $1.",
-       "showhidebots": "($1 boti)",
        "noimages": "Nulla da vede.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "table_pager_limit_label": "Risultati per pagina:",
        "table_pager_limit_submit": "Invià",
        "table_pager_empty": "Micca risultati",
+       "autosumm-replace": "Pagina sustituita incù '$1'",
        "autoredircomment": "Reindirizzamentu à [[$1]]",
        "autosumm-new": "Pagina nova: $1",
        "watchlistedit-raw-titles": "Pagine:",
        "tags-edit": "mudificà",
        "logentry-delete-delete": "$1 ha cancellatu a pagina $3",
        "logentry-move-move": "$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4",
+       "logentry-newusers-create": "U participante $3 hè statu creatu da $1",
        "rightsnone": "(nessunu)",
        "expand_templates_output": "Risultatu"
 }
index cc0c92e..f3eb3bc 100644 (file)
        "blockip": "Бу IP адресинден иришимни блок эт",
        "blockip-legend": "Къулланыджыны блок эт",
        "blockiptext": "Ашагъыдаки форманы къулланып белли бир IP адресининъ я да къулланыджынынъ иришимини блок этип оласынъыз. Бу тек вандализмни блок этмек ичюн ве [[{{MediaWiki:Policy-url}}|къаиделерге]] уйгъун оларакъ япылмалы. Ашагъыгъа мытлакъа блок этюв иле багълы бир изаат язынъыз. (меселя: Шу саифелерде вандализм япты).",
-       "ipadressorusername": "IP адреси я да къулланыджы ады",
+       "ipaddressorusername": "IP адреси я да къулланыджы ады",
        "ipbexpiry": "Битиш муддети",
        "ipbreason": "Себеп",
        "ipbsubmit": "Бу къулланыджыны блок эт",
        "newimages-summary": "Бу махсус саифе сонъки юкленген файлларны косьтере.",
        "newimages-legend": "Сюзгюч",
        "newimages-label": "Файл ады (я да онынъ бир парчасы):",
-       "showhidebots": "(ботларны $1)",
        "noimages": "Ресим ёкъ.",
        "ilsubmit": "Къыдыр",
        "bydate": "хронологик сыранен",
index 59e62e3..1bc4ccf 100644 (file)
        "blockip": "Bu IP adresinden irişimni blok et",
        "blockip-legend": "Qullanıcını blok et",
        "blockiptext": "Aşağıdaki formanı qullanıp belli bir IP adresiniñ ya da qullanıcınıñ irişimini blok etip olasıñız. Bu tek vandalizmni blok etmek içün ve [[{{MediaWiki:Policy-url}}|qaidelerge]] uyğun olaraq yapılmalı. Aşağığa mıtlaqa blok etüv ile bağlı bir izaat yazıñız. (meselâ: Şu saifelerde vandalizm yaptı).",
-       "ipadressorusername": "IP adresi ya da qullanıcı adı",
+       "ipaddressorusername": "IP adresi ya da qullanıcı adı",
        "ipbexpiry": "Bitiş müddeti",
        "ipbreason": "Sebep",
        "ipbsubmit": "Bu qullanıcını blok et",
        "newimages-summary": "Bu mahsus saife soñki yüklengen fayllarnı köstere.",
        "newimages-legend": "Süzgüç",
        "newimages-label": "Fayl adı (ya da onıñ bir parçası):",
-       "showhidebots": "(botlarnı $1)",
        "noimages": "Resim yoq.",
        "ilsubmit": "Qıdır",
        "bydate": "hronologik sıranen",
index 7635d22..91e2f67 100644 (file)
        "content-model-text": "čistý text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí parseru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.",
-       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí parseru",
+       "expensive-parserfunction-warning": "Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí syntaktického analyzátoru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.",
+       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí syntaktického analyzátoru",
        "post-expand-template-inclusion-warning": "Varování: Objem vkládaných šablon je příliš velký.\nNěkteré šablony nebudou vloženy.",
        "post-expand-template-inclusion-category": "Stránky překračující povolenou velikost vložených šablon",
        "post-expand-template-argument-warning": "Varování: Tato stránka obsahuje alespoň jeden argument šablony, který je po rozbalení příliš velký.\nTyto argumenty byly vynechány.",
        "log-title-wildcard": "Hledat názvy začínající na tento text",
        "showhideselectedlogentries": "Ukázat/skrýt vybrané záznamy",
        "allpages": "Všechny stránky",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Další stránka ($1)",
        "prevpage": "Předchozí stránka ($1)",
        "allpagesfrom": "Zobrazit stránky počínaje od:",
        "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
        "post-expand-template-inclusion-category-desc": "Po rozbalení všech šablon je stránka větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
        "post-expand-template-argument-category-desc": "Po rozbalení argumentu šablony (něco v trojitých závorkách, např. <code>{{{Foo}}})</code> je stránka větší než <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí parseru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí syntaktického analyzátoru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategorie přidaná pokud stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).",
        "hidden-category-category-desc": "Toto je kategorie, která obsahuje <code><nowiki>__HIDDENCAT__</nowiki></code>, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.",
        "trackingcategories-nodesc": "Popis není k dispozici.",
        "blockip": "Zablokovat uživatele",
        "blockip-legend": "Zablokovat uživatele",
        "blockiptext": "Tento formulář slouží k zablokování editací z konkrétní IP adresy nebo uživatelského jména.\nToto by mělo být používáno jen v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].\nUdejte přesný důvod níže (například ocitujte, které stránky byly poškozeny).",
-       "ipadressorusername": "IP adresa nebo uživatelské jméno:",
+       "ipaddressorusername": "IP adresa nebo uživatelské jméno:",
        "ipbexpiry": "Čas vypršení:",
        "ipbreason": "Důvod:",
        "ipbreason-dropdown": "*Časté důvody blokování\n** Vkládání klamných informací\n** Odstraňování obsahu stránek\n** Vkládání reklamních externích odkazů\n** Vkládání nesmyslů\n** Zastrašování nebo vyhrožování\n** Zneužívání více účtů\n** Nevhodné uživatelské jméno",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
-       "showhidebots": "($1 roboty)",
        "noimages": "Není co zobrazit.",
        "ilsubmit": "Hledat",
        "bydate": "podle data",
        "version": "Verze",
        "version-extensions": "Nainstalovaná rozšíření",
        "version-specialpages": "Speciální stránky",
-       "version-parserhooks": "Přípojné body parseru",
+       "version-parserhooks": "Přípojné body syntaktického analyzátoru",
        "version-variables": "Proměnné",
        "version-antispam": "Ochrana proti spamu",
        "version-skins": "Vzhledy",
        "duration-centuries": "$1 {{PLURAL:$1|století}}",
        "duration-millennia": "$1 {{PLURAL:$1|tisíciletí}}",
        "rotate-comment": "Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček",
-       "limitreport-title": "Data profilování parseru:",
+       "limitreport-title": "Data profilování syntaktického analyzátoru:",
        "limitreport-cputime": "Využití času procesoru",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "limitreport-walltime": "Využití reálného času",
        "limitreport-templateargumentsize": "Velikost argumentů šablon",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}",
        "limitreport-expansiondepth": "Největší hloubka expanze",
-       "limitreport-expensivefunctioncount": "Počet náročných funkcí parseru",
+       "limitreport-expensivefunctioncount": "Počet náročných funkcí syntaktického analyzátoru",
        "expandtemplates": "Substituce šablon",
-       "expand_templates_intro": "Tato speciální stránka vezme text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce parseru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí prakticky všechno v dvojitých složených závorkách.",
+       "expand_templates_intro": "Tato speciální stránka zpracuje text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce syntaktického analyzátoru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí všechno v dvojitých složených závorkách.",
        "expand_templates_title": "Název stránky kvůli kontextu pro {{FULLPAGENAME}} apod.:",
        "expand_templates_input": "Vstupní text:",
        "expand_templates_output": "Výstup",
index 82c50f4..92da2fb 100644 (file)
        "log-title-wildcard": "Chwilio am deitlau'n dechrau gyda'r geiriau hyn",
        "showhideselectedlogentries": "Dewis dangos neu guddio cofnodion lòg",
        "allpages": "Pob tudalen",
-       "alphaindexline": "$1 i $2",
        "nextpage": "Y bloc nesaf gan ddechrau gyda ($1)",
        "prevpage": "Y bloc cynt gan ddechrau gyda ($1)",
        "allpagesfrom": "Dangos pob tudalen gan ddechrau o:",
        "blockip": "Rhwystro'r defnyddiwr",
        "blockip-legend": "Rhwystro'r defnyddiwr",
        "blockiptext": "Defnyddiwch y ffurflen hon i rwystro cyfeiriad IP neu ddefnyddiwr rhag ysgrifennu i'r gronfa ddata. \nDylech chi ddim ond gwneud hyn er mwyn rhwystro fandaliaeth, a chan ddilyn [[{{MediaWiki:Policy-url}}|polisi'r wici]]. \nRhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a fandaleiddiwyd).",
-       "ipadressorusername": "Cyfeiriad IP neu enw defnyddiwr:",
+       "ipaddressorusername": "Cyfeiriad IP neu enw defnyddiwr:",
        "ipbexpiry": "Am gyfnod:",
        "ipbreason": "Rheswm:",
        "ipbreason-dropdown": "*Rhesymau cyffredin dros flocio\n** Gosod gwybodaeth anghywir\n** Dileu cynnwys tudalennau\n** Gosod cysylltiadau sbam i wefannau eraill\n** Gosod dwli/lol ar dudalennau\n** Ymddygiad sy'n dychrynu neu'n aflonyddu\n** Camddefnyddio nifer o gyfrifon\n** Enw defnyddiwr annerbyniol",
        "newimages-summary": "Mae'r dudalen arbennig hon yn dangos y ffeiliau a uwchlwythwyd yn ddiweddar.",
        "newimages-legend": "Hidlo",
        "newimages-label": "Enw'r ffeil (neu ran ohono):",
-       "showhidebots": "($1 botiau)",
        "noimages": "Does dim byd i'w weld.",
        "ilsubmit": "Chwilio",
        "bydate": "yn ôl dyddiad",
index c2baddd..f4749fb 100644 (file)
        "blockip": "Bloker bruger",
        "blockip-legend": "Bloker bruger",
        "blockiptext": "Brug formularen herunder til at blokere for skriveadgang fra en bestemt IP-adresse eller et brugernavn.\nDette bør kun gøres for at forhindre vandalisme og skal være i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].\nAngiv en konkret begrundelse herunder (for eksempel med angivelse af sider der har været udsat for vandalisme).",
-       "ipadressorusername": "IP-adresse eller brugernavn",
+       "ipaddressorusername": "IP-adresse eller brugernavn",
        "ipbexpiry": "varighed",
        "ipbreason": "Begrundelse:",
        "ipbreason-dropdown": "*Generelle begrundelser\n** Indsættelse af forkerte oplysninger\n** Fjernelse af korrekt indhold\n** Linkspam\n** Indsættelse af vås/nonsens\n** Utilstedelig opførsel\n** Misbrug af flere brugerkonti\n** Uacceptabelt brugernavn",
        "newimages-summary": "Denne specialside viser de senest oplagte filer.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnavn (eller en del af det):",
-       "showhidebots": "($1 botter)",
        "noimages": "Ingen filer fundet.",
        "ilsubmit": "Søg",
        "bydate": "efter dato",
index 7705a91..811cb9d 100644 (file)
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
+       "node-count-exceeded-category-desc": "Eine Kategorie für Seiten, bei denen die Knotenzahl überschritten wurde.",
        "node-count-exceeded-warning": "Die Seite hat die Knotenpunktanzahl überschritten.",
        "expansion-depth-exceeded-category": "Seiten, die die Expansionstiefe überschritten haben",
+       "expansion-depth-exceeded-category-desc": "Dies ist eine Kategorie für Seiten, bei denen die Expandierungstiefe überschritten wurde.",
        "expansion-depth-exceeded-warning": "Die Seite hat die Expansionstiefe überschritten.",
        "parser-unstrip-loop-warning": "Zirkelbezug festgestellt",
        "parser-unstrip-recursion-limit": "Rekursionsgrenze beim Auflösen überschritten ($1)",
        "right-move": "Seiten verschieben",
        "right-move-subpages": "Seiten inklusive Unterseiten verschieben",
        "right-move-rootuserpages": "Haupt-Benutzerseiten verschieben",
+       "right-move-categorypages": "Kategorieseiten verschieben",
        "right-movefile": "Dateien verschieben",
        "right-suppressredirect": "Beim Verschieben die Erstellung einer Weiterleitung unterdrücken",
        "right-upload": "Dateien hochladen",
        "action-move": "die Seite zu verschieben",
        "action-move-subpages": "diese Seite und zugehörige Unterseiten zu verschieben",
        "action-move-rootuserpages": "Haupt-Benutzerseiten zu verschieben",
+       "action-move-categorypages": "Kategorieseiten zu verschieben",
        "action-movefile": "Diese Datei verschieben",
        "action-upload": "Dateien hochzuladen",
        "action-reupload": "die vorhandene Datei zu überschreiben",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträge anzeigen/verstecken",
        "allpages": "Alle Seiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seite ($1)",
        "prevpage": "Vorherige Seite ($1)",
        "allpagesfrom": "Seiten anzeigen ab:",
        "contributions-title": "Benutzerbeiträge von „$1“",
        "mycontris": "Beiträge",
        "contribsub2": "Von {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
+       "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
        "nocontribs": "Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.",
        "uctop": "(aktuell)",
        "month": "und Monat:",
        "blockip": "IP-Adresse/Benutzer sperren",
        "blockip-legend": "IP-Adresse/Benutzer sperren",
        "blockiptext": "Mit diesem Formular sperrst du eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib den Grund für die Sperre an.",
-       "ipadressorusername": "IP-Adresse oder Benutzername:",
+       "ipaddressorusername": "IP-Adresse oder Benutzername:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemeine Sperrgründe\n** Einfügen falscher Informationen\n** Leeren von Seiten\n** Massenweises Einfügen externer Links\n** Einstellen unsinniger Inhalte in Seiten\n** Ungebührliches Verhalten\n** Missbrauch mit mehreren Benutzerkonten\n** Ungeeigneter Benutzername",
        "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*du wählst die unten stehende Option ab.\n\nIn diesen Fällen musst du, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
        "movearticle": "Seite verschieben:",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+       "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle Seiten in der alten Kategorie werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "movenotallowed": "Du hast nicht die erforderliche Berechtigung, um Seiten verschieben zu können.",
        "movenotallowedfile": "Du hast nicht die erforderliche Berechtigung, um Dateien verschieben zu können.",
        "cant-move-user-page": "Du hast nicht die erforderliche Berechtigung, Benutzerhauptseiten verschieben zu können.",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
+       "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
+       "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
        "newtitle": "Ziel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "newimages-summary": "Diese Spezialseite zeigt die zuletzt hochgeladenen Dateien an.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder ein Teil davon):",
-       "showhidebots": "(Bots $1)",
+       "newimages-showbots": "Uploads von Bots anzeigen",
        "noimages": "Keine Dateien gefunden.",
        "ilsubmit": "Suchen",
        "bydate": "nach Datum",
        "watchlistedit-raw-done": "Deine Beobachtungsliste wurde gespeichert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} hinzugefügt:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt:",
+       "watchlistedit-clear-title": "Beobachtungsliste leeren",
+       "watchlistedit-clear-legend": "Beobachtungsliste leeren",
+       "watchlistedit-clear-explain": "Alle Seitennamen werden von deiner Beobachtungsliste entfernt.",
+       "watchlistedit-clear-titles": "Seitennamen:",
+       "watchlistedit-clear-submit": "Beobachtungsliste leeren (Dies ist dauerhaft!)",
+       "watchlistedit-clear-done": "Deine Beobachtungsliste wurde geleert.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Ein Seitenname wurde|$1 Seitennamen wurden}} entfernt:",
+       "watchlistedit-too-many": "Es gibt hier zu viele Seiten zum Anzeigen.",
+       "watchlisttools-clear": "Beobachtungsliste leeren",
        "watchlisttools-view": "Beobachtungsliste: Änderungen",
        "watchlisttools-edit": "normal bearbeiten",
        "watchlisttools-raw": "im Listenformat bearbeiten (Import/Export)",
index fe31bf8..bee85c3 100644 (file)
        "october-date": "Tışrino Verên $1",
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
        "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "vector-action-unprotect": "Starkerdışi bıvurne",
        "vector-view-create": "Vıraze",
        "vector-view-edit": "Bıvurne",
-       "vector-view-history": "Verênan bıvêne",
+       "vector-view-history": "Tarixê pele bıvêne",
        "vector-view-view": "Bıwane",
        "vector-view-viewsource": "Çımey bıvêne",
        "actions": "Hereketi",
        "formerror": "Xeta: Form nêerşawiyeno",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
-       "cannotdelete-title": "Şıma nêşenê pela \"$1\" besternê",
+       "cannotdelete-title": "Şıma nêşenê pela \"$1\" besterê",
        "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameo xırabın",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu/sernuşte:",
-       "minoredit": "Vırnayışo werkek",
-       "watchthis": "'''Ena pele seyr ke'''",
+       "minoredit": "No yew vurnayışo werdiyo",
+       "watchthis": "Ena pele seyr ke",
        "savearticle": "Pele qeyd ke",
        "preview": "Verqayt",
        "showpreview": "Verqayti bımocne",
        "recentchangescount": "Amarê vurnayışê ke hesıbyaye deye bımocneyê:",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
-       "savedprefs": "Tecihey şıma qeyd biyey.",
+       "savedprefs": "Tecihê şıma qeyd biy.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
-       "recentchanges-label-minor": "Vırnayışo werkek",
+       "recentchanges-label-minor": "No yew vurnayışo werdiyo",
        "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
        "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
        "recentchanges-legend-newpage": "([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
-       "rclistfrom": "$3 $2 ra tepiya vurnayışanê newan bımocne",
+       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "Vurnayışanê werdiyan $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
        "uploadwarning-text": "Bînê de deskripyonê dosyayî bivurne u reyna qeyd bike.",
        "savefile": "Dosya qeyd ke",
        "uploadedimage": "\"[[$1]]\" bar bi",
-       "overwroteimage": "Newi versiyona resim da \"[[$1]]\"i bar biya",
+       "overwroteimage": "yew versiyonê \"$1\" newe bar bi",
        "uploaddisabled": "bar kerdişî iptal biyo",
        "copyuploaddisabled": "URL bar kerdiş kefiliyeyo.",
-       "uploaddisabledtext": "Barkerdışa dosyaya dewre ra veta.",
+       "uploaddisabledtext": "Barkerdışê dosya dewre ra veta.",
        "php-uploaddisabledtext": "barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.",
        "uploadscripted": "Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.",
        "uploadinvalidxml": "Dosyaya barkerdiye de XML nêgureniya.",
        "zip-unsupported": "Dosya MediaWiki ra ZIP dosyaya nêwanêna yana derganiya ZIP de cı aya pıro nina. Kontrolê emeleyey oyo veş nêbeno.",
        "uploadstash": "Nımıtışê barkerdışi",
        "uploadstash-summary": "Na pela barkerdış (yana hewna barbenayış dı) hema hewna wiki'dedosyeyê ke nêpêseryayê enarê rasayış gre danop. Enê dosyay o ke a dosya keno bar tek o şena a dosya bıvino.",
-       "uploadstash-clear": "Dosyeyanê ke idareten vuriyenê inan bester",
+       "uploadstash-clear": "Dosyeyanê ke idareten vuriyenê inan bestere",
        "uploadstash-nofiles": "Dosyeyê ke idareten bıvıryê çınyê.",
        "uploadstash-badtoken": "Karkerdışê cı nêbı, muhtemelen desture şımayê timarkerdışi zeman do şıma ravêrdo. Fına bıcerbnê.",
        "uploadstash-errclear": "Besternayışê dosyayan nêbı",
        "filedelete-comment": "Sebeb:",
        "filedelete-submit": "Bestere",
        "filedelete-success": "'''$1'''  esteriyayo.",
-       "filedelete-success-old": "Versiyonê '''[[Media:$1|$1]]'''i $3, $2 esteriyaya.",
+       "filedelete-success-old": "Versiyonê '''[[Media:$1|$1]]''' be tarixê $3, $2 ra esteriya.",
        "filedelete-nofile": "'''$1''' çin o.",
        "filedelete-nofile-old": "Versiyonê arşivi ye '''$1'''î pê enê detayanê xasî çin o.",
        "filedelete-otherreason": "Sebebo bin/ilaweyın:",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
-       "randompage-nopages": "Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.",
+       "randompage-nopages": "Na {{PLURAL:$2|cayê namey|cayê nameyan}} de nê peli çıniyê: $1.",
        "randomincategory": "Ğoseri pera kategoriya",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
        "randomincategory-selectcategory": "Pera ke cıra raşt ameye kategori do bıgéri yo: $1 $2.",
        "randomincategory-selectcategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
-       "randomredirect-nopages": "Ena cayênameyê \"$1\"i de serkırışten çıniya.",
+       "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê pele",
        "statistics-header-edits": "Îstatistikê vurnayîşî",
        "withoutinterwiki-submit": "Bımocne",
        "fewestrevisions": "Pelê be senık çımraviyarnayışi",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
-       "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
+       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nlinks": "$1 {{PLURAL:$1|link|linkî}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
        "lonelypages": "Pelê seyi",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
-       "uncategorizedpages": "Pelayanê ke kategorî nibiye",
-       "uncategorizedcategories": "Kategoriyê ke bêkategoriyê",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
+       "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
        "uncategorizedimages": "Dosyayê ke bê kategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nê xebtênê",
+       "unusedcategories": "Kategoriyê ke nêgureniyê",
        "unusedimages": "Dosyeyê ke nê xebtênê",
        "popularpages": "Pelî ke populer o.",
-       "wantedcategories": "Kategoriye ke waziyayê",
+       "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Peleye ke waştênê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
        "wantedfiles": "Dosyeyê cıgeyriyayey",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
-       "mostlinkedcategories": "Kategoriyê ke tewr zaf wesiqa rê gıreyê",
+       "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
        "mostlinkedtemplates": "Şablonê ke tewr zafî pela re gıre bîye.",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "move": "Bere",
        "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
-       "unusedcategoriestext": "kategoriyê ke cêrdeyê estê lakin qet ju wesiqa yana kategori de nexebtênê.",
+       "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "notargettext": "qey xebıtnayişê ney fonksiyoni şıma yew hedef nişane nêkerd.",
        "nopagetitle": "wina yew pelê hedefi çin o.",
        "log-title-wildcard": "sername yê ke pê ney nuşteyi destkenêpê bıgêr.",
        "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 ra $2ine",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelanê ke be ena herfe dest pêkenê bımocne",
        "activeusers-count": "$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-hidebots": "Botan bınımne",
-       "activeusers-hidesysops": "İdarekerdoğan bınımne",
+       "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "listgrouprights": "heqê grubê karberi",
        "listgrouprights-summary": "wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.\nqey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
        "listgrouprights-namespaceprotection-namespace": "Caynami",
-       "trackingcategories": "Kategoriye taqiban",
-       "trackingcategories-msg": "Kategoriya taqibi",
+       "trackingcategories": "Kategoriyê teqibi",
+       "trackingcategories-msg": "Kategoriya teqibi",
        "trackingcategories-name": "Namey mesaci",
        "trackingcategories-desc": "Kriterê definayışê kategoriye",
        "trackingcategories-disabled": "Kategoriya feal niya",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
-       "addwatch": "Listeyê seyri deke",
+       "addwatch": "Lista seyrkerdışi ke",
        "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
-       "removewatch": "Listedê mınê seyr kerdışi ra hewad",
+       "removewatch": "Lista seyrkerdışi ra wedare",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "watch": "Seyr ke",
-       "watchthispage": "'''Ena pele seyr ke'''",
-       "unwatch": "Teqib meke",
+       "watchthispage": "Ena pele seyr ke",
+       "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "notvisiblerev": "Revizyon esteriyayo",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
        "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Pela rê gırey",
+       "whatlinkshere": "Pele rê gırey",
        "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
        "blockip": "Karberi kılit ke",
        "blockip-legend": "Karber blok bike",
        "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo).",
-       "ipadressorusername": "Adresa IPy ya zi nameyê karberi:",
+       "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbreason": "Sebeb:",
        "ipbreason-dropdown": "*sebebê verni-grewtışi yê pêroyi\n** malumatê şaş têare kerdış\n** Zerreyê pelan vetış\n** keyepelê teberi re gırey eştış\n** pelani re qıseyê tewşan(toşan) eştış\n** Tehditwari hereket/Taciz\n** yew ra ziyed hesaban xırab şuxulnayiş\n** nameyê karberi yo ke meqbul niyo",
        "import-comment": "Vatış:",
        "importtext": "Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.",
        "importstart": "Pelan împort kenî",
-       "import-revision-count": "$1 {{PLURAL:$1|revizyon|revizyon}}",
+       "import-revision-count": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "importnopages": "Pel çino ke import bike",
        "imported-log-entries": " $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.",
        "importfailed": "Împort nebiy: <nowiki>$1</nowiki>",
        "import-logentry-upload": "dosyayê bar kerdişî ra [[$1]] împort biyo",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "import-logentry-interwiki": "$1 transwiki biyo",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra",
+       "import-logentry-interwiki-detail": "$2 ra $1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "javascripttest": "Cerebnayışê JavaScripti",
        "javascripttest-title": "Testê $1 gurweyênê",
        "javascripttest-pagetext-noframework": "Na pela testanê JavaScripta gurweynayışi re abıryaya.",
        "tooltip-pt-watchlist": "Lista pelanê ke to gırewtê seyrkerdış",
        "tooltip-pt-mycontris": "Listeya dekerdışan de şıma",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
-       "tooltip-pt-logout": "Sistem ra vıcyayış",
+       "tooltip-pt-logout": "Bıveciye",
        "tooltip-ca-talk": "Zerrekê pele sero werênayış",
        "tooltip-ca-edit": "Tı şenay na pele bıvurnê. Kerem ke, qeydkerdış ra ver gocega verqayti bıgurene.",
        "tooltip-ca-addsection": "Zu bınnusteya newi ak",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
-       "tooltip-watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "tooltip-watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "tooltip-recreate": "pel hewn a bışiyo zi tepiya biya",
        "tooltip-upload": "Sergen de bari be",
        "tooltip-rollback": "\"Peyser bia\" be yew tık pela iştıraq(an)ê peyên|i(an) peyser ano.",
        "pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
        "pageinfo-recent-authors": "Amarina nuştekaran pêro",
        "pageinfo-magic-words": "{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini",
-       "pageinfo-hidden-categories": "($1) {{PLURAL:$1|Kategoriyer|Kategoriyan}} bınımne",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra",
        "pageinfo-toolboxlink": "Melumatê pele",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "newimages-label": "Nameyê dosya ( ya zi parçe ey)",
-       "showhidebots": "(bota $1)",
        "noimages": "Çik çini yo.",
        "ilsubmit": "Cı geyre",
        "bydate": "goreyê zemani",
        "minutes": "{{PLURAL:$1|$1 deqa|$1 deqan}}",
        "hours": "{{PLURAL:$1|$1 saete|$1 saetan}}",
        "days": "{{PLURAL:$1|$1 roce|$1 roci}}",
-       "weeks": "{{PLURAL:$1|$1 hefte|$1 hefteyan}}",
+       "weeks": "{{PLURAL:$1|$1 hefte|$1 heftey}}",
        "months": "{{PLURAL:$1|aşme|$1 aşman}}",
-       "years": "{{PLURAL:$1|$1 serre|$1 serran}}",
+       "years": "{{PLURAL:$1|$1 serre|$1 serri}}",
        "ago": "Verê $1",
-       "just-now": "Hema newke",
-       "hours-ago": "Verê $1 {{PLURAL:$1|saete|saetan}}",
+       "just-now": "tafte nıka",
+       "hours-ago": "$1 {{PLURAL:$1|saete|saeti}} raver",
        "minutes-ago": "Verê $1 {{PLURAL:$1|deqa|deqan}}",
        "seconds-ago": "Verê $1 {{PLURAL:$1|saniya|saniyeyan}}",
        "monday-at": "Dışeme $1 de",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
        "exif-iimcategory": "Kategoriye",
-       "exif-iimsupplementalcategory": "Kategoriyê temam kerdışi",
+       "exif-iimsupplementalcategory": "Kategoriyê temamkerdışi",
        "exif-datetimeexpires": "No peyra mekarênê",
        "exif-datetimereleased": "Bıroşe",
        "exif-originaltransmissionref": "Oricinal pusula da kodê açarnayışi",
        "bitrate-yottabits": "$1Ybps",
        "lag-warn-normal": "Vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
        "lag-warn-high": "Eka serverê databaseyî zaf hebitiyeno, ayra vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
-       "watchlistedit-normal-title": "Listeyê seyirkerdişi bivurne",
-       "watchlistedit-normal-legend": "Listeya seyri ra sername wedarne.",
+       "watchlistedit-normal-title": "Lista seyrkerdışi bıvurne",
+       "watchlistedit-normal-legend": "Lista seyrkerdışi ra sernameyan wedare",
        "watchlistedit-normal-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo.\nEka ti wazeno seroğ biwedarne, kuti ke kistê de, ay işaret bike u \"{{int:Watchlistedit-normal-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist/raw|edit the raw list]].",
        "watchlistedit-normal-submit": "Sernuşteyan wedare",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 seroğ|$1 seroğî}} seyr kerdişê tu ra wedarno.",
-       "watchlistedit-raw-title": "Listeyê seyirkerdişi ye hami bivurne",
-       "watchlistedit-raw-legend": "Listeyê seyirkerdişi ye hami bivurne",
+       "watchlistedit-raw-title": "Lista seyrkerdışia xame bıvurne",
+       "watchlistedit-raw-legend": "Lista seyrkerdışia xame bıvurne",
        "watchlistedit-raw-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo u ti eşkeno pê dekerdiş u wedarnayîş liste bivurne.\nEka vurnayîşê ti qediyo, Listeyê Seyr Kerdişî Rocaniye Bike \"{{int:Watchlistedit-raw-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].",
        "watchlistedit-raw-titles": "Seroğî:",
-       "watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "watchlistedit-raw-done": "Listeyê tuyê seyrkerdişi rocaniye biyo",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 seroğ|$1 seroğî}} de kerd:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 seroğ|$1 seroği}} besteriyaye:",
-       "watchlisttools-view": "vurnayışanê eleqadari bıvin",
-       "watchlisttools-edit": "Lista seyrkerdışi bıvênên u bıvurnên",
-       "watchlisttools-raw": "Listeyê seyr-kerdışi bıvin",
+       "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
+       "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
+       "watchlisttools-raw": "Lista seyrkerdışia xame bıvurne",
        "iranian-calendar-m1": "Farvardin",
        "iranian-calendar-m2": "Ordibeheşt",
        "iranian-calendar-m3": "Xordad",
        "tags-intro": "Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.",
        "tags-tag": "Nameyê etiketi",
        "tags-display-header": "Listeyê vurnayîşî de esayîş",
-       "tags-description-header": "Tam akerdena maney cı",
+       "tags-description-header": "Tam arezekerdışê maneyê cı",
        "tags-active-header": "Activ o?",
        "tags-hitcount-header": "Vurnayîşî ke etiket biyê",
        "tags-active-yes": "E",
        "htmlform-no": "Nê",
        "htmlform-yes": "Eya",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
+       "htmlform-cloner-create": "Tayêna cı ke",
+       "htmlform-cloner-delete": "Wedare",
        "sqlite-has-fts": "$1 tam-metn destegê cı geyrayışiya piya",
        "sqlite-no-fts": "$1 tam-metn bê destegê cı geyrayışi",
        "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
index 9cdc751..8dc4ee3 100644 (file)
        "permalink": "Wobstawny wótkaz",
        "print": "Śišćaś",
        "view": "Woglědaś se",
+       "view-foreign": "Na $1 se woglědaś",
        "edit": "wobźěłaś",
+       "edit-local": "Lokalne wopisanje wobźěłaś",
        "create": "Wuźěłaś",
+       "create-local": "Lokalne wopisanje pśidaś",
        "editthispage": "Bok wobźěłaś",
        "create-this-page": "Bok wuźěłaś",
        "delete": "Wulašowaś",
        "edit-gone-missing": "Njejo móžno było bok aktualizěrowaś.\nZda sem až jo wulašowany.",
        "edit-conflict": "Wobźěłański konflikt.",
        "edit-no-change": "Wašo wobźěłanje jo se ignorěrowało, dokulaž tekst njejo se změnił.",
+       "postedit-confirmation-created": "Toś ten bok jo se napórał.",
+       "postedit-confirmation-restored": "Bok jo se wótnowił.",
        "postedit-confirmation-saved": "Twója změna jo se składła.",
        "edit-already-exists": "Njejo móžno było nowy bok napóraś.\nEksistěrujo južo.",
        "defaultmessagetext": "Standardny tekst powěźeńki",
        "action-createpage": "Boki napóraś",
        "action-createtalk": "Diskusijne boki napóraś",
        "action-createaccount": "Toś to wužywarske konto napóraś",
+       "action-history": "historiju toś togo boka pokazaś",
        "action-minoredit": "toś tu změnu ako snadnu markěrowaś",
        "action-move": "toś ten bok pśesunuś",
        "action-move-subpages": "toś ten bok a jogo pódboki pśesunuś",
        "pageswithprop-prophidden-binary": "binarna kakostna gódnota schowana ($1)",
        "doubleredirects": "Dwójne dalejpósrědnjenja",
        "doubleredirectstext": "Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.\nKužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe \"napšawdny\" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <del>Pśešmarnjone</del> zapiski su južo wobstarane.",
-       "double-redirect-fixed-move": "[[$1]] jo se pśesunuł, jo něnto dalejposrědnjenje do [[$2]]",
-       "double-redirect-fixed-maintenance": "Dwójne dalejpósrědnjenje wót [[$1]] do [[$2]] se pórěźa.",
+       "double-redirect-fixed-move": "[[$1]] jo se pśesunuł.\nJo se awtomatiski zaktualizěrował a pósrědnja se něnto dalej do [[$2]].",
+       "double-redirect-fixed-maintenance": "Dwójne dalejpósrědnjenje wót [[$1]] do [[$2]] pórěźa se awtomatiski w wótwardowańskem nadawku.",
        "double-redirect-fixer": "Pórěźaŕ dalejpósrědnjenjow",
        "brokenredirects": "Skóńcowane dalejpósrědnjenja",
        "brokenredirectstext": "Slědujuce dalejpósrědnjenja wótkazuju na njeeksistěrujuce boki:",
        "log-title-wildcard": "Pytaś nadpismo, kótarež zachopijo z ...",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazaś/schowaś",
        "allpages": "Wšykne boki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Slědujucy bok ($1)",
        "prevpage": "Pśedchadny bok ($1)",
        "allpagesfrom": "Boki pokazaś wót:",
        "listgrouprights-removegroup-self": "Móžo {{PLURAL:$2|kupku|kupce|kupki|kupkow}} ze swójskego konta wótpóraś: $1",
        "listgrouprights-addgroup-self-all": "Móžo wše kupki swójskemu kontoju pśidaś",
        "listgrouprights-removegroup-self-all": "Móžo wše kupki ze swójskego konta wótpóraś",
+       "listgrouprights-namespaceprotection-header": "Wobgranicowanja mjenjowego ruma",
+       "listgrouprights-namespaceprotection-namespace": "Mjenjowy rum",
+       "listgrouprights-namespaceprotection-restrictedto": "Pšawa, kótarež dowóluju wužywarjeju wobźěłowanje",
+       "trackingcategories": "Slědowańske kategorije",
+       "trackingcategories-msg": "Slědowańska kategorija",
+       "trackingcategories-name": "Mě powěźeńki",
+       "trackingcategories-desc": "Kriterije za zapśěgowanje kategorije",
+       "trackingcategories-nodesc": "Žedno wopisanje k dispoziciji",
+       "trackingcategories-disabled": "Kategorija jo znjemóžnjona",
        "mailnologin": "Njejo móžno e-mailku pósłaś.",
        "mailnologintext": "Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.",
        "emailuser": "Toś tomu wužywarjeju e-mail pósłaś",
        "contributions-title": "Wužywarske pśinoski wót $1",
        "mycontris": "Pśinoski",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Wužywarske konto \"$1\" njejo zregistrowane.",
        "nocontribs": "Za toś te kriterije njejsu žedne změny se namakali.",
        "uctop": "(aktualny)",
        "month": "wót mjaseca (a jěsnjej):",
        "blockip": "Wužywarja blokěrowaś",
        "blockip-legend": "Wužywarja blokěrowaś",
        "blockiptext": "Wužywaj slědujucy formular, jolic až coš wěstej IP-adresy abo konkretnemu wužywarjeju pśistup znjemóžniś. Take dejało se pó [[{{MediaWiki:Policy-url}}|směrnicach]] jano staś, aby se wandalizmoju zadorało. Pšosym zapódaj pśicynu za twójo blokěrowanje (na pś. mógu se citěrowaś konkretne boki, źo jo se wandalěrowało).",
-       "ipadressorusername": "IP-adresa abo wužywarske mě",
+       "ipaddressorusername": "IP-adresa abo wužywarske mě",
        "ipbexpiry": "Cas blokěrowanja:",
        "ipbreason": "Pśicyna:",
        "ipbreason-dropdown": "*powšykne pśicyny blokěrowanja\n** pódawanje njepšawych informacijow\n** wulašowanje wopśimjeśa bokow\n** pódawanje spamowych eksternych wótkazow\n** pisanje głuposćow na bokach\n** pśestupjenje zasady \"žedne wósobinske atakěrowanja\"\n** złowólne wužywanje wjele wužywarskich kontow\n** njekorektne wužywarske mě",
        "newimages-summary": "Toś ten specialny bok pokazujo dataje, kótarež su se ako slědne nagrali.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mě (abo źěl z togo):",
-       "showhidebots": "(awtomatiske programy (boty) $1)",
        "noimages": "Žedne dataje njejsu se namakali.",
        "ilsubmit": "Pytaś",
        "bydate": "pó datumje",
        "htmlform-no": "Ně",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wubjeŕ móžnosć",
+       "htmlform-cloner-create": "Wěcej pśidaś",
+       "htmlform-cloner-delete": "Wótpóraś",
+       "htmlform-cloner-required": "Nanejmjenjej jadna gódnota jo trěbna.",
        "sqlite-has-fts": "Wersija $1 z pódpěru za połnotekstowe pytanje",
        "sqlite-no-fts": "Wersija $1 bźez pódpěry za połnotekstowe pytanje",
        "logentry-delete-delete": "$1 jo bok $3 {{GENDER:$2|wulašował|wulašowała}}",
index db7a2ec..36558a9 100644 (file)
        "edit-gone-missing": "Impusébil arnuvêr la pàgina. \nA sèmbra ch'la sìa stêda scanşlêda.",
        "edit-conflict": "Cuntrâst 'd edisiòun.",
        "edit-no-change": "La mudéfica an n'é mìa stêda cunsidrêda perchè an n'é mìa stê fât di cambiamèint al tèst.",
+       "postedit-confirmation-created": "La pàgina l'é stêda fâta",
+       "postedit-confirmation-restored": "La pàgina l'é stêda turnêda a mèter",
        "postedit-confirmation-saved": "La mudéfica l'é stêda salvêda.",
        "edit-already-exists": "L'é impusébil fêr 'na pàgina nōva.\nLa ghé bèle.",
        "defaultmessagetext": "Tèst pre-stabilî",
        "revdelete-text-text": "Al versiòun scanşlêdi as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "revdelete-text-file": " Al versiòun di file scanşlê as vèden incòra int la stòria dal file, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "logdelete-text": "I fât scanşlê as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "revdelete-text-others": "Êter aministradōr ed {{SITENAME}} a srân incòra bòun ed vèder j argomèint lughê e prân a turnêri a mèter incòra ed nōv per mèz ed cól canêl ché, se în mìa stê impustê di nōv lémit.",
+       "revdelete-confirm": "Per piaşèir cunfèirma che còst l'é còl ch'ét vō fêr, che t'é infurmê dal cunseguèinsi, e che t'é drē fêr còst int al rispèt dal [[{{MediaWiki:Policy-url}}|léni guîda]].",
+       "revdelete-suppress-text": "La scanşlêda la duvré èser druvêda <strong>sōl</strong> in chi chêş ché:\n* infurmasiòun che prén èser calónij \n* infurmasiòun personêli cme \n*: <em>indirés, nómer ed telèfon, côdis fischêl, e via acsé.</em>",
+       "revdelete-legend": "Impôsta i lémit seguèint al versiòun scanşlêdi:",
+       "revdelete-hide-text": "Tèst ed la versiòun",
+       "revdelete-hide-image": "Lōga j argumèint dal file",
+       "revdelete-hide-name": "Lōga l'asiòun e l'elemèint ed la 'stèsa",
+       "revdelete-hide-comment": "Elemèint ed la mudéfica o spiegasiòun ed l'asiòun",
+       "revdelete-hide-user": "Nòm o indirés IP ed l'avtōr",
+       "revdelete-hide-restricted": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-radio-same": "(an cambiêr mìa)",
        "revdelete-radio-set": "Nascònd",
        "revdelete-radio-unset": "Fà vèder",
+       "revdelete-suppress": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-unsuppress": "Tó via i lémit al revisiòun armési",
+       "revdelete-log": "Mutîv:",
+       "revdelete-submit": "Drōva {{PLURAL:$1|int la revisiòun sernîda|int al revisiòun sernîdi}}",
+       "revdelete-success": "<strong>Vésta ed la revisòun arnuvêda int al môd gióst.</strong>",
+       "revdelete-failure": "<strong>La vésta 'd la versiòun l'an pōl mìa èser arnuvêda:</strong>\n$1",
+       "logdelete-success": "<strong>Vésta dal fât impustêda int al môd gióst.</strong>",
+       "logdelete-failure": "<strong>La vésta dal fât l'an pōl mìa èser impustêda:</strong>\n$1",
        "revdel-restore": "Câmbia la vidûda.",
+       "pagehist": "Stòria 'd la pàgina",
+       "deletedhist": "Stòria scanşlêda",
        "revdelete-reasonotherlist": "Êtra ragiòun",
        "revertmerge": "Scanşèla l'uniòun",
        "history-title": "$1 stòria dal mudéfichi",
        "booksources-go": "Và",
        "log": "Regéster",
        "allpages": "Tót al pàgini.",
-       "alphaindexline": "da $1 a $2",
        "allarticles": "Tót al pàgini.",
        "allpagessubmit": "Và",
        "categories": "Categoréi",
        "file-info-gif-looped": "A ripetisiòun",
        "file-info-png-looped": "A ripetisiòun",
        "newimages-legend": "Fîltra",
-       "showhidebots": "($1 i bot)",
        "ilsubmit": "Sērca",
        "bydate": "per dâta",
        "ago": "$1 fa",
index 07aed30..87fe5ba 100644 (file)
        "blockip": "Φραγή χρήστη ή διεύθυνσης IP",
        "blockip-legend": "Φραγή του χρήστη",
        "blockiptext": "Χρησιμοποιήστε την παρακάτω φόρμα για να εμποδίσετε παρεμβάσεις στο κείμενο από μια συγκεκριμένη διεύθυνση IP ή όνομα χρήστη.\nΤο μέτρο αυτό πρέπει να λαμβάνεται μόνο σε περιπτώσεις βανδαλισμού σελίδων και πάντα σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].\nΠαρακαλούμε να αιτιολογήσετε την ενέργειά σας (παραπέμποντας π.χ. σε συγκεκριμένες σελίδες που υπέστησαν βανδαλισμό).",
-       "ipadressorusername": "Διεύθυνση IP ή όνομα χρήστη",
+       "ipaddressorusername": "Διεύθυνση IP ή όνομα χρήστη",
        "ipbexpiry": "Λήξη",
        "ipbreason": "Αιτία:",
        "ipbreason-dropdown": "*Συχνοί λόγοι φραγής\n** Εισαγωγή λανθασμένων πληροφοριών\n** Αφαίρεση περιεχομένου από σελίδες\n** Σύνδεσμοι τύπου spam σε εξωτερικούς ιστοτόπους\n** Εισαγωγή ασυναρτησιών σε σελίδες\n** Εκφοβιστική συμπεριφορά/παρενόχληση\n** Κατάχρηση πολλαπλών λογαριασμών\n** Απαράδεκτο όνομα χρήστη",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα φορτωμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
-       "showhidebots": "($1 bots)",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
index 636a1f1..399c932 100644 (file)
 {
-    "@metadata": {
-        "authors": []
-    },
-    "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
-    "tog-underline": "Link underlining:",
-    "tog-hideminor": "Hide minor edits in recent changes",
-    "tog-hidepatrolled": "Hide patrolled edits in recent changes",
-    "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
-    "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
-    "tog-usenewrc": "Group changes by page in recent changes and watchlist",
-    "tog-numberheadings": "Auto-number headings",
-    "tog-showtoolbar": "Show edit toolbar",
-    "tog-editondblclick": "Edit pages on double click",
-    "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
-    "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
-    "tog-watchdefault": "Add pages and files I edit to my watchlist",
-    "tog-watchmoves": "Add pages and files I move to my watchlist",
-    "tog-watchdeletion": "Add pages and files I delete 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-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
-    "tog-enotifusertalkpages": "Email me when my user talk page is changed",
-    "tog-enotifminoredits": "Email me also for minor edits of pages and files",
-    "tog-enotifrevealaddr": "Reveal my email address in notification emails",
-    "tog-shownumberswatching": "Show the number of watching users",
-    "tog-oldsig": "Existing signature:",
-    "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
-    "tog-uselivepreview": "Use live preview (experimental)",
-    "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",
-    "tog-watchlisthideminor": "Hide minor edits from the watchlist",
-    "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
-    "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
-    "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
-    "tog-ccmeonemails": "Send me copies of emails I send to other users",
-    "tog-diffonly": "Do not show page content below diffs",
-    "tog-showhiddencats": "Show hidden categories",
-    "tog-norollbackdiff": "Omit diff after performing a rollback",
-    "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
-    "tog-prefershttps": "Always use a secure connection when logged in",
-    "underline-always": "Always",
-    "underline-never": "Never",
-    "underline-default": "Skin or browser default",
-    "editfont-style": "Edit area font style:",
-    "editfont-default": "Browser default",
-    "editfont-monospace": "Monospaced font",
-    "editfont-sansserif": "Sans-serif font",
-    "editfont-serif": "Serif font",
-    "sunday": "Sunday",
-    "monday": "Monday",
-    "tuesday": "Tuesday",
-    "wednesday": "Wednesday",
-    "thursday": "Thursday",
-    "friday": "Friday",
-    "saturday": "Saturday",
-    "sun": "Sun",
-    "mon": "Mon",
-    "tue": "Tue",
-    "wed": "Wed",
-    "thu": "Thu",
-    "fri": "Fri",
-    "sat": "Sat",
-    "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",
-    "january-gen": "January",
-    "february-gen": "February",
-    "march-gen": "March",
-    "april-gen": "April",
-    "may-gen": "May",
-    "june-gen": "June",
-    "july-gen": "July",
-    "august-gen": "August",
-    "september-gen": "September",
-    "october-gen": "October",
-    "november-gen": "November",
-    "december-gen": "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",
-    "january-date": "January $1",
-    "february-date": "February $1",
-    "march-date": "March $1",
-    "april-date": "April $1",
-    "may-date": "May $1",
-    "june-date": "June $1",
-    "july-date": "July $1",
-    "august-date": "August $1",
-    "september-date": "September $1",
-    "october-date": "October $1",
-    "november-date": "November $1",
-    "december-date": "December $1",
-    "pagecategories": "{{PLURAL:$1|Category|Categories}}",
-    "pagecategorieslink": "Special:Categories",
-    "category_header": "Pages in category \"$1\"",
-    "subcategories": "Subcategories",
-    "category-media-header": "Media in category \"$1\"",
-    "category-empty": "<em>This category currently contains no pages or media.</em>",
-    "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
-    "hidden-category-category": "Hidden categories",
-    "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
-    "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
-    "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
-    "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
-    "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
-    "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
-    "listingcontinuesabbrev": "cont.",
-    "index-category": "Indexed pages",
-    "noindex-category": "Noindexed pages",
-    "broken-file-category": "Pages with broken file links",
-    "categoryviewer-pagedlinks": "($1) ($2)",
-    "about": "About",
-    "article": "Content page",
-    "newwindow": "(opens in new window)",
-    "cancel": "Cancel",
-    "moredotdotdot": "More...",
-    "morenotlisted": "This list is not complete.",
-    "mypage": "Page",
-    "mytalk": "Talk",
-    "anontalk": "Talk for this IP address",
-    "navigation": "Navigation",
-    "and": "&#32;and",
-    "qbfind": "Find",
-    "qbbrowse": "Browse",
-    "qbedit": "Edit",
-    "qbpageoptions": "This page",
-    "qbmyoptions": "My pages",
-    "faq": "FAQ",
-    "faqpage": "Project:FAQ",
-    "sitetitle": "{{SITENAME}}",
-    "sitesubtitle": "",
-    "vector-action-addsection": "Add topic",
-    "vector-action-delete": "Delete",
-    "vector-action-move": "Move",
-    "vector-action-protect": "Protect",
-    "vector-action-undelete": "Undelete",
-    "vector-action-unprotect": "Change protection",
-    "vector-view-create": "Create",
-    "vector-view-edit": "Edit",
-    "vector-view-history": "View history",
-    "vector-view-view": "Read",
-    "vector-view-viewsource": "View source",
-    "actions": "Actions",
-    "namespaces": "Namespaces",
-    "variants": "Variants",
-    "navigation-heading": "Navigation menu",
-    "errorpagetitle": "Error",
-    "returnto": "Return to $1.",
-    "tagline": "From {{SITENAME}}",
-    "help": "Help",
-    "search": "Search",
-    "searchbutton": "Search",
-    "go": "Go",
-    "searcharticle": "Go",
-    "history": "Page history",
-    "history_short": "History",
-    "updatedmarker": "updated since my last visit",
-    "printableversion": "Printable version",
-    "permalink": "Permanent link",
-    "print": "Print",
-    "view": "View",
-    "view-foreign": "View on $1",
-    "edit": "Edit",
-    "edit-local": "Edit local description",
-    "create": "Create",
-    "create-local": "Add local description",
-    "editthispage": "Edit this page",
-    "create-this-page": "Create this page",
-    "delete": "Delete",
-    "deletethispage": "Delete this page",
-    "undeletethispage": "Undelete this page",
-    "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-    "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
-    "protect": "Protect",
-    "protect_change": "change",
-    "protectthispage": "Protect this page",
-    "unprotect": "Change protection",
-    "unprotectthispage": "Change protection of this page",
-    "newpage": "New page",
-    "talkpage": "Discuss this page",
-    "talkpagelinktext": "Talk",
-    "specialpage": "Special page",
-    "personaltools": "Personal tools",
-    "postcomment": "New section",
-    "addsection": "+",
-    "articlepage": "View content page",
-    "talk": "Discussion",
-    "views": "Views",
-    "toolbox": "Tools",
-    "userpage": "View user page",
-    "projectpage": "View project page",
-    "imagepage": "View file page",
-    "mediawikipage": "View message page",
-    "templatepage": "View template page",
-    "viewhelppage": "View help page",
-    "categorypage": "View category page",
-    "viewtalkpage": "View discussion",
-    "otherlanguages": "In other languages",
-    "redirectedfrom": "(Redirected from $1)",
-    "redirectpagesub": "Redirect page",
-    "talkpageheader": "-",
-    "lastmodifiedat": "This page was last modified on $1, at $2.",
-    "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
-    "protectedpage": "Protected page",
-    "jumpto": "Jump to:",
-    "jumptonavigation": "navigation",
-    "jumptosearch": "search",
-    "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
-    "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
-    "pool-timeout": "Timeout waiting for the lock",
-    "pool-queuefull": "Pool queue is full",
-    "pool-errorunknown": "Unknown error",
-    "pool-servererror": "The pool counter service is not available ($1).",
-    "aboutsite": "About {{SITENAME}}",
-    "aboutpage": "Project:About",
-    "copyright": "Content is available under $1 unless otherwise noted.",
-    "copyrightpage": "{{ns:project}}:Copyrights",
-    "currentevents": "Current events",
-    "currentevents-url": "Project:Current events",
-    "disclaimers": "Disclaimers",
-    "disclaimerpage": "Project:General disclaimer",
-    "edithelp": "Editing help",
-    "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
-    "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
-    "mainpage": "Main Page",
-    "mainpage-description": "Main page",
-    "policy-url": "Project:Policy",
-    "portal": "Community portal",
-    "portal-url": "Project:Community portal",
-    "privacy": "Privacy policy",
-    "privacypage": "Project:Privacy policy",
-    "badaccess": "Permission error",
-    "badaccess-group0": "You are not allowed to execute the action you have requested.",
-    "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
-    "versionrequired": "Version $1 of MediaWiki required",
-    "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
-    "ok": "OK",
-    "pagetitle": "$1 - {{SITENAME}}",
-    "pagetitle-view-mainpage": "{{SITENAME}}",
-    "backlinksubtitle": "← $1",
-    "retrievedfrom": "Retrieved from \"$1\"",
-    "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
-    "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
-    "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
-    "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
-    "youhavenewmessagesmulti": "You have new messages on $1",
-    "newtalkseparator": ",&#32;",
-    "editsection": "edit",
-    "editold": "edit",
-    "viewsourceold": "view source",
-    "editlink": "edit",
-    "viewsourcelink": "view source",
-    "editsectionhint": "Edit section: $1",
-    "toc": "Contents",
-    "showtoc": "show",
-    "hidetoc": "hide",
-    "collapsible-collapse": "Collapse",
-    "collapsible-expand": "Expand",
-    "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.",
-    "feed-unavailable": "Syndication feeds are not available",
-    "site-rss-feed": "$1 RSS feed",
-    "site-atom-feed": "$1 Atom feed",
-    "page-rss-feed": "\"$1\" RSS feed",
-    "page-atom-feed": "\"$1\" Atom feed",
-    "feed-atom": "Atom",
-    "feed-rss": "RSS",
-    "sitenotice": "-",
-    "anonnotice": "-",
-    "newsectionheaderdefaultlevel": "== $1 ==",
-    "red-link-title": "$1 (page does not exist)",
-    "sort-descending": "Sort descending",
-    "sort-ascending": "Sort ascending",
-    "nstab-main": "Page",
-    "nstab-user": "User page",
-    "nstab-media": "Media page",
-    "nstab-special": "Special page",
-    "nstab-project": "Project page",
-    "nstab-image": "File",
-    "nstab-mediawiki": "Message",
-    "nstab-template": "Template",
-    "nstab-help": "Help page",
-    "nstab-category": "Category",
-    "mainpage-nstab": "",
-    "nosuchaction": "No such action",
-    "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
-    "nosuchspecialpage": "No such special page",
-    "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
-    "error": "Error",
-    "databaseerror": "Database error",
-    "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
-    "databaseerror-textcl": "A database query error has occurred.",
-    "databaseerror-query": "Query: $1",
-    "databaseerror-function": "Function: $1",
-    "databaseerror-error": "Error: $1",
-    "laggedslavemode": "<strong>Warning:</strong> 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.\n\nThe administrator who locked it offered this explanation: $1",
-    "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
-    "missingarticle-rev": "(revision#: $1)",
-    "missingarticle-diff": "(Diff: $1, $2)",
-    "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
-    "internalerror": "Internal error",
-    "internalerror_info": "Internal error: $1",
-    "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
-    "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
-    "filedeleteerror": "Could not delete file \"$1\".",
-    "directorycreateerror": "Could not create directory \"$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": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
-    "cannotdelete-title": "Cannot delete page \"$1\"",
-    "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
-    "no-null-revision": "Could not create new null revision for page \"$1\"",
-    "badtitle": "Bad title",
-    "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
-    "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-    "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
-    "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
-    "viewsource": "View source",
-    "viewsource-title": "View source for $1",
-    "actionthrottled": "Action throttled",
-    "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
-    "protectedpagetext": "This page has been protected to prevent editing or other actions.",
-    "viewsourcetext": "You can view and copy the source of this page:",
-    "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
-    "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
-    "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
-    "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
-    "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
-    "mycustomcssprotected": "You do not have permission to edit this CSS page.",
-    "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
-    "myprivateinfoprotected": "You do not have permission to edit your private information.",
-    "mypreferencesprotected": "You do not have permission to edit your preferences.",
-    "ns-specialprotected": "Special pages cannot be edited.",
-    "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
-    "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
-    "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
-    "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
-    "exception-nologin": "Not logged in",
-    "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
-    "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
-    "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
-    "virus-scanfailed": "scan failed (code $1)",
-    "virus-unknownscanner": "unknown antivirus:",
-    "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-    "welcomeuser": "Welcome, $1!",
-    "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
-    "yourname": "Username:",
-    "userlogin-yourname": "Username",
-    "userlogin-yourname-ph": "Enter your username",
-    "createacct-another-username-ph": "Enter the username",
-    "createacct-helpusername": "",
-    "yourpassword": "Password:",
-    "userlogin-yourpassword": "Password",
-    "userlogin-yourpassword-ph": "Enter your password",
-    "createacct-yourpassword-ph": "Enter a password",
-    "yourpasswordagain": "Retype password:",
-    "createacct-yourpasswordagain": "Confirm password",
-    "createacct-yourpasswordagain-ph": "Enter password again",
-    "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
-    "userlogin-remembermypassword": "Keep me logged in",
-    "userlogin-signwithsecure": "Use secure connection",
-    "yourdomainname": "Your domain:",
-    "password-change-forbidden": "You cannot change passwords on this wiki.",
-    "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
-    "login": "Log in",
-    "nav-login-createaccount": "Log in / create account",
-    "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
-    "userlogin": "Log in / create account",
-    "userloginnocreate": "Log in",
-    "logout": "Log out",
-    "userlogout": "Log out",
-    "userlogout-summary": "",
-    "notloggedin": "Not logged in",
-    "userlogin-noaccount": "Don't have an account?",
-    "userlogin-joinproject": "Join {{SITENAME}}",
-    "nologin": "Don't have an account? $1.",
-    "nologinlink": "Create an account",
-    "createaccount": "Create account",
-    "gotaccount": "Already have an account? $1.",
-    "gotaccountlink": "Log in",
-    "userlogin-resetlink": "Forgotten your login details?",
-    "userlogin-resetpassword-link": "Forgot your password?",
-    "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
-    "userlogin-helplink2": "Help with logging in",
-    "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
-    "userlogin-createanother": "Create another account",
-    "createacct-emailrequired": "Email address",
-    "createacct-emailoptional": "Email address (optional)",
-    "createacct-email-ph": "Enter your email address",
-    "createacct-another-email-ph": "Enter email address",
-    "createaccountmail": "Use a temporary random password and send it to the specified email address",
-    "createacct-realname": "Real name (optional)",
-    "createaccountreason": "Reason:",
-    "createacct-reason": "Reason",
-    "createacct-reason-ph": "Why you are creating another account",
-    "createacct-captcha": "Security check",
-    "createacct-imgcaptcha-help": "",
-    "createacct-imgcaptcha-ph": "Enter the text you see above",
-    "createacct-submit": "Create your account",
-    "createacct-another-submit": "Create another account",
-    "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
-    "createacct-benefit-icon1": "icon-edits",
-    "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
-    "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
-    "createacct-benefit-icon2": "icon-pages",
-    "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
-    "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
-    "createacct-benefit-icon3": "icon-contributors",
-    "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
-    "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
-    "badretype": "The passwords you entered do not match.",
-    "userexists": "Username entered already in use.\nPlease choose a different name.",
-    "loginerror": "Login error",
-    "createacct-error": "Account creation error",
-    "createaccounterror": "Could not create account: $1",
-    "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
-    "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
-    "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
-    "nocookiesforlogin": "{{int:nocookieslogin}}",
-    "noname": "You have not specified a valid username.",
-    "loginsuccesstitle": "Login successful",
-    "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
-    "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
-    "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
-    "nouserspecified": "You have to specify a username.",
-    "login-userblocked": "This user is blocked. Login not allowed.",
-    "wrongpassword": "Incorrect password entered.\nPlease try again.",
-    "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
-    "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
-    "password-name-match": "Your password must be different from your username.",
-    "password-login-forbidden": "The use of this username and password has been forbidden.",
-    "mailmypassword": "Reset password",
-    "passwordremindertitle": "New temporary password for {{SITENAME}}",
-    "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
-    "noemail": "There is no email address recorded for user \"$1\".",
-    "noemailcreate": "You need to provide a valid email address.",
-    "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
-    "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
-    "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
-    "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
-    "loginstart": "",
-    "loginend": "",
-    "loginend-https": "",
-    "signupstart": "{{int:loginstart}}",
-    "signupend": "{{int:loginend}}",
-    "signupend-https": "",
-    "mailerror": "Error sending mail: $1",
-    "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
-    "emailauthenticated": "Your email address was confirmed on $2 at $3.",
-    "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
-    "noemailprefs": "Specify an email address in your preferences for these features to work.",
-    "emailconfirmlink": "Confirm your email address",
-    "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
-    "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
-    "emaildisabled": "This site cannot send emails.",
-    "emailsender": "{{SITENAME}}",
-    "accountcreated": "Account created",
-    "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
-    "createaccount-title": "Account creation for {{SITENAME}}",
-    "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
-    "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-    "login-abort-generic": "Your login was unsuccessful - Aborted",
-    "loginlanguagelabel": "Language: $1",
-    "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
-    "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.",
-    "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
-    "pt-login": "Log in",
-    "pt-login-button": "Log in",
-    "pt-createaccount": "Create account",
-    "pt-userlogout": "Log out",
-    "pear-mail-error": "$1",
-    "php-mail-error": "$1",
-    "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
-    "user-mail-no-addy": "Tried to send email without an email address.",
-    "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
-    "changepassword": "Change password",
-    "changepassword-summary": "",
-    "resetpass_announce": "To finish logging in, you must set a new password.",
-    "resetpass_text": "<!-- Add text here -->",
-    "resetpass_header": "Change account password",
-    "oldpassword": "Old password:",
-    "newpassword": "New password:",
-    "retypenew": "Retype new password:",
-    "resetpass_submit": "Set password and log in",
-    "changepassword-success": "Your password has been changed successfully!",
-    "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-    "resetpass_forbidden": "Passwords cannot be changed",
-    "resetpass-no-info": "You must be logged in to access this page directly.",
-    "resetpass-submit-loggedin": "Change password",
-    "resetpass-submit-cancel": "Cancel",
-    "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
-    "resetpass-recycled": "Please reset your password to something other than your current password.",
-    "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
-    "resetpass-temp-password": "Temporary password:",
-    "resetpass-abort-generic": "Password change has been aborted by an extension.",
-    "resetpass-expired": "Your password has expired. Please set a new password to log in.",
-    "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "passwordreset": "Reset password",
-    "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
-    "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
-    "passwordreset-legend": "Reset password",
-    "passwordreset-disabled": "Password resets have been disabled on this wiki.",
-    "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
-    "passwordreset-username": "Username:",
-    "passwordreset-domain": "Domain:",
-    "passwordreset-capture": "View the resulting email?",
-    "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
-    "passwordreset-email": "Email address:",
-    "passwordreset-emailtitle": "Account details on {{SITENAME}}",
-    "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
-    "passwordreset-emailsent": "A password reset email has been sent.",
-    "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
-    "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
-    "changeemail": "Change email address",
-    "changeemail-summary": "",
-    "changeemail-header": "Change account email address",
-    "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
-    "changeemail-no-info": "You must be logged in to access this page directly.",
-    "changeemail-oldemail": "Current email address:",
-    "changeemail-newemail": "New email address:",
-    "changeemail-none": "(none)",
-    "changeemail-password": "Your {{SITENAME}} password:",
-    "changeemail-submit": "Change email",
-    "changeemail-cancel": "Cancel",
-    "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
-    "resettokens": "Reset tokens",
-    "resettokens-summary": "",
-    "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
-    "resettokens-no-tokens": "There are no tokens to reset.",
-    "resettokens-legend": "Reset tokens",
-    "resettokens-tokens": "Tokens:",
-    "resettokens-token-label": "$1 (current value: $2)",
-    "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
-    "resettokens-done": "Tokens reset.",
-    "resettokens-resetbutton": "Reset selected tokens",
-    "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",
-    "nowiki_sample": "Insert non-formatted text here",
-    "nowiki_tip": "Ignore wiki formatting",
-    "image_sample": "Example.jpg",
-    "image_tip": "Embedded file",
-    "media_sample": "Example.ogg",
-    "media_tip": "File link",
-    "sig_tip": "Your signature with timestamp",
-    "hr_tip": "Horizontal line (use sparingly)",
-    "summary": "Summary:",
-    "subject": "Subject/headline:",
-    "minoredit": "This is a minor edit",
-    "watchthis": "Watch this page",
-    "savearticle": "Save page",
-    "preview": "Preview",
-    "showpreview": "Show preview",
-    "showdiff": "Show changes",
-    "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
-    "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
-    "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-    "missingcommenttext": "Please enter a comment below.",
-    "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-    "summary-preview": "Summary preview:",
-    "subject-preview": "Subject/headline preview:",
-    "blockedtitle": "User is blocked",
-    "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "blockednoreason": "no reason given",
-    "whitelistedittext": "Please $1 to edit pages.",
-    "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
-    "nosuchsectiontitle": "Cannot find section",
-    "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
-    "loginreqtitle": "Login required",
-    "loginreqlink": "log in",
-    "loginreqpagetext": "Please $1 to view other pages.",
-    "accmailtitle": "Password sent",
-    "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
-    "newarticle": "(New)",
-    "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
-    "newarticletextanon": "{{int:newarticletext|$1}}",
-    "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
-    "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
-    "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
-    "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
-    "noarticletextanon": "{{int:noarticletext}}",
-    "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
-    "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
-    "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
-    "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
-    "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
-    "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
-    "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
-    "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
-    "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
-    "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
-    "updated": "(Updated)",
-    "note": "<strong>Note:</strong>",
-    "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
-    "continue-editing": "Go to editing area",
-    "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
-    "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
-    "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
-    "editing": "Editing $1",
-    "creating": "Creating $1",
-    "editingsection": "Editing $1 (section)",
-    "editingcomment": "Editing $1 (new section)",
-    "editconflict": "Edit conflict: $1",
-    "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
-    "yourtext": "Your text",
-    "storedversion": "Stored revision",
-    "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
-    "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
-    "yourdiff": "Differences",
-    "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<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.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
-    "editpage-head-copy-warn": "-",
-    "editpage-tos-summary": "-",
-    "longpage-hint": "-",
-    "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
-    "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
-    "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
-    "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
-    "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
-    "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
-    "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
-    "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
-    "template-protected": "(protected)",
-    "template-semiprotected": "(semi-protected)",
-    "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
-    "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
-    "edittools-upload": "-",
-    "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
-    "nocreate-loggedin": "You do not have permission to create new pages.",
-    "sectioneditnotsupported-title": "Section editing not supported",
-    "sectioneditnotsupported-text": "Section editing is not supported in this page.",
-    "permissionserrors": "Permission error",
-    "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
-    "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
-    "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
-    "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
-    "log-fulllog": "View full log",
-    "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
-    "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
-    "edit-conflict": "Edit conflict.",
-    "edit-no-change": "Your edit was ignored because no change was made to the text.",
-    "postedit-confirmation-created": "The page has been created.",
-    "postedit-confirmation-restored": "The page has been restored.",
-    "postedit-confirmation-saved": "Your edit was saved.",
-    "edit-already-exists": "Could not create a new page.\nIt already exists.",
-    "addsection-preload": "",
-    "addsection-editintro": "",
-    "defaultmessagetext": "Default message text",
-    "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
-    "invalid-content-data": "Invalid content data",
-    "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
-    "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
-    "editpage-notsupportedcontentformat-title": "Content format not supported",
-    "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
-    "content-model-wikitext": "wikitext",
-    "content-model-text": "plain text",
-    "content-model-javascript": "JavaScript",
-    "content-model-css": "CSS",
-    "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
-    "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
-    "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
-    "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
-    "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
-    "post-expand-template-argument-category": "Pages containing omitted template arguments",
-    "parser-template-loop-warning": "Template loop detected: [[$1]]",
-    "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
-    "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
-    "node-count-exceeded-category": "Pages where node-count is exceeded",
-    "node-count-exceeded-warning": "Page exceeded the node-count",
-    "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
-    "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
-    "parser-unstrip-loop-warning": "Unstrip loop detected",
-    "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
-    "converter-manual-rule-error": "Error detected in manual language conversion rule",
-    "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
-    "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
-    "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
-    "undo-nochange": "The edit appears to have already been undone.",
-    "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
-    "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
-    "cantcreateaccounttitle": "Cannot create account",
-    "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
-    "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
-    "createaccount-hook-aborted": "$1",
-    "viewpagelogs": "View logs for this page",
-    "nohistory": "There is no edit history for this page.",
-    "currentrev": "Latest revision",
-    "currentrev-asof": "Latest revision as of $1",
-    "revisionasof": "Revision as of $1",
-    "revision-info": "Revision as of $1 by $2",
-    "revision-info-current": "-",
-    "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
-    "previousrevision": "← Older revision",
-    "nextrevision": "Newer revision →",
-    "currentrevisionlink": "Latest revision",
-    "cur": "cur",
-    "next": "next",
-    "last": "prev",
-    "page_first": "first",
-    "page_last": "last",
-    "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-    "history-fieldset-title": "Browse history",
-    "history-show-deleted": "Deleted only",
-    "history_copyright": "-",
-    "histfirst": "oldest",
-    "histlast": "newest",
-    "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-    "historyempty": "(empty)",
-    "history-feed-title": "Revision history",
-    "history-feed-description": "Revision history for this page on the wiki",
-    "history-feed-item-nocomment": "$1 at $2",
-    "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
-    "rev-deleted-comment": "(edit summary removed)",
-    "rev-deleted-user": "(username removed)",
-    "rev-deleted-event": "(log action removed)",
-    "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
-    "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
-    "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-delundel": "change visibility",
-    "rev-showdeleted": "show",
-    "revisiondelete": "Delete/undelete revisions",
-    "revdelete-nooldid-title": "Invalid target revision",
-    "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
-    "revdelete-no-file": "The file specified does not exist.",
-    "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "revdelete-show-file-submit": "Yes",
-    "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
-    "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
-    "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
-    "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
-    "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
-    "revdelete-confirm": "Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
-    "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
-    "revdelete-legend": "Set visibility restrictions",
-    "revdelete-hide-text": "Revision text",
-    "revdelete-hide-image": "Hide file content",
-    "revdelete-hide-name": "Hide action and target",
-    "revdelete-hide-comment": "Edit summary",
-    "revdelete-hide-user": "Editor's username/IP address",
-    "revdelete-hide-restricted": "Suppress data from administrators as well as others",
-    "revdelete-radio-same": "(do not change)",
-    "revdelete-radio-set": "Hidden",
-    "revdelete-radio-unset": "Visible",
-    "revdelete-suppress": "Suppress data from administrators as well as others",
-    "revdelete-unsuppress": "Remove restrictions on restored revisions",
-    "revdelete-log": "Reason:",
-    "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
-    "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
-    "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
-    "logdelete-success": "<strong>Log visibility successfully set.</strong>",
-    "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
-    "revdel-restore": "change visibility",
-    "pagehist": "Page history",
-    "deletedhist": "Deleted history",
-    "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
-    "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
-    "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
-    "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease check the logs.",
-    "revdelete-only-restricted": "Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.",
-    "revdelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
-    "revdelete-otherreason": "Other/additional reason:",
-    "revdelete-reasonotherlist": "Other reason",
-    "revdelete-edit-reasonlist": "Edit delete reasons",
-    "revdelete-offender": "Revision author:",
-    "suppressionlog": "Suppression log",
-    "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "mergehistory": "Merge page histories",
-    "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
-    "mergehistory-box": "Merge revisions of two pages:",
-    "mergehistory-from": "Source page:",
-    "mergehistory-into": "Destination page:",
-    "mergehistory-list": "Mergeable edit history",
-    "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
-    "mergehistory-go": "Show mergeable edits",
-    "mergehistory-submit": "Merge revisions",
-    "mergehistory-empty": "No revisions can be merged.",
-    "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
-    "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
-    "mergehistory-no-source": "Source page $1 does not exist.",
-    "mergehistory-no-destination": "Destination page $1 does not exist.",
-    "mergehistory-invalid-source": "Source page must be a valid title.",
-    "mergehistory-invalid-destination": "Destination page must be a valid title.",
-    "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
-    "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
-    "mergehistory-same-destination": "Source and destination pages cannot be the same",
-    "mergehistory-reason": "Reason:",
-    "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-    "mergelog": "Merge log",
-    "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
-    "revertmerge": "Unmerge",
-    "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
-    "history-title": "Revision history of \"$1\"",
-    "difference-title": "Difference between revisions of \"$1\"",
-    "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
-    "difference-multipage": "(Difference between pages)",
-    "lineno": "Line $1:",
-    "compareselectedversions": "Compare selected revisions",
-    "showhideselectedversions": "Change visibility of selected revisions",
-    "editundo": "undo",
-    "diff-empty": "(No difference)",
-    "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
-    "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
-    "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
-    "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "search-summary": "",
-    "searchresults": "Search results",
-    "searchresults-title": "Search results for \"$1\"",
-    "toomanymatches": "Too many matches were returned, please try a different query",
-    "titlematches": "Page title matches",
-    "textmatches": "Page text matches",
-    "notextmatches": "No page text matches",
-    "prevn": "previous {{PLURAL:$1|$1}}",
-    "nextn": "next {{PLURAL:$1|$1}}",
-    "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
-    "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
-    "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
-    "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
-    "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
-    "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
-    "searchmenu-new-nocreate": "",
-    "searchprofile-articles": "Content pages",
-    "searchprofile-project": "Help and Project pages",
-    "searchprofile-images": "Multimedia",
-    "searchprofile-everything": "Everything",
-    "searchprofile-advanced": "Advanced",
-    "searchprofile-articles-tooltip": "Search in $1",
-    "searchprofile-project-tooltip": "Search in $1",
-    "searchprofile-images-tooltip": "Search for files",
-    "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
-    "searchprofile-advanced-tooltip": "Search in custom namespaces",
-    "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
-    "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
-    "search-result-score": "Relevance: $1%",
-    "search-redirect": "(redirect $1)",
-    "search-section": "(section $1)",
-    "search-file-match": "(matches file content)",
-    "search-suggest": "Did you mean: $1",
-    "search-interwiki-caption": "Sister projects",
-    "search-interwiki-default": "Results from $1:",
-    "search-interwiki-custom": "",
-    "search-interwiki-more": "(more)",
-    "search-relatedarticle": "Related",
-    "searcheverything-enable": "Search in all namespaces",
-    "searchrelated": "related",
-    "searchall": "all",
-    "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
-    "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
-    "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
-    "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
-    "search-nonefound": "There were no results matching the query.",
-    "powersearch-legend": "Advanced search",
-    "powersearch-ns": "Search in namespaces:",
-    "powersearch-togglelabel": "Check:",
-    "powersearch-toggleall": "All",
-    "powersearch-togglenone": "None",
-    "search-external": "External search",
-    "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
-    "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
-    "search-error": "An error has occurred while searching: $1",
-    "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
-    "preferences": "Preferences",
-    "preferences-summary": "",
-    "mypreferences": "Preferences",
-    "prefs-edits": "Number of edits:",
-    "prefsnologintext2": "Please $1 to change your preferences.",
-    "prefs-skin": "Skin",
-    "skin-preview": "Preview",
-    "datedefault": "No preference",
-    "prefs-labs": "Labs features",
-    "prefs-user-pages": "User pages",
-    "prefs-personal": "User profile",
-    "prefs-rc": "Recent changes",
-    "prefs-watchlist": "Watchlist",
-    "prefs-watchlist-days": "Days to show in watchlist:",
-    "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
-    "prefs-watchlist-edits-max": "Maximum number: 1000",
-    "prefs-watchlist-token": "Watchlist token:",
-    "prefs-misc": "Misc",
-    "prefs-resetpass": "Change password",
-    "prefs-changeemail": "Change email address",
-    "prefs-setemail": "Set an email address",
-    "prefs-email": "Email options",
-    "prefs-rendering": "Appearance",
-    "saveprefs": "Save",
-    "restoreprefs": "Restore all default settings (in all sections)",
-    "prefs-editing": "Editing",
-    "rows": "Rows:",
-    "columns": "Columns:",
-    "searchresultshead": "Search",
-    "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
-    "stub-threshold-disabled": "Disabled",
-    "recentchangesdays": "Days to show in recent changes:",
-    "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "recentchangescount": "Number of edits to show by default:",
-    "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
-    "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
-    "savedprefs": "Your preferences have been saved.",
-    "timezonelegend": "Time zone:",
-    "localtime": "Local time:",
-    "timezoneuseserverdefault": "Use wiki default ($1)",
-    "timezoneuseoffset": "Other (specify offset)",
-    "servertime": "Server time:",
-    "guesstimezone": "Fill in from browser",
-    "timezoneregion-africa": "Africa",
-    "timezoneregion-america": "America",
-    "timezoneregion-antarctica": "Antarctica",
-    "timezoneregion-arctic": "Arctic",
-    "timezoneregion-asia": "Asia",
-    "timezoneregion-atlantic": "Atlantic Ocean",
-    "timezoneregion-australia": "Australia",
-    "timezoneregion-europe": "Europe",
-    "timezoneregion-indian": "Indian Ocean",
-    "timezoneregion-pacific": "Pacific Ocean",
-    "allowemail": "Enable email from other users",
-    "prefs-searchoptions": "Search",
-    "prefs-namespaces": "Namespaces",
-    "defaultns": "Otherwise search in these namespaces:",
-    "default": "default",
-    "prefs-files": "Files",
-    "prefs-custom-css": "Custom CSS",
-    "prefs-custom-js": "Custom JavaScript",
-    "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
-    "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
-    "prefs-emailconfirm-label": "Email confirmation:",
-    "youremail": "Email:",
-    "username": "{{GENDER:$1|Username}}:",
-    "uid": "{{GENDER:$1|User}} ID:",
-    "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
-    "prefs-memberingroups-type": "$1",
-    "prefs-registration": "Registration time:",
-    "prefs-registration-date-time": "$1",
-    "yourrealname": "Real name:",
-    "yourlanguage": "Language:",
-    "yourvariant": "Content language variant:",
-    "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
-    "yournick": "New signature:",
-    "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
-    "badsig": "Invalid raw signature.\nCheck HTML tags.",
-    "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
-    "yourgender": "How do you prefer to be described?",
-    "gender-unknown": "I prefer not to say",
-    "gender-male": "He edits wiki pages",
-    "gender-female": "She edits wiki pages",
-    "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
-    "email": "Email",
-    "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
-    "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
-    "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
-    "prefs-help-email-required": "Email address is required.",
-    "prefs-info": "Basic information",
-    "prefs-i18n": "Internationalisation",
-    "prefs-signature": "Signature",
-    "prefs-dateformat": "Date format",
-    "prefs-timeoffset": "Time offset",
-    "prefs-advancedediting": "General options",
-    "prefs-editor": "Editor",
-    "prefs-preview": "Preview",
-    "prefs-advancedrc": "Advanced options",
-    "prefs-advancedrendering": "Advanced options",
-    "prefs-advancedsearchoptions": "Advanced options",
-    "prefs-advancedwatchlist": "Advanced options",
-    "prefs-displayrc": "Display options",
-    "prefs-displaywatchlist": "Display options",
-    "prefs-tokenwatchlist": "Token",
-    "prefs-diffs": "Diffs",
-    "prefs-help-prefershttps": "This preference will take effect on your next login.",
-    "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
-    "email-address-validity-valid": "Email address appears valid",
-    "email-address-validity-invalid": "Enter a valid email address",
-    "userrights": "User rights management",
-    "userrights-summary": "",
-    "userrights-lookup-user": "Manage user groups",
-    "userrights-user-editname": "Enter a username:",
-    "editusergroup": "Edit user groups",
-    "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
-    "userrights-editusergroup": "Edit user groups",
-    "saveusergroups": "Save user groups",
-    "userrights-groupsmember": "Member of:",
-    "userrights-groupsmember-auto": "Implicit member of:",
-    "userrights-groupsmember-type": "$1",
-    "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
-    "userrights-reason": "Reason:",
-    "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
-    "userrights-nodatabase": "Database $1 does not exist or is not local.",
-    "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
-    "userrights-notallowed": "You do not have permission to add or remove user rights.",
-    "userrights-changeable-col": "Groups you can change",
-    "userrights-unchangeable-col": "Groups you cannot change",
-    "userrights-irreversible-marker": "$1*",
-    "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-    "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
-    "group": "Group:",
-    "group-user": "Users",
-    "group-autoconfirmed": "Autoconfirmed users",
-    "group-bot": "Bots",
-    "group-sysop": "Administrators",
-    "group-bureaucrat": "Bureaucrats",
-    "group-suppress": "Oversights",
-    "group-all": "(all)",
-    "group-user-member": "{{GENDER:$1|user}}",
-    "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
-    "group-bot-member": "{{GENDER:$1|bot}}",
-    "group-sysop-member": "{{GENDER:$1|administrator}}",
-    "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
-    "group-suppress-member": "{{GENDER:$1|oversight}}",
-    "grouppage-user": "{{ns:project}}:Users",
-    "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
-    "grouppage-bot": "{{ns:project}}:Bots",
-    "grouppage-sysop": "{{ns:project}}:Administrators",
-    "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
-    "grouppage-suppress": "{{ns:project}}:Oversight",
-    "right-read": "Read pages",
-    "right-edit": "Edit pages",
-    "right-createpage": "Create pages (which are not discussion pages)",
-    "right-createtalk": "Create discussion pages",
-    "right-createaccount": "Create new user accounts",
-    "right-minoredit": "Mark edits as minor",
-    "right-move": "Move pages",
-    "right-move-subpages": "Move pages with their subpages",
-    "right-move-rootuserpages": "Move root user pages",
-    "right-movefile": "Move files",
-    "right-suppressredirect": "Not create redirects from source pages when moving pages",
-    "right-upload": "Upload files",
-    "right-reupload": "Overwrite existing files",
-    "right-reupload-own": "Overwrite existing files uploaded by oneself",
-    "right-reupload-shared": "Override files on the shared media repository locally",
-    "right-upload_by_url": "Upload files from a URL",
-    "right-purge": "Purge the site cache for a page without confirmation",
-    "right-autoconfirmed": "Not be affected by IP-based rate limits",
-    "right-bot": "Be treated as an automated process",
-    "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
-    "right-apihighlimits": "Use higher limits in API queries",
-    "right-writeapi": "Use of the write API",
-    "right-delete": "Delete pages",
-    "right-bigdelete": "Delete pages with large histories",
-    "right-deletelogentry": "Delete and undelete specific log entries",
-    "right-deleterevision": "Delete and undelete specific revisions of pages",
-    "right-deletedhistory": "View deleted history entries, without their associated text",
-    "right-deletedtext": "View deleted text and changes between deleted revisions",
-    "right-browsearchive": "Search deleted pages",
-    "right-undelete": "Undelete a page",
-    "right-suppressrevision": "Review and restore revisions hidden from administrators",
-    "right-suppressionlog": "View private logs",
-    "right-block": "Block other users from editing",
-    "right-blockemail": "Block a user from sending email",
-    "right-hideuser": "Block a username, hiding it from the public",
-    "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
-    "right-proxyunbannable": "Bypass automatic blocks of proxies",
-    "right-unblockself": "Unblock oneself",
-    "right-protect": "Change protection levels and edit cascade-protected pages",
-    "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
-    "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
-    "right-editinterface": "Edit the user interface",
-    "right-editusercssjs": "Edit other users' CSS and JavaScript files",
-    "right-editusercss": "Edit other users' CSS files",
-    "right-edituserjs": "Edit other users' JavaScript files",
-    "right-editmyusercss": "Edit your own user CSS files",
-    "right-editmyuserjs": "Edit your own user JavaScript files",
-    "right-viewmywatchlist": "View your own watchlist",
-    "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
-    "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
-    "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
-    "right-editmyoptions": "Edit your own preferences",
-    "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
-    "right-markbotedits": "Mark rolled-back edits as bot edits",
-    "right-noratelimit": "Not be affected by rate limits",
-    "right-import": "Import pages from other wikis",
-    "right-importupload": "Import pages from a file upload",
-    "right-patrol": "Mark others' edits as patrolled",
-    "right-autopatrol": "Have one's own edits automatically marked as patrolled",
-    "right-patrolmarks": "View recent changes patrol marks",
-    "right-unwatchedpages": "View a list of unwatched pages",
-    "right-mergehistory": "Merge the history of pages",
-    "right-userrights": "Edit all user rights",
-    "right-userrights-interwiki": "Edit user rights of users on other wikis",
-    "right-siteadmin": "Lock and unlock the database",
-    "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
-    "right-sendemail": "Send email to other users",
-    "right-passwordreset": "View password reset emails",
-    "newuserlogpage": "User creation log",
-    "newuserlogpagetext": "This is a log of user creations.",
-    "rightslog": "User rights log",
-    "rightslogtext": "This is a log of changes to user rights.",
-    "action-read": "read this page",
-    "action-edit": "edit this page",
-    "action-createpage": "create pages",
-    "action-createtalk": "create discussion pages",
-    "action-createaccount": "create this user account",
-    "action-history": "view the history of this page",
-    "action-minoredit": "mark this edit as minor",
-    "action-move": "move this page",
-    "action-move-subpages": "move this page, and its subpages",
-    "action-move-rootuserpages": "move root user pages",
-    "action-movefile": "move this file",
-    "action-upload": "upload this file",
-    "action-reupload": "overwrite this existing file",
-    "action-reupload-shared": "override this file on a shared repository",
-    "action-upload_by_url": "upload this file from a URL",
-    "action-writeapi": "use the write API",
-    "action-delete": "delete this page",
-    "action-deleterevision": "delete this revision",
-    "action-deletedhistory": "view this page's deleted history",
-    "action-browsearchive": "search deleted pages",
-    "action-undelete": "undelete this page",
-    "action-suppressrevision": "review and restore this hidden revision",
-    "action-suppressionlog": "view this private log",
-    "action-block": "block this user from editing",
-    "action-protect": "change protection levels for this page",
-    "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
-    "action-import": "import pages from another wiki",
-    "action-importupload": "import pages from a file upload",
-    "action-patrol": "mark others' edits as patrolled",
-    "action-autopatrol": "have your edit marked as patrolled",
-    "action-unwatchedpages": "view the list of unwatched pages",
-    "action-mergehistory": "merge the history of this page",
-    "action-userrights": "edit all user rights",
-    "action-userrights-interwiki": "edit user rights of users on other wikis",
-    "action-siteadmin": "lock or unlock the database",
-    "action-sendemail": "send emails",
-    "action-editmywatchlist": "edit your watchlist",
-    "action-viewmywatchlist": "view your watchlist",
-    "action-viewmyprivateinfo": "view your private information",
-    "action-editmyprivateinfo": "edit your private information",
-    "nchanges": "$1 {{PLURAL:$1|change|changes}}",
-    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
-    "enhancedrc-history": "history",
-    "recentchanges": "Recent changes",
-    "recentchanges-url": "Special:RecentChanges",
-    "recentchanges-legend": "Recent changes options",
-    "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
-    "recentchangestext": "-",
-    "recentchanges-noresult": "No changes during the given period matching these criteria.",
-    "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
-    "recentchanges-label-newpage": "This edit created a new page",
-    "recentchanges-label-minor": "This is a minor edit",
-    "recentchanges-label-bot": "This edit was performed by a bot",
-    "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
-    "recentchanges-label-plusminus": "The page size changed by this number of bytes",
-    "recentchanges-legend-heading": "'''Legend:'''",
-    "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
-    "recentchanges-legend-plusminus": "(<em>±123</em>)",
-    "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
-    "rclistfrom": "Show new changes starting from $2, $3",
-    "rcshowhideminor": "$1 minor edits",
-    "rcshowhideminor-show": "Show",
-    "rcshowhideminor-hide": "Hide",
-    "rcshowhidebots": "$1 bots",
-    "rcshowhidebots-show": "Show",
-    "rcshowhidebots-hide": "Hide",
-    "rcshowhideliu": "$1 registered users",
-    "rcshowhideliu-show": "Show",
-    "rcshowhideliu-hide": "Hide",
-    "rcshowhideanons": "$1 anonymous users",
-    "rcshowhideanons-show": "Show",
-    "rcshowhideanons-hide": "Hide",
-    "rcshowhidepatr": "$1 patrolled edits",
-    "rcshowhidepatr-show": "Show",
-    "rcshowhidepatr-hide": "Hide",
-    "rcshowhidemine": "$1 my edits",
-    "rcshowhidemine-show": "Show",
-    "rcshowhidemine-hide": "Hide",
-    "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",
-    "unpatrolledletter": "!",
-    "number_of_watching_users_RCview": "[$1]",
-    "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
-    "rc_categories": "Limit to categories (separate with \"|\")",
-    "rc_categories_any": "Any",
-    "rc-change-size": "$1",
-    "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
-    "newsectionsummary": "/* $1 */ new section",
-    "rc-enhanced-expand": "Show details",
-    "rc-enhanced-hide": "Hide details",
-    "rc-old-title": "originally created as \"$1\"",
-    "recentchangeslinked": "Related changes",
-    "recentchangeslinked-feed": "Related changes",
-    "recentchangeslinked-toolbox": "Related changes",
-    "recentchangeslinked-title": "Changes related to \"$1\"",
-    "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
-    "recentchangeslinked-page": "Page name:",
-    "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
-    "upload": "Upload file",
-    "uploadbtn": "Upload file",
-    "reuploaddesc": "Cancel upload and return to the upload form",
-    "upload-tryagain": "Submit modified file description",
-    "uploadnologin": "Not logged in",
-    "uploadnologintext": "Please $1 to upload files.",
-    "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
-    "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
-    "uploaderror": "Upload error",
-    "upload-summary": "",
-    "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
-    "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
-    "upload-permitted": "Permitted file types: $1.",
-    "upload-preferred": "Preferred file types: $1.",
-    "upload-prohibited": "Prohibited file types: $1.",
-    "uploadfooter": "-",
-    "upload-default-description": "-",
-    "uploadlogpage": "Upload log",
-    "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
-    "filename": "Filename",
-    "filedesc": "Summary",
-    "fileuploadsummary": "Summary:",
-    "filereuploadsummary": "File changes:",
-    "filestatus": "Copyright status:",
-    "filesource": "Source:",
-    "ignorewarning": "Ignore warning and save file anyway",
-    "ignorewarnings": "Ignore any warnings",
-    "minlength1": "Filenames must be at least one letter.",
-    "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
-    "filename-toolong": "Filenames may not be longer than 240 bytes.",
-    "badfilename": "Filename has been changed to \"$1\".",
-    "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
-    "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
-    "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
-    "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-missing": "The file has no extension (like \".jpg\").",
-    "empty-file": "The file you submitted was empty.",
-    "file-too-large": "The file you submitted was too large.",
-    "filename-tooshort": "The filename is too short.",
-    "filetype-banned": "This type of file is banned.",
-    "verification-error": "This file did not pass file verification.",
-    "hookaborted": "The modification you tried to make was aborted by an extension.",
-    "illegal-filename": "The filename is not allowed.",
-    "overwrite": "Overwriting an existing file is not allowed.",
-    "unknown-error": "An unknown error occurred.",
-    "tmp-create-error": "Could not create temporary file.",
-    "tmp-write-error": "Error writing temporary file.",
-    "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
-    "largefileserver": "This file is bigger than the server is configured to allow.",
-    "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
-    "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
-    "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
-    "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
-    "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
-    "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
-    "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
-    "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
-    "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
-    "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
-    "uploadwarning": "Upload warning",
-    "uploadwarning-text": "Please modify the file description below and try again.",
-    "savefile": "Save file",
-    "uploadedimage": "uploaded \"[[$1]]\"",
-    "overwroteimage": "uploaded a new version of \"[[$1]]\"",
-    "uploaddisabled": "Uploads disabled.",
-    "copyuploaddisabled": "Upload by URL disabled.",
-    "uploaddisabledtext": "File uploads are disabled.",
-    "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
-    "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
-    "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
-    "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
-    "uploadvirus": "The file contains a virus!\nDetails: $1",
-    "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
-    "upload-source": "Source file",
-    "sourcefilename": "Source filename:",
-    "sourceurl": "Source URL:",
-    "destfilename": "Destination filename:",
-    "upload-maxfilesize": "Maximum file size: $1",
-    "upload-description": "File description",
-    "upload-options": "Upload options",
-    "watchthisupload": "Watch this file",
-    "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
-    "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
-    "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
-    "upload-success-subj": "Successful upload",
-    "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
-    "upload-failure-subj": "Upload problem",
-    "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
-    "upload-warning-subj": "Upload warning",
-    "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
-    "upload-proto-error": "Incorrect protocol",
-    "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
-    "upload-file-error": "Internal error",
-    "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-misc-error": "Unknown upload error",
-    "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-too-many-redirects": "The URL contained too many redirects",
-    "upload-http-error": "An HTTP error occurred: $1",
-    "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
-    "backend-fail-stream": "Could not stream file \"$1\".",
-    "backend-fail-backup": "Could not backup file \"$1\".",
-    "backend-fail-notexists": "The file $1 does not exist.",
-    "backend-fail-hashes": "Could not get file hashes for comparison.",
-    "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
-    "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
-    "backend-fail-delete": "Could not delete file \"$1\".",
-    "backend-fail-describe": "Could not change metadata for file \"$1\".",
-    "backend-fail-alreadyexists": "The file \"$1\" already exists.",
-    "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
-    "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
-    "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
-    "backend-fail-opentemp": "Could not open temporary file.",
-    "backend-fail-writetemp": "Could not write to temporary file.",
-    "backend-fail-closetemp": "Could not close temporary file.",
-    "backend-fail-read": "Could not read file \"$1\".",
-    "backend-fail-create": "Could not write file \"$1\".",
-    "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
-    "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
-    "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
-    "backend-fail-connect": "Could not connect to storage backend \"$1\".",
-    "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
-    "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
-    "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
-    "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
-    "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
-    "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
-    "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
-    "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
-    "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
-    "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
-    "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
-    "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
-    "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
-    "lockmanager-fail-db-release": "Could not release locks on database $1.",
-    "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
-    "lockmanager-fail-svr-release": "Could not release locks on server $1.",
-    "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
-    "zip-wrong-format": "The specified file was not a ZIP file.",
-    "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
-    "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
-    "uploadstash": "Upload stash",
-    "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
-    "uploadstash-clear": "Clear stashed files",
-    "uploadstash-nofiles": "You have no stashed files.",
-    "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
-    "uploadstash-errclear": "Clearing the files was unsuccessful.",
-    "uploadstash-refresh": "Refresh the list of files",
-    "invalid-chunk-offset": "Invalid chunk offset",
-    "img-auth-accessdenied": "Access denied",
-    "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
-    "img-auth-notindir": "Requested path is not in the configured upload directory.",
-    "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
-    "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
-    "img-auth-nofile": "File \"$1\" does not exist.",
-    "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
-    "img-auth-streaming": "Streaming \"$1\".",
-    "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
-    "img-auth-noread": "User does not have access to read \"$1\".",
-    "http-invalid-url": "Invalid URL: $1",
-    "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
-    "http-request-error": "HTTP request failed due to unknown error.",
-    "http-read-error": "HTTP read error.",
-    "http-timed-out": "HTTP request timed out.",
-    "http-curl-error": "Error fetching URL: $1",
-    "http-bad-status": "There was a problem during the HTTP request: $1 $2",
-    "upload-curl-error6": "Could not reach URL",
-    "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
-    "upload-curl-error28": "Upload timeout",
-    "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
-    "license": "Licensing:",
-    "license-header": "Licensing",
-    "nolicense": "None selected",
-    "licenses": "-",
-    "license-nopreview": "(Preview not available)",
-    "upload_source_url": "(a valid, publicly accessible URL)",
-    "upload_source_file": "(a file on your computer)",
-    "listfiles-summary": "This special page shows all uploaded files.",
-    "listfiles_search_for": "Search for media name:",
-    "imgfile": "file",
-    "listfiles": "File list",
-    "listfiles_thumb": "Thumbnail",
-    "listfiles_date": "Date",
-    "listfiles_name": "Name",
-    "listfiles_user": "User",
-    "listfiles_size": "Size",
-    "listfiles_description": "Description",
-    "listfiles_count": "Versions",
-    "listfiles-show-all": "Include old versions of images",
-    "listfiles-latestversion": "Current version",
-    "listfiles-latestversion-yes": "Yes",
-    "listfiles-latestversion-no": "No",
-    "file-anchor-link": "File",
-    "filehist": "File history",
-    "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
-    "filehist-deleteall": "delete all",
-    "filehist-deleteone": "delete",
-    "filehist-revert": "revert",
-    "filehist-current": "current",
-    "filehist-datetime": "Date/Time",
-    "filehist-thumb": "Thumbnail",
-    "filehist-thumbtext": "Thumbnail for version as of $1",
-    "filehist-nothumb": "No thumbnail",
-    "filehist-user": "User",
-    "filehist-dimensions": "Dimensions",
-    "filehist-filesize": "File size",
-    "filehist-comment": "Comment",
-    "imagelinks": "File usage",
-    "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
-    "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
-    "nolinkstoimage": "There are no pages that link to this file.",
-    "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
-    "linkstoimage-redirect": "$1 (file redirect) $2",
-    "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
-    "sharedupload": "This file is from $1 and may be used by other projects.",
-    "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
-    "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
-    "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "shareddescriptionfollows": "-",
-    "filepage-nofile": "No file by this name exists.",
-    "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
-    "uploadnewversion-linktext": "Upload a new version of this file",
-    "shared-repo-from": "from $1",
-    "shared-repo": "a shared repository",
-    "shared-repo-name-wikimediacommons": "Wikimedia Commons",
-    "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
-    "upload-disallowed-here": "You cannot overwrite this file.",
-    "filerevert": "Revert $1",
-    "filerevert-legend": "Revert file",
-    "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
-    "filerevert-comment": "Reason:",
-    "filerevert-defaultcomment": "Reverted to version as of $2, $1",
-    "filerevert-submit": "Revert",
-    "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
-    "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
-    "filedelete": "Delete $1",
-    "filedelete-legend": "Delete file",
-    "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
-    "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
-    "filedelete-comment": "Reason:",
-    "filedelete-submit": "Delete",
-    "filedelete-success": "<strong>$1</strong> has been deleted.",
-    "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
-    "filedelete-nofile": "<strong>$1</strong> does not exist.",
-    "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
-    "filedelete-otherreason": "Other/additional reason:",
-    "filedelete-reason-otherlist": "Other reason",
-    "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
-    "filedelete-edit-reasonlist": "Edit delete reasons",
-    "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
-    "filedelete-maintenance-title": "Cannot delete file",
-    "mimesearch": "MIME search",
-    "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
-    "mimetype": "MIME type:",
-    "download": "download",
-    "unwatchedpages": "Unwatched pages",
-    "unwatchedpages-summary": "",
-    "listredirects": "List of redirects",
-    "listredirects-summary": "",
-    "listduplicatedfiles": "List of files with duplicates",
-    "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
-    "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
-    "unusedtemplates": "Unused templates",
-    "unusedtemplates-summary": "",
-    "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
-    "unusedtemplateswlh": "other links",
-    "randompage": "Random page",
-    "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
-    "randompage-url": "Special:Random",
-    "randomincategory": "Random page in category",
-    "randomincategory-invalidcategory": "\"$1\" is not a valid category name.",
-    "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
-    "randomincategory-selectcategory": "Get random page from category: $1 $2.",
-    "randomincategory-selectcategory-submit": "Go",
-    "randomredirect": "Random redirect",
-    "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
-    "statistics": "Statistics",
-    "statistics-summary": "",
-    "statistics-header-pages": "Page statistics",
-    "statistics-header-edits": "Edit statistics",
-    "statistics-header-views": "View statistics",
-    "statistics-header-users": "User statistics",
-    "statistics-header-hooks": "Other statistics",
-    "statistics-articles": "Content pages",
-    "statistics-pages": "Pages",
-    "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
-    "statistics-files": "Uploaded files",
-    "statistics-edits": "Page edits since {{SITENAME}} was set up",
-    "statistics-edits-average": "Average edits per page",
-    "statistics-views-total": "Views total",
-    "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
-    "statistics-views-peredit": "Views per edit",
-    "statistics-users": "Registered [[Special:ListUsers|users]]",
-    "statistics-users-active": "Active users",
-    "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
-    "statistics-mostpopular": "Most viewed pages",
-    "statistics-footer": "",
-    "pageswithprop": "Pages with a page property",
-    "pageswithprop-summary": "",
-    "pageswithprop-legend": "Pages with a page property",
-    "pageswithprop-text": "This page lists pages that use a particular page property.",
-    "pageswithprop-prop": "Property name:",
-    "pageswithprop-submit": "Go",
-    "pageswithprop-prophidden-long": "long text property value hidden ($1)",
-    "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
-    "doubleredirects": "Double redirects",
-    "doubleredirects-summary": "",
-    "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
-    "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
-    "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
-    "double-redirect-fixer": "Redirect fixer",
-    "brokenredirects": "Broken redirects",
-    "brokenredirects-summary": "",
-    "brokenredirectstext": "The following redirects link to non-existent pages:",
-    "brokenredirects-edit": "edit",
-    "brokenredirects-delete": "delete",
-    "withoutinterwiki": "Pages without language links",
-    "withoutinterwiki-summary": "The following pages do not link to other language versions.",
-    "withoutinterwiki-legend": "Prefix",
-    "withoutinterwiki-submit": "Show",
-    "fewestrevisions": "Pages with the fewest revisions",
-    "fewestrevisions-summary": "",
-    "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-    "ncategories": "$1 {{PLURAL:$1|category|categories}}",
-    "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
-    "nlinks": "$1 {{PLURAL:$1|link|links}}",
-    "nmembers": "$1 {{PLURAL:$1|member|members}}",
-    "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
-    "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
-    "nviews": "$1 {{PLURAL:$1|view|views}}",
-    "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
-    "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
-    "specialpage-empty": "There are no results for this report.",
-    "lonelypages": "Orphaned pages",
-    "lonelypages-summary": "",
-    "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
-    "uncategorizedpages": "Uncategorized pages",
-    "uncategorizedpages-summary": "",
-    "uncategorizedcategories": "Uncategorized categories",
-    "uncategorizedcategories-summary": "",
-    "uncategorizedimages": "Uncategorized files",
-    "uncategorizedimages-summary": "",
-    "uncategorizedtemplates": "Uncategorized templates",
-    "uncategorizedtemplates-summary": "",
-    "unusedcategories": "Unused categories",
-    "unusedcategories-summary": "",
-    "unusedimages": "Unused files",
-    "unusedimages-summary": "",
-    "popularpages": "Popular pages",
-    "popularpages-summary": "",
-    "wantedcategories": "Wanted categories",
-    "wantedcategories-summary": "",
-    "wantedpages": "Wanted pages",
-    "wantedpages-summary": "",
-    "wantedpages-badtitle": "Invalid title in result set: $1",
-    "wantedfiles": "Wanted files",
-    "wantedfiles-summary": "",
-    "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
-    "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
-    "wantedtemplates": "Wanted templates",
-    "wantedtemplates-summary": "",
-    "mostlinked": "Most linked-to pages",
-    "mostlinked-summary": "",
-    "mostlinkedcategories": "Most linked-to categories",
-    "mostlinkedcategories-summary": "",
-    "mostlinkedtemplates": "Most linked-to templates",
-    "mostlinkedtemplates-summary": "",
-    "mostcategories": "Pages with the most categories",
-    "mostcategories-summary": "",
-    "mostimages": "Most linked-to files",
-    "mostimages-summary": "",
-    "mostinterwikis": "Pages with the most interwikis",
-    "mostinterwikis-summary": "",
-    "mostrevisions": "Pages with the most revisions",
-    "mostrevisions-summary": "",
-    "prefixindex": "All pages with prefix",
-    "prefixindex-namespace": "All pages with prefix ($1 namespace)",
-    "prefixindex-summary": "",
-    "prefixindex-strip": "Strip prefix in list",
-    "shortpages": "Short pages",
-    "shortpages-summary": "",
-    "longpages": "Long pages",
-    "longpages-summary": "",
-    "deadendpages": "Dead-end pages",
-    "deadendpages-summary": "",
-    "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
-    "protectedpages": "Protected pages",
-    "protectedpages-indef": "Indefinite protections only",
-    "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
-    "protectedpages-cascade": "Cascading protections only",
-    "protectedpages-noredirect": "Hide redirects",
-    "protectedpagesempty": "No pages are currently protected with these parameters.",
-    "protectedpages-timestamp": "Timestamp",
-    "protectedpages-page": "Page",
-    "protectedpages-expiry": "Expires",
-    "protectedpages-performer": "Protecting user",
-    "protectedpages-params": "Protection parameters",
-    "protectedpages-reason": "Reason",
-    "protectedpages-unknown-timestamp": "Unknown",
-    "protectedpages-unknown-performer": "Unknown user",
-    "protectedpages-unknown-reason": "—",
-    "protectedtitles": "Protected titles",
-    "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
-    "protectedtitlesempty": "No titles are currently protected with these parameters.",
-    "listusers": "User list",
-    "listusers-summary": "",
-    "listusers-editsonly": "Show only users with edits",
-    "listusers-creationsort": "Sort by creation date",
-    "listusers-desc": "Sort in descending order",
-    "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
-    "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
-    "newpages": "New pages",
-    "newpages-summary": "",
-    "newpages-username": "Username:",
-    "ancientpages": "Oldest pages",
-    "ancientpages-summary": "",
-    "move": "Move",
-    "movethispage": "Move this page",
-    "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
-    "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
-    "notargettitle": "No target",
-    "notargettext": "You have not specified a target page or user to perform this function on.",
-    "nopagetitle": "No such target page",
-    "nopagetext": "The target page you have specified does not exist.",
-    "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
-    "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
-    "suppress": "Oversight",
-    "querypage-disabled": "This special page is disabled for performance reasons.",
-    "booksources": "Book sources",
-    "booksources-summary": "",
-    "booksources-search-legend": "Search for book sources",
-    "booksources-isbn": "ISBN:",
-    "booksources-go": "Go",
-    "booksources-text": "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:",
-    "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
-    "rfcurl": "//tools.ietf.org/html/rfc$1",
-    "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
-    "specialloguserlabel": "Performer:",
-    "speciallogtitlelabel": "Target (title or user):",
-    "log": "Logs",
-    "all-logs-page": "All public logs",
-    "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
-    "logempty": "No matching items in log.",
-    "log-title-wildcard": "Search titles starting with this text",
-    "showhideselectedlogentries": "Change visibility of selected log entries",
-    "allpages": "All pages",
-    "allpages-summary": "",
-    "alphaindexline": "$1 to $2",
-    "nextpage": "Next page ($1)",
-    "prevpage": "Previous page ($1)",
-    "allpagesfrom": "Display pages starting at:",
-    "allpagesto": "Display pages ending at:",
-    "allarticles": "All pages",
-    "allinnamespace": "All pages ($1 namespace)",
-    "allpagessubmit": "Go",
-    "allpagesprefix": "Display pages with prefix:",
-    "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
-    "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
-    "allpages-hide-redirects": "Hide redirects",
-    "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
-    "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
-    "cachedspecial-refresh-now": "View latest.",
-    "categories": "Categories",
-    "categories-summary": "",
-    "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
-    "categoriesfrom": "Display categories starting at:",
-    "special-categories-sort-count": "sort by count",
-    "special-categories-sort-abc": "sort alphabetically",
-    "deletedcontributions": "Deleted user contributions",
-    "deletedcontributions-summary": "",
-    "deletedcontributions-title": "Deleted user contributions",
-    "sp-deletedcontributions-contribs": "contributions",
-    "linksearch": "External links search",
-    "linksearch-summary": "",
-    "linksearch-pat": "Search pattern:",
-    "linksearch-ns": "Namespace:",
-    "linksearch-ok": "Search",
-    "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
-    "linksearch-line": "$1 is linked from $2",
-    "linksearch-error": "Wildcards may appear only at the start of the hostname.",
-    "listusersfrom": "Display users starting at:",
-    "listusers-submit": "Show",
-    "listusers-noresult": "No user found.",
-    "listusers-blocked": "(blocked)",
-    "activeusers": "Active users list",
-    "activeusers-summary": "",
-    "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
-    "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
-    "activeusers-from": "Display users starting at:",
-    "activeusers-hidebots": "Hide bots",
-    "activeusers-hidesysops": "Hide administrators",
-    "activeusers-noresult": "No users found.",
-    "listgrouprights": "User group rights",
-    "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
-    "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
-    "listgrouprights-group": "Group",
-    "listgrouprights-rights": "Rights",
-    "listgrouprights-helppage": "Help:Group rights",
-    "listgrouprights-members": "(list of members)",
-    "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
-    "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-    "listgrouprights-addgroup": "Add {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-addgroup-all": "Add all groups",
-    "listgrouprights-removegroup-all": "Remove all groups",
-    "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
-    "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
-    "listgrouprights-addgroup-self-all": "Add all groups to own account",
-    "listgrouprights-removegroup-self-all": "Remove all groups from own account",
-    "listgrouprights-namespaceprotection-header": "Namespace restrictions",
-    "listgrouprights-namespaceprotection-namespace": "Namespace",
-    "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
-    "trackingcategories": "Tracking categories",
-    "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
-    "trackingcategories-msg": "Tracking category",
-    "trackingcategories-name": "Message name",
-    "trackingcategories-desc": "Category inclusion criteria",
-    "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
-    "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
-    "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
-    "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
-    "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
-    "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
-    "trackingcategories-nodesc": "No description available.",
-    "trackingcategories-disabled": "Category is disabled",
-    "mailnologin": "No send address",
-    "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
-    "emailuser": "Email this user",
-    "emailuser-title-target": "Email this {{GENDER:$1|user}}",
-    "emailuser-title-notarget": "Email user",
-    "emailuser-summary": "",
-    "emailpage": "Email user",
-    "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
-    "defemailsubject": "{{SITENAME}} email from user \"$1\"",
-    "usermaildisabled": "User email disabled",
-    "usermaildisabledtext": "You cannot send email to other users on this wiki",
-    "noemailtitle": "No email address",
-    "noemailtext": "This user has not specified a valid email address.",
-    "nowikiemailtext": "This user has chosen not to receive email from other users.",
-    "emailnotarget": "Non-existent or invalid username for recipient.",
-    "emailtarget": "Enter username of recipient",
-    "emailusername": "Username:",
-    "emailusernamesubmit": "Submit",
-    "email-legend": "Send an email to another {{SITENAME}} user",
-    "emailfrom": "From:",
-    "emailto": "To:",
-    "emailsubject": "Subject:",
-    "emailmessage": "Message:",
-    "emailsend": "Send",
-    "emailccme": "Email me a copy of my message.",
-    "emailccsubject": "Copy of your message to $1: $2",
-    "emailsent": "Email sent",
-    "emailsenttext": "Your email message has been sent.",
-    "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
-    "usermessage-summary": "Leaving system message.",
-    "usermessage-editor": "System messenger",
-    "usermessage-template": "MediaWiki:UserMessage",
-    "watchlist": "Watchlist",
-    "watchlist-summary": "",
-    "mywatchlist": "Watchlist",
-    "watchlistfor2": "For $1 $2",
-    "nowatchlist": "You have no items on your watchlist.",
-    "watchlistanontext": "Please $1 to view or edit items on your watchlist.",
-    "watchnologin": "Not logged in",
-    "addwatch": "Add to watchlist",
-    "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
-    "removewatch": "Remove from watchlist",
-    "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
-    "watch": "Watch",
-    "watchthispage": "Watch this page",
-    "unwatch": "Unwatch",
-    "unwatchthispage": "Stop watching",
-    "notanarticle": "Not a content page",
-    "notvisiblerev": "The last revision by a different user has been deleted",
-    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
-    "wlheader-enotif": "Email notification is enabled.",
-    "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
-    "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
-    "wlshowlast": "Show last $1 hours $2 days $3",
-    "watchlist-options": "Watchlist options",
-    "watching": "Watching...",
-    "unwatching": "Unwatching...",
-    "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
-    "enotif_reset": "Mark all pages visited",
-    "enotif_impersonal_salutation": "{{SITENAME}} user",
-    "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
-    "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
-    "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
-    "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
-    "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
-    "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
-    "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_lastvisited": "See $1 for all changes since your last visit.",
-    "enotif_lastdiff": "See $1 to view this change.",
-    "enotif_anon_editor": "anonymous user $1",
-    "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
-    "created": "created",
-    "changed": "changed",
-    "deletepage": "Delete page",
-    "confirm": "Confirm",
-    "excontent": "content was: \"$1\"",
-    "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
-    "exbeforeblank": "content before blanking was: \"$1\"",
-    "delete-confirm": "Delete \"$1\"",
-    "delete-legend": "Delete",
-    "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
-    "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
-    "actioncomplete": "Action complete",
-    "actionfailed": "Action failed",
-    "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
-    "dellogpage": "Deletion log",
-    "dellogpagetext": "Below is a list of the most recent deletions.",
-    "deletionlog": "deletion log",
-    "reverted": "Reverted to earlier revision",
-    "deletecomment": "Reason:",
-    "deleteotherreason": "Other/additional reason:",
-    "deletereasonotherlist": "Other reason",
-    "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
-    "delete-edit-reasonlist": "Edit deletion reasons",
-    "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
-    "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
-    "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
-    "rollback": "Roll back edits",
-    "rollback_short": "Rollback",
-    "rollbacklink": "rollback",
-    "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
-    "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
-    "rollbackfailed": "Rollback failed",
-    "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
-    "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-    "editcomment": "The edit summary was: \"''$1''\".",
-    "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
-    "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-    "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
-    "sessionfailure-title": "Session failure",
-    "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
-    "protectlogpage": "Protection log",
-    "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
-    "protectedarticle": "protected \"[[$1]]\"",
-    "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
-    "unprotectedarticle": "removed protection from \"[[$1]]\"",
-    "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
-    "protect-title": "Change protection level for \"$1\"",
-    "protect-title-notallowed": "View protection level of \"$1\"",
-    "prot_1movedto2": "[[$1]] moved to [[$2]]",
-    "protect-badnamespace-title": "Non-protectable namespace",
-    "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
-    "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
-    "protect-norestrictiontypes-title": "Non-protectable page",
-    "protect-legend": "Confirm protection",
-    "protectcomment": "Reason:",
-    "protectexpiry": "Expires:",
-    "protect_expiry_invalid": "Expiry time is invalid.",
-    "protect_expiry_old": "Expiry time is in the past.",
-    "protect-unchain-permissions": "Unlock further protect options",
-    "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
-    "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
-    "protect-default": "Allow all users",
-    "protect-fallback": "Allow only users with \"$1\" permission",
-    "protect-level-autoconfirmed": "Allow only autoconfirmed users",
-    "protect-level-sysop": "Allow only administrators",
-    "protect-summary-desc": "[$1=$2] ($3)",
-    "protect-summary-cascade": "cascading",
-    "protect-expiring": "expires $1 (UTC)",
-    "protect-expiring-local": "expires $1",
-    "protect-expiry-indefinite": "indefinite",
-    "protect-cascade": "Protect pages included in this page (cascading protection)",
-    "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
-    "protect-othertime": "Other time:",
-    "protect-othertime-op": "other time",
-    "protect-existing-expiry": "Existing expiry time: $3, $2",
-    "protect-otherreason": "Other/additional reason:",
-    "protect-otherreason-op": "Other reason",
-    "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
-    "protect-edit-reasonlist": "Edit protection reasons",
-    "protect-expiry-options": "1 hour:1 hour,1 day:1 day,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",
-    "restriction-type": "Permission:",
-    "restriction-level": "Restriction level:",
-    "minimum-size": "Min size",
-    "maximum-size": "Max size:",
-    "pagesize": "(bytes)",
-    "restriction-edit": "Edit",
-    "restriction-move": "Move",
-    "restriction-create": "Create",
-    "restriction-upload": "Upload",
-    "restriction-level-sysop": "fully protected",
-    "restriction-level-autoconfirmed": "semi protected",
-    "restriction-level-all": "any level",
-    "undelete": "View deleted pages",
-    "undelete-summary": "",
-    "undeletepage": "View and restore deleted pages",
-    "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
-    "viewdeletedpage": "View deleted pages",
-    "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
-    "undelete-fieldset-title": "Restore revisions",
-    "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
-    "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
-    "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
-    "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
-    "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
-    "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
-    "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
-    "undelete-nodiff": "No previous revision found.",
-    "undeletebtn": "Restore",
-    "undeletelink": "view/restore",
-    "undeleteviewlink": "view",
-    "undeleteinvert": "Invert selection",
-    "undeletecomment": "Reason:",
-    "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
-    "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
-    "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
-    "cannotundelete": "Undelete failed:\n$1",
-    "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
-    "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
-    "undelete-search-title": "Search deleted pages",
-    "undelete-search-box": "Search deleted pages",
-    "undelete-search-prefix": "Show pages starting with:",
-    "undelete-search-submit": "Search",
-    "undelete-no-results": "No matching pages found in the deletion archive.",
-    "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
-    "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
-    "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
-    "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
-    "undelete-error": "Error undeleting page",
-    "undelete-error-short": "Error undeleting file: $1",
-    "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
-    "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "undelete-show-file-submit": "Yes",
-    "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
-    "namespace": "Namespace:",
-    "invert": "Invert selection",
-    "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
-    "namespace_association": "Associated namespace",
-    "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
-    "blanknamespace": "(Main)",
-    "contributions": "{{GENDER:$1|User}} contributions",
-    "contributions-summary": "",
-    "contributions-title": "User contributions for $1",
-    "mycontris": "Contributions",
-    "contribsub2": "For {{GENDER:$3|$1}} ($2)",
-    "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
-    "nocontribs": "No changes were found matching these criteria.",
-    "uctop": "(current)",
-    "month": "From month (and earlier):",
-    "year": "From year (and earlier):",
-    "sp-contributions-newbies": "Show contributions of new accounts only",
-    "sp-contributions-newbies-sub": "For new accounts",
-    "sp-contributions-newbies-title": "User contributions for new accounts",
-    "sp-contributions-blocklog": "block log",
-    "sp-contributions-suppresslog": "suppressed user contributions",
-    "sp-contributions-deleted": "deleted user contributions",
-    "sp-contributions-uploads": "uploads",
-    "sp-contributions-logs": "logs",
-    "sp-contributions-talk": "talk",
-    "sp-contributions-userrights": "user rights management",
-    "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-search": "Search for contributions",
-    "sp-contributions-username": "IP address or username:",
-    "sp-contributions-toponly": "Only show edits that are latest revisions",
-    "sp-contributions-newonly": "Only show edits that are page creations",
-    "sp-contributions-submit": "Search",
-    "sp-contributions-explain": "",
-    "sp-contributions-footer": "-",
-    "sp-contributions-footer-anon": "-",
-    "sp-contributions-footer-newbies": "-",
-    "whatlinkshere": "What links here",
-    "whatlinkshere-title": "Pages that link to \"$1\"",
-    "whatlinkshere-summary": "",
-    "whatlinkshere-page": "Page:",
-    "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
-    "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
-    "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
-    "isredirect": "redirect page",
-    "istemplate": "transclusion",
-    "isimage": "file link",
-    "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-    "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
-    "whatlinkshere-links": "← links",
-    "whatlinkshere-hideredirs": "$1 redirects",
-    "whatlinkshere-hidetrans": "$1 transclusions",
-    "whatlinkshere-hidelinks": "$1 links",
-    "whatlinkshere-hideimages": "$1 file links",
-    "whatlinkshere-filters": "Filters",
-    "autoblockid": "Autoblock #$1",
-    "block": "Block user",
-    "unblock": "Unblock user",
-    "unblock-summary": "",
-    "blockip": "Block user",
-    "blockip-legend": "Block user",
-    "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
-    "ipaddressorusername": "IP address or username:",
-    "ipbexpiry": "Expiry:",
-    "ipbreason": "Reason:",
-    "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
-    "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
-    "ipbcreateaccount": "Prevent account creation",
-    "ipbemailban": "Prevent user from sending email",
-    "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
-    "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,indefinite:infinite",
-    "ipbhidename": "Hide username from edits and lists",
-    "ipbwatchuser": "Watch this user's user and talk pages",
-    "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
-    "ipb-change-block": "Re-block the user with these settings",
-    "ipb-confirm": "Confirm block",
-    "badipaddress": "Invalid IP address",
-    "blockipsuccesssub": "Block succeeded",
-    "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
-    "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
-    "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
-    "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
-    "ipb-edit-dropdown": "Edit block reasons",
-    "ipb-unblock-addr": "Unblock $1",
-    "ipb-unblock": "Unblock a username or IP address",
-    "ipb-blocklist": "View existing blocks",
-    "ipb-blocklist-contribs": "Contributions for $1",
-    "unblockip": "Unblock user",
-    "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
-    "ipusubmit": "Remove this block",
-    "unblocked": "[[User:$1|$1]] has been unblocked.",
-    "unblocked-range": "$1 has been unblocked.",
-    "unblocked-id": "Block $1 has been removed.",
-    "blocklist": "Blocked users",
-    "ipblocklist": "Blocked users",
-    "ipblocklist-legend": "Find a blocked user",
-    "blocklist-userblocks": "Hide account blocks",
-    "blocklist-tempblocks": "Hide temporary blocks",
-    "blocklist-addressblocks": "Hide single IP blocks",
-    "blocklist-rangeblocks": "Hide range blocks",
-    "blocklist-timestamp": "Timestamp",
-    "blocklist-target": "Target",
-    "blocklist-expiry": "Expires",
-    "blocklist-by": "Blocking admin",
-    "blocklist-params": "Block parameters",
-    "blocklist-reason": "Reason",
-    "blocklist-summary": "",
-    "ipblocklist-submit": "Search",
-    "ipblocklist-localblock": "Local block",
-    "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
-    "infiniteblock": "infinite",
-    "expiringblock": "expires on $1 at $2",
-    "anononlyblock": "anon. only",
-    "noautoblockblock": "autoblock disabled",
-    "createaccountblock": "account creation disabled",
-    "emailblock": "email disabled",
-    "blocklist-nousertalk": "cannot edit own talk page",
-    "ipblocklist-empty": "The block list is empty.",
-    "ipblocklist-no-results": "The requested IP address or username is not blocked.",
-    "blocklink": "block",
-    "unblocklink": "unblock",
-    "change-blocklink": "change block",
-    "contribslink": "contribs",
-    "emaillink": "send email",
-    "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
-    "blocklogpage": "Block log",
-    "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
-    "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
-    "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
-    "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
-    "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "unblocklogentry": "unblocked $1",
-    "block-log-flags-anononly": "anonymous users only",
-    "block-log-flags-nocreate": "account creation disabled",
-    "block-log-flags-noautoblock": "autoblock disabled",
-    "block-log-flags-noemail": "email disabled",
-    "block-log-flags-nousertalk": "cannot edit own talk page",
-    "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
-    "block-log-flags-hiddenname": "username hidden",
-    "range_block_disabled": "The administrator ability to create range blocks is disabled.",
-    "ipb_expiry_invalid": "Expiry time invalid.",
-    "ipb_expiry_temp": "Hidden username blocks must be permanent.",
-    "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
-    "ipb_already_blocked": "\"$1\" is already blocked.",
-    "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
-    "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
-    "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
-    "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
-    "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
-    "ip_range_invalid": "Invalid IP range.",
-    "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
-    "proxyblocker": "Proxy blocker",
-    "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
-    "sorbs": "DNSBL",
-    "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
-    "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
-    "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
-    "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
-    "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
-    "ipbnounblockself": "You are not allowed to unblock yourself.",
-    "ipb-default-expiry": "",
-    "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.\nPlease 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.\nPlease 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 />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
-    "unlockdbsuccesstext": "The database has been unlocked.",
-    "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
-    "databasenotlocked": "The database is not locked.",
-    "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
-    "move-page": "Move $1",
-    "movepage-summary": "",
-    "move-page-legend": "Move page",
-    "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
-    "movearticle": "Move page:",
-    "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
-    "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
-    "movenotallowed": "You do not have permission to move pages.",
-    "movenotallowedfile": "You do not have permission to move files.",
-    "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
-    "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
-    "newtitle": "To new title:",
-    "move-watch": "Watch source page and target page",
-    "movepagebtn": "Move page",
-    "pagemovedsub": "Move succeeded",
-    "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
-    "movepage-moved-redirect": "A redirect has been created.",
-    "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
-    "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-    "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
-    "movetalk": "Move associated talk page",
-    "move-subpages": "Move subpages (up to $1)",
-    "move-talk-subpages": "Move subpages of talk page (up to $1)",
-    "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
-    "movepage-page-moved": "The page $1 has been moved to $2.",
-    "movepage-page-unmoved": "The page $1 could not be moved to $2.",
-    "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
-    "movelogpage": "Move log",
-    "movelogpagetext": "Below is a list of all page moves.",
-    "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
-    "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
-    "movenosubpage": "This page has no subpages.",
-    "movereason": "Reason:",
-    "move-redirect-text": "",
-    "revertmove": "revert",
-    "delete_and_move": "Delete and move",
-    "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo 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 from \"[[$1]]\"",
-    "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-    "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-    "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
-    "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
-    "immobile-source-page": "This page is not movable.",
-    "immobile-target-page": "Cannot move to that destination title.",
-    "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
-    "imagenocrossnamespace": "Cannot move file to non-file namespace",
-    "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-    "imagetypemismatch": "The new file extension does not match its type",
-    "imageinvalidfilename": "The target filename is invalid",
-    "fix-double-redirects": "Update any redirects that point to the original title",
-    "move-leave-redirect": "Leave a redirect behind",
-    "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
-    "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
-    "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
-    "export": "Export pages",
-    "export-summary": "",
-    "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
-    "exportall": "Export all pages",
-    "exportcuronly": "Include only the current revision, not the full history",
-    "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
-    "exportlistauthors": "Include a full list of contributors for each page",
-    "export-submit": "Export",
-    "export-addcattext": "Add pages from category:",
-    "export-addcat": "Add",
-    "export-addnstext": "Add pages from namespace:",
-    "export-addns": "Add",
-    "export-download": "Save as file",
-    "export-templates": "Include templates",
-    "export-pagelinks": "Include linked pages to a depth of:",
-    "allmessages": "System messages",
-    "allmessagesname": "Name",
-    "allmessagesdefault": "Default message text",
-    "allmessagescurrent": "Current message text",
-    "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
-    "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
-    "allmessages-filter-legend": "Filter",
-    "allmessages-filter": "Filter by customization state:",
-    "allmessages-filter-unmodified": "Unmodified",
-    "allmessages-filter-all": "All",
-    "allmessages-filter-modified": "Modified",
-    "allmessages-prefix": "Filter by prefix:",
-    "allmessages-language": "Language:",
-    "allmessages-filter-submit": "Go",
-    "allmessages-filter-translate": "Translate",
-    "thumbnail-more": "Enlarge",
-    "filemissing": "File missing",
-    "thumbnail_error": "Error creating thumbnail: $1",
-    "thumbnail_error_remote": "Error message from $1:\n$2",
-    "djvu_page_error": "DjVu page out of range",
-    "djvu_no_xml": "Unable to fetch XML for DjVu file",
-    "thumbnail-temp-create": "Unable to create temporary thumbnail file",
-    "thumbnail-dest-create": "Unable to save thumbnail to destination",
-    "thumbnail_invalid_params": "Invalid thumbnail parameters",
-    "thumbnail_dest_directory": "Unable to create destination directory",
-    "thumbnail_image-type": "Image type not supported",
-    "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
-    "thumbnail_image-missing": "File seems to be missing: $1",
-    "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
-    "import": "Import pages",
-    "import-summary": "",
-    "importinterwiki": "Transwiki import",
-    "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll transwiki import actions are logged at the [[Special:Log/import|import log]].",
-    "import-interwiki-source": "Source wiki/page:",
-    "import-interwiki-history": "Copy all history revisions for this page",
-    "import-interwiki-templates": "Include all templates",
-    "import-interwiki-submit": "Import",
-    "import-interwiki-namespace": "Destination namespace:",
-    "import-interwiki-rootpage": "Destination root page (optional):",
-    "import-upload-filename": "Filename:",
-    "import-comment": "Comment:",
-    "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
-    "importstart": "Importing pages...",
-    "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
-    "importnopages": "No pages to import.",
-    "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
-    "importfailed": "Import failed: <nowiki>$1</nowiki>",
-    "importunknownsource": "Unknown import source type",
-    "importcantopen": "Could not open import file",
-    "importbadinterwiki": "Bad interwiki link",
-    "importsuccess": "Import finished!",
-    "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
-    "importnofile": "No import file was uploaded.",
-    "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
-    "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
-    "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
-    "import-parse-failure": "XML import parse failure",
-    "import-noarticle": "No page to import!",
-    "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
-    "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
-    "import-upload": "Upload XML data",
-    "import-token-mismatch": "Loss of session data.\nPlease try again.",
-    "import-invalid-interwiki": "Cannot import from the specified wiki.",
-    "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
-    "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
-    "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
-    "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
-    "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
-    "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
-    "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
-    "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
-    "import-rootpage-invalid": "Given root page is an invalid title.",
-    "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
-    "importlogpage": "Import log",
-    "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
-    "import-logentry-upload": "imported [[$1]] by file upload",
-    "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
-    "import-logentry-interwiki": "transwikied $1",
-    "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
-    "javascripttest": "JavaScript testing",
-    "javascripttest-backlink": "< $1",
-    "javascripttest-title": "Running $1 tests",
-    "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
-    "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
-    "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
-    "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
-    "javascripttest-qunit-name": "QUnit",
-    "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
-    "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
-    "accesskey-pt-userpage": ".",
-    "accesskey-pt-anonuserpage": ".",
-    "accesskey-pt-mytalk": "n",
-    "accesskey-pt-anontalk": "n",
-    "accesskey-pt-preferences": "",
-    "accesskey-pt-watchlist": "l",
-    "accesskey-pt-mycontris": "y",
-    "accesskey-pt-login": "o",
-    "accesskey-pt-logout": "",
-    "accesskey-ca-talk": "t",
-    "accesskey-ca-edit": "e",
-    "accesskey-ca-addsection": "+",
-    "accesskey-ca-viewsource": "e",
-    "accesskey-ca-history": "h",
-    "accesskey-ca-protect": "=",
-    "accesskey-ca-unprotect": "=",
-    "accesskey-ca-delete": "d",
-    "accesskey-ca-undelete": "d",
-    "accesskey-ca-move": "m",
-    "accesskey-ca-watch": "w",
-    "accesskey-ca-unwatch": "w",
-    "accesskey-search": "f",
-    "accesskey-search-go": "",
-    "accesskey-search-fulltext": "",
-    "accesskey-p-logo": "",
-    "accesskey-n-mainpage": "z",
-    "accesskey-n-mainpage-description": "z",
-    "accesskey-n-portal": "",
-    "accesskey-n-currentevents": "",
-    "accesskey-n-recentchanges": "r",
-    "accesskey-n-randompage": "x",
-    "accesskey-n-help": "",
-    "accesskey-t-whatlinkshere": "j",
-    "accesskey-t-recentchangeslinked": "k",
-    "accesskey-feed-rss": "",
-    "accesskey-feed-atom": "",
-    "accesskey-t-contributions": "",
-    "accesskey-t-emailuser": "",
-    "accesskey-t-permalink": "",
-    "accesskey-t-print": "p",
-    "accesskey-t-upload": "u",
-    "accesskey-t-specialpages": "q",
-    "accesskey-ca-nstab-main": "c",
-    "accesskey-ca-nstab-user": "c",
-    "accesskey-ca-nstab-media": "c",
-    "accesskey-ca-nstab-special": "",
-    "accesskey-ca-nstab-project": "a",
-    "accesskey-ca-nstab-image": "c",
-    "accesskey-ca-nstab-mediawiki": "c",
-    "accesskey-ca-nstab-template": "c",
-    "accesskey-ca-nstab-help": "c",
-    "accesskey-ca-nstab-category": "c",
-    "accesskey-minoredit": "i",
-    "accesskey-save": "s",
-    "accesskey-preview": "p",
-    "accesskey-diff": "v",
-    "accesskey-compareselectedversions": "v",
-    "accesskey-watch": "w",
-    "accesskey-upload": "s",
-    "accesskey-preferences-save": "s",
-    "accesskey-summary": "b",
-    "accesskey-userrights-set": "s",
-    "accesskey-blockip-block": "s",
-    "accesskey-export": "s",
-    "accesskey-import": "s",
-    "accesskey-watchlistedit-normal-submit": "s",
-    "accesskey-watchlistedit-raw-submit": "s",
-    "tooltip-pt-userpage": "Your user page",
-    "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
-    "tooltip-pt-mytalk": "Your talk page",
-    "tooltip-pt-anontalk": "Discussion about edits from this IP address",
-    "tooltip-pt-preferences": "Your preferences",
-    "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
-    "tooltip-pt-mycontris": "A list of your contributions",
-    "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
-    "tooltip-pt-logout": "Log out",
-    "tooltip-ca-talk": "Discussion about the content page",
-    "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
-    "tooltip-ca-addsection": "Start a new section",
-    "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
-    "tooltip-ca-history": "Past revisions of this page",
-    "tooltip-ca-protect": "Protect this page",
-    "tooltip-ca-unprotect": "Change protection of this page",
-    "tooltip-ca-delete": "Delete this page",
-    "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
-    "tooltip-ca-move": "Move this page",
-    "tooltip-ca-watch": "Add this page to your watchlist",
-    "tooltip-ca-unwatch": "Remove this page from your watchlist",
-    "tooltip-search": "Search {{SITENAME}}",
-    "tooltip-search-go": "Go to a page with this exact name if exists",
-    "tooltip-search-fulltext": "Search the pages for this text",
-    "tooltip-p-logo": "Visit the main page",
-    "tooltip-n-mainpage": "Visit the main page",
-    "tooltip-n-mainpage-description": "Visit the main page",
-    "tooltip-n-portal": "About the project, what you can do, where to find things",
-    "tooltip-n-currentevents": "Find background information on current events",
-    "tooltip-n-recentchanges": "A list of recent changes in the wiki",
-    "tooltip-n-randompage": "Load a random page",
-    "tooltip-n-help": "The place to find out",
-    "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
-    "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
-    "tooltip-feed-rss": "RSS feed for this page",
-    "tooltip-feed-atom": "Atom feed for this page",
-    "tooltip-t-contributions": "A list of contributions of this user",
-    "tooltip-t-emailuser": "Send an email to this user",
-    "tooltip-t-upload": "Upload files",
-    "tooltip-t-specialpages": "A list of all special pages",
-    "tooltip-t-print": "Printable version of this page",
-    "tooltip-t-permalink": "Permanent link to this revision of the page",
-    "tooltip-ca-nstab-main": "View the content page",
-    "tooltip-ca-nstab-user": "View the user page",
-    "tooltip-ca-nstab-media": "View the media page",
-    "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
-    "tooltip-ca-nstab-project": "View the project page",
-    "tooltip-ca-nstab-image": "View the file page",
-    "tooltip-ca-nstab-mediawiki": "View the system message",
-    "tooltip-ca-nstab-template": "View the template",
-    "tooltip-ca-nstab-help": "View the help page",
-    "tooltip-ca-nstab-category": "View the category page",
-    "tooltip-minoredit": "Mark this as a minor edit",
-    "tooltip-save": "Save your changes",
-    "tooltip-preview": "Preview your changes, please use this before saving!",
-    "tooltip-diff": "Show which changes you made to the text",
-    "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
-    "tooltip-watch": "Add this page to your watchlist",
-    "tooltip-watchlistedit-normal-submit": "Remove titles",
-    "tooltip-watchlistedit-raw-submit": "Update watchlist",
-    "tooltip-recreate": "Recreate the page even though it has been deleted",
-    "tooltip-upload": "Start upload",
-    "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
-    "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
-    "tooltip-preferences-save": "Save preferences",
-    "tooltip-summary": "Enter a short summary",
-    "interlanguage-link-title": "$1 – $2",
-    "interlanguage-link-title-langonly": "$1",
-    "common.css": "/* CSS placed here will be applied to all skins */",
-    "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
-    "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
-    "modern.css": "/* CSS placed here will affect users of the Modern skin */",
-    "vector.css": "/* CSS placed here will affect users of the Vector skin */",
-    "print.css": "/* CSS placed here will affect the print output */",
-    "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
-    "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
-    "group-user.css": "/* CSS placed here will affect registered users only */",
-    "group-bot.css": "/* CSS placed here will affect bots only */",
-    "group-sysop.css": "/* CSS placed here will affect sysops only */",
-    "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
-    "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-    "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
-    "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-    "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
-    "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
-    "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
-    "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
-    "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
-    "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
-    "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
-    "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
-    "siteuser": "{{SITENAME}} user $1",
-    "anonuser": "{{SITENAME}} anonymous user $1",
-    "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
-    "othercontribs": "Based on work by $1.",
-    "others": "others",
-    "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
-    "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
-    "creditspage": "Page credits",
-    "nocredits": "There is no credits info available for this page.",
-    "spamprotectiontitle": "Spam protection filter",
-    "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
-    "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
-    "spambot_username": "MediaWiki spam cleanup",
-    "spam_reverting": "Reverting to last revision not containing links to $1",
-    "spam_blanking": "All revisions contained links to $1, blanking",
-    "spam_deleting": "All revisions contained links to $1, deleting",
-    "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
-    "pageinfo-header": "-",
-    "pageinfo-title": "Information for \"$1\"",
-    "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
-    "pageinfo-header-basic": "Basic information",
-    "pageinfo-header-edits": "Edit history",
-    "pageinfo-header-restrictions": "Page protection",
-    "pageinfo-header-properties": "Page properties",
-    "pageinfo-display-title": "Display title",
-    "pageinfo-default-sort": "Default sort key",
-    "pageinfo-length": "Page length (in bytes)",
-    "pageinfo-article-id": "Page ID",
-    "pageinfo-language": "Page content language",
-    "pageinfo-content-model": "Page content model",
-    "pageinfo-robot-policy": "Indexing by robots",
-    "pageinfo-robot-index": "Allowed",
-    "pageinfo-robot-noindex": "Disallowed",
-    "pageinfo-views": "Number of views",
-    "pageinfo-watchers": "Number of page watchers",
-    "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
-    "pageinfo-redirects-name": "Number of redirects to this page",
-    "pageinfo-redirects-value": "$1",
-    "pageinfo-subpages-name": "Number of subpages of this page",
-    "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
-    "pageinfo-firstuser": "Page creator",
-    "pageinfo-firsttime": "Date of page creation",
-    "pageinfo-lastuser": "Latest editor",
-    "pageinfo-lasttime": "Date of latest edit",
-    "pageinfo-edits": "Total number of edits",
-    "pageinfo-authors": "Total number of distinct authors",
-    "pageinfo-recent-edits": "Recent number of edits (within past $1)",
-    "pageinfo-recent-authors": "Recent number of distinct authors",
-    "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)",
-    "pageinfo-hidden-categories": "Hidden {{PLURAL:$1|category|categories}} ($1)",
-    "pageinfo-templates": "Transcluded {{PLURAL:$1|template|templates}} ($1)",
-    "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
-    "pageinfo-footer": "-",
-    "pageinfo-toolboxlink": "Page information",
-    "pageinfo-redirectsto": "Redirects to",
-    "pageinfo-redirectsto-info": "info",
-    "pageinfo-contentpage": "Counted as a content page",
-    "pageinfo-contentpage-yes": "Yes",
-    "pageinfo-protect-cascading": "Protections are cascading from here",
-    "pageinfo-protect-cascading-yes": "Yes",
-    "pageinfo-protect-cascading-from": "Protections are cascading from",
-    "pageinfo-category-info": "Category information",
-    "pageinfo-category-pages": "Number of pages",
-    "pageinfo-category-subcats": "Number of subcategories",
-    "pageinfo-category-files": "Number of files",
-    "skinname-cologneblue": "Cologne Blue",
-    "skinname-monobook": "MonoBook",
-    "skinname-modern": "Modern",
-    "skinname-vector": "Vector",
-    "markaspatrolleddiff": "Mark as patrolled",
-    "markaspatrolledlink": "[$1]",
-    "markaspatrolledtext": "Mark this page as patrolled",
-    "markedaspatrolled": "Marked as patrolled",
-    "markedaspatrolledtext": "The selected revision of [[:$1]] 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.",
-    "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
-    "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
-    "markedaspatrollederrornotify": "Marking as patrolled failed.",
-    "patrol-log-page": "Patrol log",
-    "patrol-log-header": "This is a log of patrolled revisions.",
-    "log-show-hide-patrol": "$1 patrol log",
-    "deletedrevision": "Deleted old revision $1",
-    "filedeleteerror-short": "Error deleting file: $1",
-    "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
-    "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
-    "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
-    "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
-    "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
-    "previousdiff": "← Older edit",
-    "nextdiff": "Newer edit →",
-    "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
-    "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
-    "thumbsize": "Thumbnail size:",
-    "widthheight": "$1 × $2",
-    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
-    "file-info": "file size: $1, MIME type: $2",
-    "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
-    "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
-    "file-nohires": "No higher resolution available.",
-    "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-error": "Invalid SVG file: $1",
-    "show-big-image": "Original file",
-    "show-big-image-preview": "Size of this preview: $1.",
-    "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
-    "show-big-image-size": "$1 × $2 pixels",
-    "file-info-gif-looped": "looped",
-    "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-info-png-looped": "looped",
-    "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
-    "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
-    "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
-    "newimages": "Gallery of new files",
-    "newimagestext": "-",
-    "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
-    "newimages-summary": "This special page shows the last uploaded files.",
-    "newimages-legend": "Filter",
-    "newimages-label": "Filename (or a part of it):",
-    "showhidebots": "($1 bots)",
-    "noimages": "Nothing to see.",
-    "ilsubmit": "Search",
-    "bydate": "by date",
-    "sp-newimages-showfrom": "Show new files starting from $2, $1",
-    "video-dims": "$1, $2 × $3",
-    "seconds-abbrev": "$1 s",
-    "minutes-abbrev": "$1 min",
-    "hours-abbrev": "$1 h",
-    "days-abbrev": "$1 d",
-    "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
-    "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
-    "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
-    "days": "{{PLURAL:$1|$1 day|$1 days}}",
-    "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
-    "months": "{{PLURAL:$1|$1 month|$1 months}}",
-    "years": "{{PLURAL:$1|$1 year|$1 years}}",
-    "ago": "$1 ago",
-    "just-now": "just now",
-    "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
-    "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
-    "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
-    "monday-at": "Monday at $1",
-    "tuesday-at": "Tuesday at $1",
-    "wednesday-at": "Wednesday at $1",
-    "thursday-at": "Thursday at $1",
-    "friday-at": "Friday at $1",
-    "saturday-at": "Saturday at $1",
-    "sunday-at": "Sunday at $1",
-    "today-at": "$1",
-    "yesterday-at": "Yesterday at $1",
-    "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
-    "variantname-zh-hans": "hans",
-    "variantname-zh-hant": "hant",
-    "variantname-zh-cn": "cn",
-    "variantname-zh-tw": "tw",
-    "variantname-zh-hk": "hk",
-    "variantname-zh-mo": "mo",
-    "variantname-zh-sg": "sg",
-    "variantname-zh-my": "my",
-    "variantname-zh": "zh",
-    "variantname-gan-hans": "hans",
-    "variantname-gan-hant": "hant",
-    "variantname-gan": "gan",
-    "variantname-sr-ec": "sr-ec",
-    "variantname-sr-el": "sr-el",
-    "variantname-sr": "sr",
-    "variantname-kk-kz": "kk-kz",
-    "variantname-kk-tr": "kk-tr",
-    "variantname-kk-cn": "kk-cn",
-    "variantname-kk-cyrl": "kk-cyrl",
-    "variantname-kk-latn": "kk-latn",
-    "variantname-kk-arab": "kk-arab",
-    "variantname-kk": "kk",
-    "variantname-ku-arab": "ku-Arab",
-    "variantname-ku-latn": "ku-Latn",
-    "variantname-ku": "ku",
-    "variantname-tg-cyrl": "tg-Cyrl",
-    "variantname-tg-latn": "tg-Latn",
-    "variantname-tg": "tg",
-    "variantname-ike-cans": "ike-Cans",
-    "variantname-ike-latn": "ike-Latn",
-    "variantname-iu": "iu",
-    "variantname-shi-tfng": "shi-Tfng",
-    "variantname-shi-latn": "shi-Latn",
-    "variantname-shi": "shi",
-    "metadata": "Metadata",
-    "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
-    "metadata-expand": "Show extended details",
-    "metadata-collapse": "Hide extended details",
-    "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-    "metadata-langitem": "<strong>$2:</strong> $1",
-    "metadata-langitem-default": "$1",
-    "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-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-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": "Image width",
-    "exif-pixelxdimension": "Image height",
-    "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-shutterspeedvalue": "APEX shutter speed",
-    "exif-aperturevalue": "APEX aperture",
-    "exif-brightnessvalue": "APEX brightness",
-    "exif-exposurebiasvalue": "APEX 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-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-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",
-    "exif-coordinate-format": "$1° $2′ $3″ $4",
-    "exif-jpegfilecomment": "JPEG file comment",
-    "exif-keywords": "Keywords",
-    "exif-worldregioncreated": "World region that the picture was taken in",
-    "exif-countrycreated": "Country that the picture was taken in",
-    "exif-countrycodecreated": "Code for the country that the picture was taken in",
-    "exif-provinceorstatecreated": "Province or state that the picture was taken in",
-    "exif-citycreated": "City that the picture was taken in",
-    "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
-    "exif-worldregiondest": "World region shown",
-    "exif-countrydest": "Country shown",
-    "exif-countrycodedest": "Code for country shown",
-    "exif-provinceorstatedest": "Province or state shown",
-    "exif-citydest": "City shown",
-    "exif-sublocationdest": "Sublocation of city shown",
-    "exif-objectname": "Short title",
-    "exif-specialinstructions": "Special instructions",
-    "exif-headline": "Headline",
-    "exif-credit": "Credit/Provider",
-    "exif-source": "Source",
-    "exif-editstatus": "Editorial status of image",
-    "exif-urgency": "Urgency",
-    "exif-fixtureidentifier": "Fixture name",
-    "exif-locationdest": "Location depicted",
-    "exif-locationdestcode": "Code of location depicted",
-    "exif-objectcycle": "Time of day that media is intended for",
-    "exif-contact": "Contact information",
-    "exif-writer": "Writer",
-    "exif-languagecode": "Language",
-    "exif-iimversion": "IIM version",
-    "exif-iimcategory": "Category",
-    "exif-iimsupplementalcategory": "Supplemental categories",
-    "exif-datetimeexpires": "Do not use after",
-    "exif-datetimereleased": "Released on",
-    "exif-originaltransmissionref": "Original transmission location code",
-    "exif-identifier": "Identifier",
-    "exif-lens": "Lens used",
-    "exif-serialnumber": "Serial number of camera",
-    "exif-cameraownername": "Owner of camera",
-    "exif-label": "Label",
-    "exif-datetimemetadata": "Date metadata was last modified",
-    "exif-nickname": "Informal name of image",
-    "exif-rating": "Rating (out of 5)",
-    "exif-rightscertificate": "Rights management certificate",
-    "exif-copyrighted": "Copyright status",
-    "exif-copyrightowner": "Copyright owner",
-    "exif-usageterms": "Usage terms",
-    "exif-webstatement": "Online copyright statement",
-    "exif-originaldocumentid": "Unique ID of original document",
-    "exif-licenseurl": "URL for copyright license",
-    "exif-morepermissionsurl": "Alternative licensing information",
-    "exif-attributionurl": "When re-using this work, please link to",
-    "exif-preferredattributionname": "When re-using this work, please credit",
-    "exif-pngfilecomment": "PNG file comment",
-    "exif-disclaimer": "Disclaimer",
-    "exif-contentwarning": "Content warning",
-    "exif-giffilecomment": "GIF file comment",
-    "exif-intellectualgenre": "Type of item",
-    "exif-subjectnewscode": "Subject code",
-    "exif-scenecode": "IPTC scene code",
-    "exif-event": "Event depicted",
-    "exif-organisationinimage": "Organization depicted",
-    "exif-personinimage": "Person depicted",
-    "exif-originalimageheight": "Height of image before it was cropped",
-    "exif-originalimagewidth": "Width of image before it was cropped",
-    "exif-make-value": "$1",
-    "exif-model-value": "$1",
-    "exif-software-value": "$1",
-    "exif-software-version-value": "$1 (Version $2)",
-    "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
-    "exif-subjectnewscode-value": "$2 ($1)",
-    "exif-compression-1": "Uncompressed",
-    "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
-    "exif-compression-3": "CCITT Group 3 fax encoding",
-    "exif-compression-4": "CCITT Group 4 fax encoding",
-    "exif-compression-5": "LZW",
-    "exif-compression-6": "JPEG (old)",
-    "exif-compression-7": "JPEG",
-    "exif-compression-8": "Deflate (Adobe)",
-    "exif-compression-32773": "PackBits (Macintosh RLE)",
-    "exif-compression-32946": "Deflate (PKZIP)",
-    "exif-compression-34712": "JPEG2000",
-    "exif-copyrighted-true": "Copyrighted",
-    "exif-copyrighted-false": "Copyright status not set",
-    "exif-photometricinterpretation-2": "RGB",
-    "exif-photometricinterpretation-6": "YCbCr",
-    "exif-unknowndate": "Unknown date",
-    "exif-orientation-1": "Normal",
-    "exif-orientation-2": "Flipped horizontally",
-    "exif-orientation-3": "Rotated 180°",
-    "exif-orientation-4": "Flipped vertically",
-    "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
-    "exif-orientation-6": "Rotated 90° CCW",
-    "exif-orientation-7": "Rotated 90° CW and flipped vertically",
-    "exif-orientation-8": "Rotated 90° CW",
-    "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-65535": "Uncalibrated",
-    "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 meters",
-    "exif-meteringmode-0": "Unknown",
-    "exif-meteringmode-1": "Average",
-    "exif-meteringmode-2": "Center weighted average",
-    "exif-meteringmode-3": "Spot",
-    "exif-meteringmode-4": "Multi-Spot",
-    "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-flash-fired-0": "Flash did not fire",
-    "exif-flash-fired-1": "Flash fired",
-    "exif-flash-return-0": "no strobe return detection function",
-    "exif-flash-return-2": "strobe return light not detected",
-    "exif-flash-return-3": "strobe return light detected",
-    "exif-flash-mode-1": "compulsory flash firing",
-    "exif-flash-mode-2": "compulsory flash suppression",
-    "exif-flash-mode-3": "auto mode",
-    "exif-flash-function-1": "No flash function",
-    "exif-flash-redeye-1": "red-eye reduction mode",
-    "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": "Digital still camera",
-    "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",
-    "exif-gpslatitude-n": "North latitude",
-    "exif-gpslatitude-s": "South latitude",
-    "exif-gpslongitude-e": "East longitude",
-    "exif-gpslongitude-w": "West longitude",
-    "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
-    "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
-    "exif-gpsstatus-a": "Measurement in progress",
-    "exif-gpsstatus-v": "Measurement interoperability",
-    "exif-gpsmeasuremode-2": "2-dimensional measurement",
-    "exif-gpsmeasuremode-3": "3-dimensional measurement",
-    "exif-gpsspeed-k": "Kilometers per hour",
-    "exif-gpsspeed-m": "Miles per hour",
-    "exif-gpsspeed-n": "Knots",
-    "exif-gpsdestdistance-k": "Kilometers",
-    "exif-gpsdestdistance-m": "Miles",
-    "exif-gpsdestdistance-n": "Nautical miles",
-    "exif-gpsdop-excellent": "Excellent ($1)",
-    "exif-gpsdop-good": "Good ($1)",
-    "exif-gpsdop-moderate": "Moderate ($1)",
-    "exif-gpsdop-fair": "Fair ($1)",
-    "exif-gpsdop-poor": "Poor ($1)",
-    "exif-objectcycle-a": "Morning only",
-    "exif-objectcycle-p": "Evening only",
-    "exif-objectcycle-b": "Both morning and evening",
-    "exif-gpsdirection-t": "True direction",
-    "exif-gpsdirection-m": "Magnetic direction",
-    "exif-ycbcrpositioning-1": "Centered",
-    "exif-ycbcrpositioning-2": "Co-sited",
-    "exif-dc-contributor": "Contributors",
-    "exif-dc-coverage": "Spatial or temporal scope of media",
-    "exif-dc-date": "Date(s)",
-    "exif-dc-publisher": "Publisher",
-    "exif-dc-relation": "Related media",
-    "exif-dc-rights": "Rights",
-    "exif-dc-source": "Source media",
-    "exif-dc-type": "Type of media",
-    "exif-rating-rejected": "Rejected",
-    "exif-isospeedratings-overflow": "Greater than 65535",
-    "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
-    "exif-iimcategory-ace": "Arts, culture and entertainment",
-    "exif-iimcategory-clj": "Crime and law",
-    "exif-iimcategory-dis": "Disasters and accidents",
-    "exif-iimcategory-fin": "Economy and business",
-    "exif-iimcategory-edu": "Education",
-    "exif-iimcategory-evn": "Environment",
-    "exif-iimcategory-hth": "Health",
-    "exif-iimcategory-hum": "Human interest",
-    "exif-iimcategory-lab": "Labor",
-    "exif-iimcategory-lif": "Lifestyle and leisure",
-    "exif-iimcategory-pol": "Politics",
-    "exif-iimcategory-rel": "Religion and belief",
-    "exif-iimcategory-sci": "Science and technology",
-    "exif-iimcategory-soi": "Social issues",
-    "exif-iimcategory-spo": "Sports",
-    "exif-iimcategory-war": "War, conflict and unrest",
-    "exif-iimcategory-wea": "Weather",
-    "exif-urgency-normal": "Normal ($1)",
-    "exif-urgency-low": "Low ($1)",
-    "exif-urgency-high": "High ($1)",
-    "exif-urgency-other": "User-defined priority ($1)",
-    "watchlistall2": "all",
-    "namespacesall": "all",
-    "monthsall": "all",
-    "confirmemail": "Confirm email address",
-    "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
-    "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
-    "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
-    "confirmemail_send": "Mail a confirmation code",
-    "confirmemail_sent": "Confirmation email sent.",
-    "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
-    "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
-    "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
-    "confirmemail_needlogin": "Please $1 to confirm your email address.",
-    "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
-    "confirmemail_loggedin": "Your email address has now been confirmed.",
-    "confirmemail_subject": "{{SITENAME}} email address confirmation",
-    "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_invalidated": "Email address confirmation canceled",
-    "invalidateemail": "Cancel email confirmation",
-    "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
-    "scarytranscludefailed": "[Template fetch failed for $1]",
-    "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
-    "scarytranscludetoolong": "[URL is too long]",
-    "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
-    "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
-    "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
-    "recreate": "Recreate",
-    "unit-pixel": "px",
-    "confirm_purge_button": "OK",
-    "confirm-purge-top": "Clear the cache of this page?",
-    "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
-    "confirm-watch-button": "OK",
-    "confirm-watch-top": "Add this page to your watchlist?",
-    "confirm-unwatch-button": "OK",
-    "confirm-unwatch-top": "Remove this page from your watchlist?",
-    "semicolon-separator": ";&#32;",
-    "comma-separator": ",&#32;",
-    "colon-separator": ":&#32;",
-    "autocomment-prefix": "",
-    "pipe-separator": "&#32;|&#32;",
-    "word-separator": "&#32;",
-    "ellipsis": "...",
-    "percent": "$1%",
-    "parentheses": "($1)",
-    "brackets": "[$1]",
-    "quotation-marks": "\"$1\"",
-    "imgmultipageprev": "← previous page",
-    "imgmultipagenext": "next page →",
-    "imgmultigo": "Go!",
-    "imgmultigoto": "Go to page $1",
-    "img-lang-opt": "$2 ($1)",
-    "img-lang-default": "(default language)",
-    "img-lang-info": "Render this image in $1. $2",
-    "img-lang-go": "Go",
-    "ascending_abbrev": "asc",
-    "descending_abbrev": "desc",
-    "table_pager_next": "Next page",
-    "table_pager_prev": "Previous page",
-    "table_pager_first": "First page",
-    "table_pager_last": "Last page",
-    "table_pager_limit": "Show $1 items per page",
-    "table_pager_limit_label": "Items per page:",
-    "table_pager_limit_submit": "Go",
-    "table_pager_empty": "No results",
-    "autosumm-blank": "Blanked the page",
-    "autosumm-replace": "Replaced content with \"$1\"",
-    "autoredircomment": "Redirected page to [[$1]]",
-    "autosumm-new": "Created page with \"$1\"",
-    "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
-    "size-bytes": "$1 B",
-    "size-kilobytes": "$1 KB",
-    "size-megabytes": "$1 MB",
-    "size-gigabytes": "$1 GB",
-    "size-terabytes": "$1 TB",
-    "size-petabytes": "$1 PB",
-    "size-exabytes": "$1 EB",
-    "size-zetabytes": "$1 ZB",
-    "size-yottabytes": "$1 YB",
-    "bitrate-bits": "$1 bps",
-    "bitrate-kilobits": "$1 kbps",
-    "bitrate-megabits": "$1 Mbps",
-    "bitrate-gigabits": "$1 Gbps",
-    "bitrate-terabits": "$1 Tbps",
-    "bitrate-petabits": "$1 Pbps",
-    "bitrate-exabits": "$1 Ebps",
-    "bitrate-zetabits": "$1 Zbps",
-    "bitrate-yottabits": "$1 Ybps",
-    "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "editwatchlist-summary": "",
-    "watchlistedit-normal-title": "Edit watchlist",
-    "watchlistedit-normal-legend": "Remove titles from watchlist",
-    "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
-    "watchlistedit-normal-submit": "Remove titles",
-    "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
-    "watchlistedit-raw-title": "Edit raw watchlist",
-    "watchlistedit-raw-legend": "Edit raw watchlist",
-    "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
-    "watchlistedit-raw-titles": "Titles:",
-    "watchlistedit-raw-submit": "Update watchlist",
-    "watchlistedit-raw-done": "Your watchlist has been updated.",
-    "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
-    "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
-    "watchlisttools-view": "View relevant changes",
-    "watchlisttools-edit": "View and edit watchlist",
-    "watchlisttools-raw": "Edit raw watchlist",
-    "iranian-calendar-m1": "Farvardin",
-    "iranian-calendar-m2": "Ordibehesht",
-    "iranian-calendar-m3": "Khordad",
-    "iranian-calendar-m4": "Tir",
-    "iranian-calendar-m5": "Mordad",
-    "iranian-calendar-m6": "Shahrivar",
-    "iranian-calendar-m7": "Mehr",
-    "iranian-calendar-m8": "Aban",
-    "iranian-calendar-m9": "Azar",
-    "iranian-calendar-m10": "Dey",
-    "iranian-calendar-m11": "Bahman",
-    "iranian-calendar-m12": "Esfand",
-    "hijri-calendar-m1": "Muharram",
-    "hijri-calendar-m2": "Safar",
-    "hijri-calendar-m3": "Rabi' al-awwal",
-    "hijri-calendar-m4": "Rabi' al-thani",
-    "hijri-calendar-m5": "Jumada al-awwal",
-    "hijri-calendar-m6": "Jumada al-thani",
-    "hijri-calendar-m7": "Rajab",
-    "hijri-calendar-m8": "Sha'aban",
-    "hijri-calendar-m9": "Ramadan",
-    "hijri-calendar-m10": "Shawwal",
-    "hijri-calendar-m11": "Dhu al-Qi'dah",
-    "hijri-calendar-m12": "Dhu al-Hijjah",
-    "hebrew-calendar-m1": "Tishrei",
-    "hebrew-calendar-m2": "Cheshvan",
-    "hebrew-calendar-m3": "Kislev",
-    "hebrew-calendar-m4": "Tevet",
-    "hebrew-calendar-m5": "Shevat",
-    "hebrew-calendar-m6": "Adar",
-    "hebrew-calendar-m6a": "Adar I",
-    "hebrew-calendar-m6b": "Adar II",
-    "hebrew-calendar-m7": "Nisan",
-    "hebrew-calendar-m8": "Iyar",
-    "hebrew-calendar-m9": "Sivan",
-    "hebrew-calendar-m10": "Tamuz",
-    "hebrew-calendar-m11": "Av",
-    "hebrew-calendar-m12": "Elul",
-    "hebrew-calendar-m1-gen": "Tishrei",
-    "hebrew-calendar-m2-gen": "Cheshvan",
-    "hebrew-calendar-m3-gen": "Kislev",
-    "hebrew-calendar-m4-gen": "Tevet",
-    "hebrew-calendar-m5-gen": "Shevat",
-    "hebrew-calendar-m6-gen": "Adar",
-    "hebrew-calendar-m6a-gen": "Adar I",
-    "hebrew-calendar-m6b-gen": "Adar II",
-    "hebrew-calendar-m7-gen": "Nisan",
-    "hebrew-calendar-m8-gen": "Iyar",
-    "hebrew-calendar-m9-gen": "Sivan",
-    "hebrew-calendar-m10-gen": "Tamuz",
-    "hebrew-calendar-m11-gen": "Av",
-    "hebrew-calendar-m12-gen": "Elul",
-    "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-    "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
-    "timezone-utc": "UTC",
-    "unknown_extension_tag": "Unknown extension tag \"$1\"",
-    "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
-    "version": "Version",
-    "version-summary": "",
-    "version-extensions": "Installed extensions",
-    "version-specialpages": "Special pages",
-    "version-parserhooks": "Parser hooks",
-    "version-variables": "Variables",
-    "version-antispam": "Spam prevention",
-    "version-skins": "Skins",
-    "version-api": "API",
-    "version-other": "Other",
-    "version-mediahandlers": "Media handlers",
-    "version-hooks": "Hooks",
-    "version-parser-extensiontags": "Parser extension tags",
-    "version-parser-function-hooks": "Parser function hooks",
-    "version-hook-name": "Hook name",
-    "version-hook-subscribedby": "Subscribed by",
-    "version-version": "($1)",
-    "version-svn-revision": "r$1",
-    "version-license": "MediaWiki License",
-    "version-ext-license": "License",
-    "version-ext-colheader-name": "Extension",
-    "version-ext-colheader-version": "Version",
-    "version-ext-colheader-license": "License",
-    "version-ext-colheader-description": "Description",
-    "version-ext-colheader-credits": "Authors",
-    "version-license-title": "License for $1",
-    "version-license-not-found": "No detailed license information was found for this extension.",
-    "version-credits-title": "Credits for $1",
-    "version-credits-not-found": "No detailed credits information was found for this extension.",
-    "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
-    "version-poweredby-others": "others",
-    "version-poweredby-translators": "translatewiki.net translators",
-    "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
-    "version-license-info": "MediaWiki 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.\n\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
-    "version-software": "Installed software",
-    "version-software-product": "Product",
-    "version-software-version": "Version",
-    "version-db-mysql-url": "http://www.mysql.com/",
-    "version-db-mariadb-url": "http://mariadb.org/",
-    "version-db-percona-url": "http://www.percona.com/software/percona-server",
-    "version-db-postgres-url": "http://www.postgresql.org/",
-    "version-db-oracle-url": "http://www.oracle.com/database/",
-    "version-db-sqlite-url": "http://www.sqlite.org/",
-    "version-db-mssql-url": "http://www.microsoft.com/sql/",
-    "version-entrypoints": "Entry point URLs",
-    "version-entrypoints-header-entrypoint": "Entry point",
-    "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
-    "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
-    "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
-    "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
-    "redirect": "Redirect by file, user, page or revision ID",
-    "redirect-legend": "Redirect to a file or page",
-    "redirect-text": "",
-    "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
-    "redirect-submit": "Go",
-    "redirect-lookup": "Lookup:",
-    "redirect-value": "Value:",
-    "redirect-user": "User ID",
-    "redirect-page": "Page ID",
-    "redirect-revision": "Page revision",
-    "redirect-file": "File name",
-    "redirect-not-exists": "Value not found",
-    "fileduplicatesearch": "Search for duplicate files",
-    "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
-    "fileduplicatesearch-legend": "Search for a duplicate",
-    "fileduplicatesearch-filename": "Filename:",
-    "fileduplicatesearch-submit": "Search",
-    "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
-    "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
-    "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
-    "fileduplicatesearch-noresults": "No file named \"$1\" found.",
-    "specialpages": "Special pages",
-    "specialpages-summary": "",
-    "specialpages-note-top": "Legend",
-    "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
-    "specialpages-group-maintenance": "Maintenance reports",
-    "specialpages-group-other": "Other special pages",
-    "specialpages-group-login": "Login / create account",
-    "specialpages-group-changes": "Recent changes and logs",
-    "specialpages-group-media": "Media reports and uploads",
-    "specialpages-group-users": "Users and rights",
-    "specialpages-group-highuse": "High use pages",
-    "specialpages-group-pages": "Lists of pages",
-    "specialpages-group-pagetools": "Page tools",
-    "specialpages-group-wiki": "Data and tools",
-    "specialpages-group-redirects": "Redirecting special pages",
-    "specialpages-group-spam": "Spam tools",
-    "blankpage": "Blank page",
-    "intentionallyblankpage": "This page is intentionally left blank.",
-    "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
-    "tags": "Valid change tags",
-    "tags-summary": "",
-    "tag-filter": "[[Special:Tags|Tag]] filter:",
-    "tag-filter-submit": "Filter",
-    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
-    "tags-title": "Tags",
-    "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
-    "tags-tag": "Tag name",
-    "tags-display-header": "Appearance on change lists",
-    "tags-description-header": "Full description of meaning",
-    "tags-active-header": "Active?",
-    "tags-hitcount-header": "Tagged changes",
-    "tags-active-yes": "Yes",
-    "tags-active-no": "No",
-    "tags-edit": "edit",
-    "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
-    "comparepages": "Compare pages",
-    "comparepages-summary": "",
-    "compare-page1": "Page 1",
-    "compare-page2": "Page 2",
-    "compare-rev1": "Revision 1",
-    "compare-rev2": "Revision 2",
-    "compare-submit": "Compare",
-    "compare-invalid-title": "The title you specified is invalid.",
-    "compare-title-not-exists": "The title you specified does not exist.",
-    "compare-revision-not-exists": "The revision you specified does not exist.",
-    "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
-    "dberr-again": "Try waiting a few minutes and reloading.",
-    "dberr-info": "(Cannot contact the database server: $1)",
-    "dberr-info-hidden": "(Cannot contact the database server)",
-    "dberr-usegoogle": "You can try searching via Google in the meantime.",
-    "dberr-outofdate": "Note that their indexes of our content may be out of date.",
-    "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
-    "htmlform-invalid-input": "There are problems with some of your input.",
-    "htmlform-select-badoption": "The value you specified is not a valid option.",
-    "htmlform-int-invalid": "The value you specified is not an integer.",
-    "htmlform-float-invalid": "The value you specified is not a number.",
-    "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
-    "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
-    "htmlform-required": "This value is required.",
-    "htmlform-submit": "Submit",
-    "htmlform-reset": "Undo changes",
-    "htmlform-selectorother-other": "Other",
-    "htmlform-no": "No",
-    "htmlform-yes": "Yes",
-    "htmlform-chosen-placeholder": "Select an option",
+       "@metadata": {
+               "authors": []
+       },
+       "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
+       "tog-underline": "Link underlining:",
+       "tog-hideminor": "Hide minor edits in recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits in recent changes",
+       "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
+       "tog-usenewrc": "Group changes by page in recent changes and watchlist",
+       "tog-numberheadings": "Auto-number headings",
+       "tog-showtoolbar": "Show edit toolbar",
+       "tog-editondblclick": "Edit pages on double click",
+       "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
+       "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
+       "tog-watchdefault": "Add pages and files I edit to my watchlist",
+       "tog-watchmoves": "Add pages and files I move to my watchlist",
+       "tog-watchdeletion": "Add pages and files I delete 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-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page is changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": "Show the number of watching users",
+       "tog-oldsig": "Existing signature:",
+       "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
+       "tog-uselivepreview": "Use live preview (experimental)",
+       "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",
+       "tog-watchlisthideminor": "Hide minor edits from the watchlist",
+       "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
+       "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "Do not show page content below diffs",
+       "tog-showhiddencats": "Show hidden categories",
+       "tog-norollbackdiff": "Omit diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection when logged in",
+       "underline-always": "Always",
+       "underline-never": "Never",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "Edit area font style:",
+       "editfont-default": "Browser default",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "Sunday",
+       "monday": "Monday",
+       "tuesday": "Tuesday",
+       "wednesday": "Wednesday",
+       "thursday": "Thursday",
+       "friday": "Friday",
+       "saturday": "Saturday",
+       "sun": "Sun",
+       "mon": "Mon",
+       "tue": "Tue",
+       "wed": "Wed",
+       "thu": "Thu",
+       "fri": "Fri",
+       "sat": "Sat",
+       "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",
+       "january-gen": "January",
+       "february-gen": "February",
+       "march-gen": "March",
+       "april-gen": "April",
+       "may-gen": "May",
+       "june-gen": "June",
+       "july-gen": "July",
+       "august-gen": "August",
+       "september-gen": "September",
+       "october-gen": "October",
+       "november-gen": "November",
+       "december-gen": "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",
+       "january-date": "January $1",
+       "february-date": "February $1",
+       "march-date": "March $1",
+       "april-date": "April $1",
+       "may-date": "May $1",
+       "june-date": "June $1",
+       "july-date": "July $1",
+       "august-date": "August $1",
+       "september-date": "September $1",
+       "october-date": "October $1",
+       "november-date": "November $1",
+       "december-date": "December $1",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
+       "pagecategorieslink": "Special:Categories",
+       "category_header": "Pages in category \"$1\"",
+       "subcategories": "Subcategories",
+       "category-media-header": "Media in category \"$1\"",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "Hidden categories",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Indexed pages",
+       "noindex-category": "Noindexed pages",
+       "broken-file-category": "Pages with broken file links",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "about": "About",
+       "article": "Content page",
+       "newwindow": "(opens in new window)",
+       "cancel": "Cancel",
+       "moredotdotdot": "More...",
+       "morenotlisted": "This list is not complete.",
+       "mypage": "Page",
+       "mytalk": "Talk",
+       "anontalk": "Talk for this IP address",
+       "navigation": "Navigation",
+       "and": "&#32;and",
+       "qbfind": "Find",
+       "qbbrowse": "Browse",
+       "qbedit": "Edit",
+       "qbpageoptions": "This page",
+       "qbmyoptions": "My pages",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "sitetitle": "{{SITENAME}}",
+       "sitesubtitle": "",
+       "vector-action-addsection": "Add topic",
+       "vector-action-delete": "Delete",
+       "vector-action-move": "Move",
+       "vector-action-protect": "Protect",
+       "vector-action-undelete": "Undelete",
+       "vector-action-unprotect": "Change protection",
+       "vector-view-create": "Create",
+       "vector-view-edit": "Edit",
+       "vector-view-history": "View history",
+       "vector-view-view": "Read",
+       "vector-view-viewsource": "View source",
+       "actions": "Actions",
+       "namespaces": "Namespaces",
+       "variants": "Variants",
+       "navigation-heading": "Navigation menu",
+       "errorpagetitle": "Error",
+       "returnto": "Return to $1.",
+       "tagline": "From {{SITENAME}}",
+       "help": "Help",
+       "search": "Search",
+       "searchbutton": "Search",
+       "go": "Go",
+       "searcharticle": "Go",
+       "history": "Page history",
+       "history_short": "History",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "Printable version",
+       "permalink": "Permanent link",
+       "print": "Print",
+       "view": "View",
+       "view-foreign": "View on $1",
+       "edit": "Edit",
+       "edit-local": "Edit local description",
+       "create": "Create",
+       "create-local": "Add local description",
+       "editthispage": "Edit this page",
+       "create-this-page": "Create this page",
+       "delete": "Delete",
+       "deletethispage": "Delete this page",
+       "undeletethispage": "Undelete this page",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "Protect",
+       "protect_change": "change",
+       "protectthispage": "Protect this page",
+       "unprotect": "Change protection",
+       "unprotectthispage": "Change protection of this page",
+       "newpage": "New page",
+       "talkpage": "Discuss this page",
+       "talkpagelinktext": "Talk",
+       "specialpage": "Special page",
+       "personaltools": "Personal tools",
+       "postcomment": "New section",
+       "addsection": "+",
+       "articlepage": "View content page",
+       "talk": "Discussion",
+       "views": "Views",
+       "toolbox": "Tools",
+       "userpage": "View user page",
+       "projectpage": "View project page",
+       "imagepage": "View file page",
+       "mediawikipage": "View message page",
+       "templatepage": "View template page",
+       "viewhelppage": "View help page",
+       "categorypage": "View category page",
+       "viewtalkpage": "View discussion",
+       "otherlanguages": "In other languages",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "Redirect page",
+       "talkpageheader": "-",
+       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
+       "protectedpage": "Protected page",
+       "jumpto": "Jump to:",
+       "jumptonavigation": "navigation",
+       "jumptosearch": "search",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "Timeout waiting for the lock",
+       "pool-queuefull": "Pool queue is full",
+       "pool-errorunknown": "Unknown error",
+       "pool-servererror": "The pool counter service is not available ($1).",
+       "aboutsite": "About {{SITENAME}}",
+       "aboutpage": "Project:About",
+       "copyright": "Content is available under $1 unless otherwise noted.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Current events",
+       "currentevents-url": "Project:Current events",
+       "disclaimers": "Disclaimers",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "Editing help",
+       "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
+       "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
+       "mainpage": "Main Page",
+       "mainpage-description": "Main page",
+       "policy-url": "Project:Policy",
+       "portal": "Community portal",
+       "portal-url": "Project:Community portal",
+       "privacy": "Privacy policy",
+       "privacypage": "Project:Privacy policy",
+       "badaccess": "Permission error",
+       "badaccess-group0": "You are not allowed to execute the action you have requested.",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "Version $1 of MediaWiki required",
+       "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
+       "ok": "OK",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
+       "retrievedfrom": "Retrieved from \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "You have new messages on $1",
+       "newtalkseparator": ",&#32;",
+       "editsection": "edit",
+       "editold": "edit",
+       "viewsourceold": "view source",
+       "editlink": "edit",
+       "viewsourcelink": "view source",
+       "editsectionhint": "Edit section: $1",
+       "toc": "Contents",
+       "showtoc": "show",
+       "hidetoc": "hide",
+       "collapsible-collapse": "Collapse",
+       "collapsible-expand": "Expand",
+       "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.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 Atom feed",
+       "page-rss-feed": "\"$1\" RSS feed",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
+       "sitenotice": "-",
+       "anonnotice": "-",
+       "newsectionheaderdefaultlevel": "== $1 ==",
+       "red-link-title": "$1 (page does not exist)",
+       "sort-descending": "Sort descending",
+       "sort-ascending": "Sort ascending",
+       "nstab-main": "Page",
+       "nstab-user": "User page",
+       "nstab-media": "Media page",
+       "nstab-special": "Special page",
+       "nstab-project": "Project page",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Message",
+       "nstab-template": "Template",
+       "nstab-help": "Help page",
+       "nstab-category": "Category",
+       "mainpage-nstab": "",
+       "nosuchaction": "No such action",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "No such special page",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
+       "databaseerror": "Database error",
+       "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
+       "databaseerror-textcl": "A database query error has occurred.",
+       "databaseerror-query": "Query: $1",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "Error: $1",
+       "laggedslavemode": "<strong>Warning:</strong> 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.\n\nThe administrator who locked it offered this explanation: $1",
+       "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
+       "missingarticle-rev": "(revision#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
+       "internalerror": "Internal error",
+       "internalerror_info": "Internal error: $1",
+       "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
+       "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
+       "filedeleteerror": "Could not delete file \"$1\".",
+       "directorycreateerror": "Could not create directory \"$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": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
+       "cannotdelete-title": "Cannot delete page \"$1\"",
+       "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
+       "no-null-revision": "Could not create new null revision for page \"$1\"",
+       "badtitle": "Bad title",
+       "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
+       "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
+       "viewsource": "View source",
+       "viewsource-title": "View source for $1",
+       "actionthrottled": "Action throttled",
+       "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
+       "protectedpagetext": "This page has been protected to prevent editing or other actions.",
+       "viewsourcetext": "You can view and copy the source of this page:",
+       "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
+       "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
+       "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
+       "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+       "mycustomcssprotected": "You do not have permission to edit this CSS page.",
+       "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
+       "myprivateinfoprotected": "You do not have permission to edit your private information.",
+       "mypreferencesprotected": "You do not have permission to edit your preferences.",
+       "ns-specialprotected": "Special pages cannot be edited.",
+       "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
+       "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
+       "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
+       "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
+       "exception-nologin": "Not logged in",
+       "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
+       "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
+       "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
+       "virus-scanfailed": "scan failed (code $1)",
+       "virus-unknownscanner": "unknown antivirus:",
+       "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
+       "welcomeuser": "Welcome, $1!",
+       "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
+       "yourname": "Username:",
+       "userlogin-yourname": "Username",
+       "userlogin-yourname-ph": "Enter your username",
+       "createacct-another-username-ph": "Enter the username",
+       "createacct-helpusername": "",
+       "yourpassword": "Password:",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Enter your password",
+       "createacct-yourpassword-ph": "Enter a password",
+       "yourpasswordagain": "Retype password:",
+       "createacct-yourpasswordagain": "Confirm password",
+       "createacct-yourpasswordagain-ph": "Enter password again",
+       "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-remembermypassword": "Keep me logged in",
+       "userlogin-signwithsecure": "Use secure connection",
+       "yourdomainname": "Your domain:",
+       "password-change-forbidden": "You cannot change passwords on this wiki.",
+       "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
+       "login": "Log in",
+       "nav-login-createaccount": "Log in / create account",
+       "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
+       "userlogin": "Log in / create account",
+       "userloginnocreate": "Log in",
+       "logout": "Log out",
+       "userlogout": "Log out",
+       "userlogout-summary": "",
+       "notloggedin": "Not logged in",
+       "userlogin-noaccount": "Don't have an account?",
+       "userlogin-joinproject": "Join {{SITENAME}}",
+       "nologin": "Don't have an account? $1.",
+       "nologinlink": "Create an account",
+       "createaccount": "Create account",
+       "gotaccount": "Already have an account? $1.",
+       "gotaccountlink": "Log in",
+       "userlogin-resetlink": "Forgotten your login details?",
+       "userlogin-resetpassword-link": "Forgot your password?",
+       "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
+       "userlogin-helplink2": "Help with logging in",
+       "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
+       "userlogin-createanother": "Create another account",
+       "createacct-emailrequired": "Email address",
+       "createacct-emailoptional": "Email address (optional)",
+       "createacct-email-ph": "Enter your email address",
+       "createacct-another-email-ph": "Enter email address",
+       "createaccountmail": "Use a temporary random password and send it to the specified email address",
+       "createacct-realname": "Real name (optional)",
+       "createaccountreason": "Reason:",
+       "createacct-reason": "Reason",
+       "createacct-reason-ph": "Why you are creating another account",
+       "createacct-captcha": "Security check",
+       "createacct-imgcaptcha-help": "",
+       "createacct-imgcaptcha-ph": "Enter the text you see above",
+       "createacct-submit": "Create your account",
+       "createacct-another-submit": "Create another account",
+       "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
+       "createacct-benefit-icon1": "icon-edits",
+       "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
+       "createacct-benefit-icon2": "icon-pages",
+       "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
+       "createacct-benefit-icon3": "icon-contributors",
+       "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
+       "badretype": "The passwords you entered do not match.",
+       "userexists": "Username entered already in use.\nPlease choose a different name.",
+       "loginerror": "Login error",
+       "createacct-error": "Account creation error",
+       "createaccounterror": "Could not create account: $1",
+       "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
+       "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
+       "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "noname": "You have not specified a valid username.",
+       "loginsuccesstitle": "Login successful",
+       "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
+       "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
+       "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
+       "nouserspecified": "You have to specify a username.",
+       "login-userblocked": "This user is blocked. Login not allowed.",
+       "wrongpassword": "Incorrect password entered.\nPlease try again.",
+       "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
+       "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
+       "password-name-match": "Your password must be different from your username.",
+       "password-login-forbidden": "The use of this username and password has been forbidden.",
+       "mailmypassword": "Reset password",
+       "passwordremindertitle": "New temporary password for {{SITENAME}}",
+       "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
+       "noemail": "There is no email address recorded for user \"$1\".",
+       "noemailcreate": "You need to provide a valid email address.",
+       "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
+       "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
+       "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
+       "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
+       "loginstart": "",
+       "loginend": "",
+       "loginend-https": "",
+       "signupstart": "{{int:loginstart}}",
+       "signupend": "{{int:loginend}}",
+       "signupend-https": "",
+       "mailerror": "Error sending mail: $1",
+       "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
+       "emailauthenticated": "Your email address was confirmed on $2 at $3.",
+       "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
+       "noemailprefs": "Specify an email address in your preferences for these features to work.",
+       "emailconfirmlink": "Confirm your email address",
+       "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
+       "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
+       "emaildisabled": "This site cannot send emails.",
+       "emailsender": "{{SITENAME}}",
+       "accountcreated": "Account created",
+       "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
+       "createaccount-title": "Account creation for {{SITENAME}}",
+       "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
+       "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
+       "login-abort-generic": "Your login was unsuccessful - Aborted",
+       "loginlanguagelabel": "Language: $1",
+       "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
+       "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.",
+       "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
+       "pt-login": "Log in",
+       "pt-login-button": "Log in",
+       "pt-createaccount": "Create account",
+       "pt-userlogout": "Log out",
+       "pear-mail-error": "$1",
+       "php-mail-error": "$1",
+       "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
+       "user-mail-no-addy": "Tried to send email without an email address.",
+       "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
+       "changepassword": "Change password",
+       "changepassword-summary": "",
+       "resetpass_announce": "To finish logging in, you must set a new password.",
+       "resetpass_text": "<!-- Add text here -->",
+       "resetpass_header": "Change account password",
+       "oldpassword": "Old password:",
+       "newpassword": "New password:",
+       "retypenew": "Retype new password:",
+       "resetpass_submit": "Set password and log in",
+       "changepassword-success": "Your password has been changed successfully!",
+       "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
+       "resetpass_forbidden": "Passwords cannot be changed",
+       "resetpass-no-info": "You must be logged in to access this page directly.",
+       "resetpass-submit-loggedin": "Change password",
+       "resetpass-submit-cancel": "Cancel",
+       "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
+       "resetpass-recycled": "Please reset your password to something other than your current password.",
+       "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
+       "resetpass-temp-password": "Temporary password:",
+       "resetpass-abort-generic": "Password change has been aborted by an extension.",
+       "resetpass-expired": "Your password has expired. Please set a new password to log in.",
+       "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "passwordreset": "Reset password",
+       "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
+       "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
+       "passwordreset-legend": "Reset password",
+       "passwordreset-disabled": "Password resets have been disabled on this wiki.",
+       "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
+       "passwordreset-username": "Username:",
+       "passwordreset-domain": "Domain:",
+       "passwordreset-capture": "View the resulting email?",
+       "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
+       "passwordreset-email": "Email address:",
+       "passwordreset-emailtitle": "Account details on {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
+       "passwordreset-emailsent": "A password reset email has been sent.",
+       "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
+       "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
+       "changeemail": "Change email address",
+       "changeemail-summary": "",
+       "changeemail-header": "Change account email address",
+       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
+       "changeemail-no-info": "You must be logged in to access this page directly.",
+       "changeemail-oldemail": "Current email address:",
+       "changeemail-newemail": "New email address:",
+       "changeemail-none": "(none)",
+       "changeemail-password": "Your {{SITENAME}} password:",
+       "changeemail-submit": "Change email",
+       "changeemail-cancel": "Cancel",
+       "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
+       "resettokens": "Reset tokens",
+       "resettokens-summary": "",
+       "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
+       "resettokens-no-tokens": "There are no tokens to reset.",
+       "resettokens-legend": "Reset tokens",
+       "resettokens-tokens": "Tokens:",
+       "resettokens-token-label": "$1 (current value: $2)",
+       "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
+       "resettokens-done": "Tokens reset.",
+       "resettokens-resetbutton": "Reset selected tokens",
+       "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",
+       "nowiki_sample": "Insert non-formatted text here",
+       "nowiki_tip": "Ignore wiki formatting",
+       "image_sample": "Example.jpg",
+       "image_tip": "Embedded file",
+       "media_sample": "Example.ogg",
+       "media_tip": "File link",
+       "sig_tip": "Your signature with timestamp",
+       "hr_tip": "Horizontal line (use sparingly)",
+       "summary": "Summary:",
+       "subject": "Subject/headline:",
+       "minoredit": "This is a minor edit",
+       "watchthis": "Watch this page",
+       "savearticle": "Save page",
+       "preview": "Preview",
+       "showpreview": "Show preview",
+       "showdiff": "Show changes",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
+       "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
+       "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "missingcommenttext": "Please enter a comment below.",
+       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "summary-preview": "Summary preview:",
+       "subject-preview": "Subject/headline preview:",
+       "blockedtitle": "User is blocked",
+       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "blockednoreason": "no reason given",
+       "whitelistedittext": "Please $1 to edit pages.",
+       "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
+       "nosuchsectiontitle": "Cannot find section",
+       "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
+       "loginreqtitle": "Login required",
+       "loginreqlink": "log in",
+       "loginreqpagetext": "Please $1 to view other pages.",
+       "accmailtitle": "Password sent",
+       "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
+       "newarticle": "(New)",
+       "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
+       "newarticletextanon": "{{int:newarticletext|$1}}",
+       "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
+       "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
+       "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
+       "noarticletextanon": "{{int:noarticletext}}",
+       "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
+       "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
+       "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
+       "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
+       "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
+       "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
+       "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
+       "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
+       "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
+       "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
+       "updated": "(Updated)",
+       "note": "<strong>Note:</strong>",
+       "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
+       "continue-editing": "Go to editing area",
+       "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
+       "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
+       "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
+       "editing": "Editing $1",
+       "creating": "Creating $1",
+       "editingsection": "Editing $1 (section)",
+       "editingcomment": "Editing $1 (new section)",
+       "editconflict": "Edit conflict: $1",
+       "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
+       "yourtext": "Your text",
+       "storedversion": "Stored revision",
+       "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
+       "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
+       "yourdiff": "Differences",
+       "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<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.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
+       "editpage-head-copy-warn": "-",
+       "editpage-tos-summary": "-",
+       "longpage-hint": "-",
+       "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
+       "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
+       "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
+       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+       "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
+       "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
+       "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
+       "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
+       "template-protected": "(protected)",
+       "template-semiprotected": "(semi-protected)",
+       "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
+       "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
+       "edittools-upload": "-",
+       "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
+       "nocreate-loggedin": "You do not have permission to create new pages.",
+       "sectioneditnotsupported-title": "Section editing not supported",
+       "sectioneditnotsupported-text": "Section editing is not supported in this page.",
+       "permissionserrors": "Permission error",
+       "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
+       "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
+       "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
+       "log-fulllog": "View full log",
+       "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
+       "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
+       "edit-conflict": "Edit conflict.",
+       "edit-no-change": "Your edit was ignored because no change was made to the text.",
+       "postedit-confirmation-created": "The page has been created.",
+       "postedit-confirmation-restored": "The page has been restored.",
+       "postedit-confirmation-saved": "Your edit was saved.",
+       "edit-already-exists": "Could not create a new page.\nIt already exists.",
+       "addsection-preload": "",
+       "addsection-editintro": "",
+       "defaultmessagetext": "Default message text",
+       "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
+       "invalid-content-data": "Invalid content data",
+       "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
+       "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
+       "editpage-notsupportedcontentformat-title": "Content format not supported",
+       "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
+       "content-model-wikitext": "wikitext",
+       "content-model-text": "plain text",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
+       "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
+       "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
+       "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
+       "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
+       "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
+       "post-expand-template-argument-category": "Pages containing omitted template arguments",
+       "parser-template-loop-warning": "Template loop detected: [[$1]]",
+       "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
+       "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
+       "node-count-exceeded-category": "Pages where node-count is exceeded",
+       "node-count-exceeded-category-desc": "A category for pages where the node-count is exceeded.",
+       "node-count-exceeded-warning": "Page exceeded the node-count",
+       "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
+       "expansion-depth-exceeded-category-desc": "This is a category for pages where the expansion depth is exceeded.",
+       "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
+       "parser-unstrip-loop-warning": "Unstrip loop detected",
+       "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
+       "converter-manual-rule-error": "Error detected in manual language conversion rule",
+       "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
+       "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
+       "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
+       "undo-nochange": "The edit appears to have already been undone.",
+       "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
+       "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
+       "cantcreateaccounttitle": "Cannot create account",
+       "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
+       "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
+       "createaccount-hook-aborted": "$1",
+       "viewpagelogs": "View logs for this page",
+       "nohistory": "There is no edit history for this page.",
+       "currentrev": "Latest revision",
+       "currentrev-asof": "Latest revision as of $1",
+       "revisionasof": "Revision as of $1",
+       "revision-info": "Revision as of $1 by $2",
+       "revision-info-current": "-",
+       "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
+       "previousrevision": "← Older revision",
+       "nextrevision": "Newer revision →",
+       "currentrevisionlink": "Latest revision",
+       "cur": "cur",
+       "next": "next",
+       "last": "prev",
+       "page_first": "first",
+       "page_last": "last",
+       "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
+       "history-fieldset-title": "Browse history",
+       "history-show-deleted": "Deleted only",
+       "history_copyright": "-",
+       "histfirst": "oldest",
+       "histlast": "newest",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historyempty": "(empty)",
+       "history-feed-title": "Revision history",
+       "history-feed-description": "Revision history for this page on the wiki",
+       "history-feed-item-nocomment": "$1 at $2",
+       "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
+       "rev-deleted-comment": "(edit summary removed)",
+       "rev-deleted-user": "(username removed)",
+       "rev-deleted-event": "(log action removed)",
+       "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
+       "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
+       "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-delundel": "change visibility",
+       "rev-showdeleted": "show",
+       "revisiondelete": "Delete/undelete revisions",
+       "revdelete-nooldid-title": "Invalid target revision",
+       "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
+       "revdelete-no-file": "The file specified does not exist.",
+       "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "revdelete-show-file-submit": "Yes",
+       "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
+       "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
+       "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
+       "revdelete-confirm": "Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
+       "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
+       "revdelete-legend": "Set visibility restrictions",
+       "revdelete-hide-text": "Revision text",
+       "revdelete-hide-image": "Hide file content",
+       "revdelete-hide-name": "Hide action and target",
+       "revdelete-hide-comment": "Edit summary",
+       "revdelete-hide-user": "Editor's username/IP address",
+       "revdelete-hide-restricted": "Suppress data from administrators as well as others",
+       "revdelete-radio-same": "(do not change)",
+       "revdelete-radio-set": "Hidden",
+       "revdelete-radio-unset": "Visible",
+       "revdelete-suppress": "Suppress data from administrators as well as others",
+       "revdelete-unsuppress": "Remove restrictions on restored revisions",
+       "revdelete-log": "Reason:",
+       "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
+       "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
+       "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
+       "logdelete-success": "<strong>Log visibility successfully set.</strong>",
+       "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
+       "revdel-restore": "change visibility",
+       "pagehist": "Page history",
+       "deletedhist": "Deleted history",
+       "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
+       "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
+       "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
+       "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease check the logs.",
+       "revdelete-only-restricted": "Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.",
+       "revdelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
+       "revdelete-otherreason": "Other/additional reason:",
+       "revdelete-reasonotherlist": "Other reason",
+       "revdelete-edit-reasonlist": "Edit delete reasons",
+       "revdelete-offender": "Revision author:",
+       "suppressionlog": "Suppression log",
+       "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "mergehistory": "Merge page histories",
+       "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
+       "mergehistory-box": "Merge revisions of two pages:",
+       "mergehistory-from": "Source page:",
+       "mergehistory-into": "Destination page:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
+       "mergehistory-go": "Show mergeable edits",
+       "mergehistory-submit": "Merge revisions",
+       "mergehistory-empty": "No revisions can be merged.",
+       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
+       "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+       "mergehistory-no-source": "Source page $1 does not exist.",
+       "mergehistory-no-destination": "Destination page $1 does not exist.",
+       "mergehistory-invalid-source": "Source page must be a valid title.",
+       "mergehistory-invalid-destination": "Destination page must be a valid title.",
+       "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
+       "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
+       "mergehistory-same-destination": "Source and destination pages cannot be the same",
+       "mergehistory-reason": "Reason:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
+       "mergelog": "Merge log",
+       "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
+       "revertmerge": "Unmerge",
+       "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
+       "history-title": "Revision history of \"$1\"",
+       "difference-title": "Difference between revisions of \"$1\"",
+       "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
+       "difference-multipage": "(Difference between pages)",
+       "lineno": "Line $1:",
+       "compareselectedversions": "Compare selected revisions",
+       "showhideselectedversions": "Change visibility of selected revisions",
+       "editundo": "undo",
+       "diff-empty": "(No difference)",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
+       "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
+       "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "search-summary": "",
+       "searchresults": "Search results",
+       "searchresults-title": "Search results for \"$1\"",
+       "toomanymatches": "Too many matches were returned, please try a different query",
+       "titlematches": "Page title matches",
+       "textmatches": "Page text matches",
+       "notextmatches": "No page text matches",
+       "prevn": "previous {{PLURAL:$1|$1}}",
+       "nextn": "next {{PLURAL:$1|$1}}",
+       "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
+       "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchmenu-new-nocreate": "",
+       "searchprofile-articles": "Content pages",
+       "searchprofile-project": "Help and Project pages",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Everything",
+       "searchprofile-advanced": "Advanced",
+       "searchprofile-articles-tooltip": "Search in $1",
+       "searchprofile-project-tooltip": "Search in $1",
+       "searchprofile-images-tooltip": "Search for files",
+       "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
+       "searchprofile-advanced-tooltip": "Search in custom namespaces",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
+       "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
+       "search-result-score": "Relevance: $1%",
+       "search-redirect": "(redirect $1)",
+       "search-section": "(section $1)",
+       "search-file-match": "(matches file content)",
+       "search-suggest": "Did you mean: $1",
+       "search-interwiki-caption": "Sister projects",
+       "search-interwiki-default": "Results from $1:",
+       "search-interwiki-custom": "",
+       "search-interwiki-more": "(more)",
+       "search-relatedarticle": "Related",
+       "searcheverything-enable": "Search in all namespaces",
+       "searchrelated": "related",
+       "searchall": "all",
+       "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
+       "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
+       "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
+       "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
+       "search-nonefound": "There were no results matching the query.",
+       "powersearch-legend": "Advanced search",
+       "powersearch-ns": "Search in namespaces:",
+       "powersearch-togglelabel": "Check:",
+       "powersearch-toggleall": "All",
+       "powersearch-togglenone": "None",
+       "search-external": "External search",
+       "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
+       "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
+       "search-error": "An error has occurred while searching: $1",
+       "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
+       "preferences": "Preferences",
+       "preferences-summary": "",
+       "mypreferences": "Preferences",
+       "prefs-edits": "Number of edits:",
+       "prefsnologintext2": "Please $1 to change your preferences.",
+       "prefs-skin": "Skin",
+       "skin-preview": "Preview",
+       "datedefault": "No preference",
+       "prefs-labs": "Labs features",
+       "prefs-user-pages": "User pages",
+       "prefs-personal": "User profile",
+       "prefs-rc": "Recent changes",
+       "prefs-watchlist": "Watchlist",
+       "prefs-watchlist-days": "Days to show in watchlist:",
+       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
+       "prefs-watchlist-edits-max": "Maximum number: 1000",
+       "prefs-watchlist-token": "Watchlist token:",
+       "prefs-misc": "Misc",
+       "prefs-resetpass": "Change password",
+       "prefs-changeemail": "Change email address",
+       "prefs-setemail": "Set an email address",
+       "prefs-email": "Email options",
+       "prefs-rendering": "Appearance",
+       "saveprefs": "Save",
+       "restoreprefs": "Restore all default settings (in all sections)",
+       "prefs-editing": "Editing",
+       "rows": "Rows:",
+       "columns": "Columns:",
+       "searchresultshead": "Search",
+       "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
+       "stub-threshold-disabled": "Disabled",
+       "recentchangesdays": "Days to show in recent changes:",
+       "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "recentchangescount": "Number of edits to show by default:",
+       "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
+       "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
+       "savedprefs": "Your preferences have been saved.",
+       "timezonelegend": "Time zone:",
+       "localtime": "Local time:",
+       "timezoneuseserverdefault": "Use wiki default ($1)",
+       "timezoneuseoffset": "Other (specify offset)",
+       "servertime": "Server time:",
+       "guesstimezone": "Fill in from browser",
+       "timezoneregion-africa": "Africa",
+       "timezoneregion-america": "America",
+       "timezoneregion-antarctica": "Antarctica",
+       "timezoneregion-arctic": "Arctic",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Atlantic Ocean",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europe",
+       "timezoneregion-indian": "Indian Ocean",
+       "timezoneregion-pacific": "Pacific Ocean",
+       "allowemail": "Enable email from other users",
+       "prefs-searchoptions": "Search",
+       "prefs-namespaces": "Namespaces",
+       "defaultns": "Otherwise search in these namespaces:",
+       "default": "default",
+       "prefs-files": "Files",
+       "prefs-custom-css": "Custom CSS",
+       "prefs-custom-js": "Custom JavaScript",
+       "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
+       "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
+       "prefs-emailconfirm-label": "Email confirmation:",
+       "youremail": "Email:",
+       "username": "{{GENDER:$1|Username}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
+       "prefs-memberingroups-type": "$1",
+       "prefs-registration": "Registration time:",
+       "prefs-registration-date-time": "$1",
+       "yourrealname": "Real name:",
+       "yourlanguage": "Language:",
+       "yourvariant": "Content language variant:",
+       "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
+       "yournick": "New signature:",
+       "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
+       "badsig": "Invalid raw signature.\nCheck HTML tags.",
+       "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
+       "yourgender": "How do you prefer to be described?",
+       "gender-unknown": "I prefer not to say",
+       "gender-male": "He edits wiki pages",
+       "gender-female": "She edits wiki pages",
+       "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
+       "email": "Email",
+       "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
+       "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
+       "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
+       "prefs-help-email-required": "Email address is required.",
+       "prefs-info": "Basic information",
+       "prefs-i18n": "Internationalisation",
+       "prefs-signature": "Signature",
+       "prefs-dateformat": "Date format",
+       "prefs-timeoffset": "Time offset",
+       "prefs-advancedediting": "General options",
+       "prefs-editor": "Editor",
+       "prefs-preview": "Preview",
+       "prefs-advancedrc": "Advanced options",
+       "prefs-advancedrendering": "Advanced options",
+       "prefs-advancedsearchoptions": "Advanced options",
+       "prefs-advancedwatchlist": "Advanced options",
+       "prefs-displayrc": "Display options",
+       "prefs-displaywatchlist": "Display options",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Diffs",
+       "prefs-help-prefershttps": "This preference will take effect on your next login.",
+       "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
+       "email-address-validity-valid": "Email address appears valid",
+       "email-address-validity-invalid": "Enter a valid email address",
+       "userrights": "User rights management",
+       "userrights-summary": "",
+       "userrights-lookup-user": "Manage user groups",
+       "userrights-user-editname": "Enter a username:",
+       "editusergroup": "Edit user groups",
+       "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edit user groups",
+       "saveusergroups": "Save user groups",
+       "userrights-groupsmember": "Member of:",
+       "userrights-groupsmember-auto": "Implicit member of:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
+       "userrights-reason": "Reason:",
+       "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
+       "userrights-nodatabase": "Database $1 does not exist or is not local.",
+       "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
+       "userrights-notallowed": "You do not have permission to add or remove user rights.",
+       "userrights-changeable-col": "Groups you can change",
+       "userrights-unchangeable-col": "Groups you cannot change",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
+       "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
+       "group": "Group:",
+       "group-user": "Users",
+       "group-autoconfirmed": "Autoconfirmed users",
+       "group-bot": "Bots",
+       "group-sysop": "Administrators",
+       "group-bureaucrat": "Bureaucrats",
+       "group-suppress": "Oversights",
+       "group-all": "(all)",
+       "group-user-member": "{{GENDER:$1|user}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
+       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "grouppage-user": "{{ns:project}}:Users",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
+       "grouppage-bot": "{{ns:project}}:Bots",
+       "grouppage-sysop": "{{ns:project}}:Administrators",
+       "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
+       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "right-read": "Read pages",
+       "right-edit": "Edit pages",
+       "right-createpage": "Create pages (which are not discussion pages)",
+       "right-createtalk": "Create discussion pages",
+       "right-createaccount": "Create new user accounts",
+       "right-minoredit": "Mark edits as minor",
+       "right-move": "Move pages",
+       "right-move-subpages": "Move pages with their subpages",
+       "right-move-rootuserpages": "Move root user pages",
+       "right-move-categorypages": "Move category pages",
+       "right-movefile": "Move files",
+       "right-suppressredirect": "Not create redirects from source pages when moving pages",
+       "right-upload": "Upload files",
+       "right-reupload": "Overwrite existing files",
+       "right-reupload-own": "Overwrite existing files uploaded by oneself",
+       "right-reupload-shared": "Override files on the shared media repository locally",
+       "right-upload_by_url": "Upload files from a URL",
+       "right-purge": "Purge the site cache for a page without confirmation",
+       "right-autoconfirmed": "Not be affected by IP-based rate limits",
+       "right-bot": "Be treated as an automated process",
+       "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
+       "right-apihighlimits": "Use higher limits in API queries",
+       "right-writeapi": "Use of the write API",
+       "right-delete": "Delete pages",
+       "right-bigdelete": "Delete pages with large histories",
+       "right-deletelogentry": "Delete and undelete specific log entries",
+       "right-deleterevision": "Delete and undelete specific revisions of pages",
+       "right-deletedhistory": "View deleted history entries, without their associated text",
+       "right-deletedtext": "View deleted text and changes between deleted revisions",
+       "right-browsearchive": "Search deleted pages",
+       "right-undelete": "Undelete a page",
+       "right-suppressrevision": "Review and restore revisions hidden from administrators",
+       "right-suppressionlog": "View private logs",
+       "right-block": "Block other users from editing",
+       "right-blockemail": "Block a user from sending email",
+       "right-hideuser": "Block a username, hiding it from the public",
+       "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
+       "right-proxyunbannable": "Bypass automatic blocks of proxies",
+       "right-unblockself": "Unblock oneself",
+       "right-protect": "Change protection levels and edit cascade-protected pages",
+       "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Edit the user interface",
+       "right-editusercssjs": "Edit other users' CSS and JavaScript files",
+       "right-editusercss": "Edit other users' CSS files",
+       "right-edituserjs": "Edit other users' JavaScript files",
+       "right-editmyusercss": "Edit your own user CSS files",
+       "right-editmyuserjs": "Edit your own user JavaScript files",
+       "right-viewmywatchlist": "View your own watchlist",
+       "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
+       "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
+       "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
+       "right-editmyoptions": "Edit your own preferences",
+       "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
+       "right-markbotedits": "Mark rolled-back edits as bot edits",
+       "right-noratelimit": "Not be affected by rate limits",
+       "right-import": "Import pages from other wikis",
+       "right-importupload": "Import pages from a file upload",
+       "right-patrol": "Mark others' edits as patrolled",
+       "right-autopatrol": "Have one's own edits automatically marked as patrolled",
+       "right-patrolmarks": "View recent changes patrol marks",
+       "right-unwatchedpages": "View a list of unwatched pages",
+       "right-mergehistory": "Merge the history of pages",
+       "right-userrights": "Edit all user rights",
+       "right-userrights-interwiki": "Edit user rights of users on other wikis",
+       "right-siteadmin": "Lock and unlock the database",
+       "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
+       "right-sendemail": "Send email to other users",
+       "right-passwordreset": "View password reset emails",
+       "newuserlogpage": "User creation log",
+       "newuserlogpagetext": "This is a log of user creations.",
+       "rightslog": "User rights log",
+       "rightslogtext": "This is a log of changes to user rights.",
+       "action-read": "read this page",
+       "action-edit": "edit this page",
+       "action-createpage": "create pages",
+       "action-createtalk": "create discussion pages",
+       "action-createaccount": "create this user account",
+       "action-history": "view the history of this page",
+       "action-minoredit": "mark this edit as minor",
+       "action-move": "move this page",
+       "action-move-subpages": "move this page, and its subpages",
+       "action-move-rootuserpages": "move root user pages",
+       "action-move-categorypages": "move category pages",
+       "action-movefile": "move this file",
+       "action-upload": "upload this file",
+       "action-reupload": "overwrite this existing file",
+       "action-reupload-shared": "override this file on a shared repository",
+       "action-upload_by_url": "upload this file from a URL",
+       "action-writeapi": "use the write API",
+       "action-delete": "delete this page",
+       "action-deleterevision": "delete this revision",
+       "action-deletedhistory": "view this page's deleted history",
+       "action-browsearchive": "search deleted pages",
+       "action-undelete": "undelete this page",
+       "action-suppressrevision": "review and restore this hidden revision",
+       "action-suppressionlog": "view this private log",
+       "action-block": "block this user from editing",
+       "action-protect": "change protection levels for this page",
+       "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
+       "action-import": "import pages from another wiki",
+       "action-importupload": "import pages from a file upload",
+       "action-patrol": "mark others' edits as patrolled",
+       "action-autopatrol": "have your edit marked as patrolled",
+       "action-unwatchedpages": "view the list of unwatched pages",
+       "action-mergehistory": "merge the history of this page",
+       "action-userrights": "edit all user rights",
+       "action-userrights-interwiki": "edit user rights of users on other wikis",
+       "action-siteadmin": "lock or unlock the database",
+       "action-sendemail": "send emails",
+       "action-editmywatchlist": "edit your watchlist",
+       "action-viewmywatchlist": "view your watchlist",
+       "action-viewmyprivateinfo": "view your private information",
+       "action-editmyprivateinfo": "edit your private information",
+       "nchanges": "$1 {{PLURAL:$1|change|changes}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
+       "enhancedrc-history": "history",
+       "recentchanges": "Recent changes",
+       "recentchanges-url": "Special:RecentChanges",
+       "recentchanges-legend": "Recent changes options",
+       "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
+       "recentchangestext": "-",
+       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
+       "recentchanges-label-newpage": "This edit created a new page",
+       "recentchanges-label-minor": "This is a minor edit",
+       "recentchanges-label-bot": "This edit was performed by a bot",
+       "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
+       "recentchanges-label-plusminus": "The page size changed by this number of bytes",
+       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
+       "rclistfrom": "Show new changes starting from $2, $3",
+       "rcshowhideminor": "$1 minor edits",
+       "rcshowhideminor-show": "Show",
+       "rcshowhideminor-hide": "Hide",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Show",
+       "rcshowhidebots-hide": "Hide",
+       "rcshowhideliu": "$1 registered users",
+       "rcshowhideliu-show": "Show",
+       "rcshowhideliu-hide": "Hide",
+       "rcshowhideanons": "$1 anonymous users",
+       "rcshowhideanons-show": "Show",
+       "rcshowhideanons-hide": "Hide",
+       "rcshowhidepatr": "$1 patrolled edits",
+       "rcshowhidepatr-show": "Show",
+       "rcshowhidepatr-hide": "Hide",
+       "rcshowhidemine": "$1 my edits",
+       "rcshowhidemine-show": "Show",
+       "rcshowhidemine-hide": "Hide",
+       "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",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_RCview": "[$1]",
+       "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
+       "rc_categories": "Limit to categories (separate with \"|\")",
+       "rc_categories_any": "Any",
+       "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
+       "newsectionsummary": "/* $1 */ new section",
+       "rc-enhanced-expand": "Show details",
+       "rc-enhanced-hide": "Hide details",
+       "rc-old-title": "originally created as \"$1\"",
+       "recentchangeslinked": "Related changes",
+       "recentchangeslinked-feed": "Related changes",
+       "recentchangeslinked-toolbox": "Related changes",
+       "recentchangeslinked-title": "Changes related to \"$1\"",
+       "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+       "recentchangeslinked-page": "Page name:",
+       "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
+       "upload": "Upload file",
+       "uploadbtn": "Upload file",
+       "reuploaddesc": "Cancel upload and return to the upload form",
+       "upload-tryagain": "Submit modified file description",
+       "uploadnologin": "Not logged in",
+       "uploadnologintext": "Please $1 to upload files.",
+       "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
+       "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
+       "uploaderror": "Upload error",
+       "upload-summary": "",
+       "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
+       "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
+       "upload-permitted": "Permitted file types: $1.",
+       "upload-preferred": "Preferred file types: $1.",
+       "upload-prohibited": "Prohibited file types: $1.",
+       "uploadfooter": "-",
+       "upload-default-description": "-",
+       "uploadlogpage": "Upload log",
+       "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
+       "filename": "Filename",
+       "filedesc": "Summary",
+       "fileuploadsummary": "Summary:",
+       "filereuploadsummary": "File changes:",
+       "filestatus": "Copyright status:",
+       "filesource": "Source:",
+       "ignorewarning": "Ignore warning and save file anyway",
+       "ignorewarnings": "Ignore any warnings",
+       "minlength1": "Filenames must be at least one letter.",
+       "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
+       "filename-toolong": "Filenames may not be longer than 240 bytes.",
+       "badfilename": "Filename has been changed to \"$1\".",
+       "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
+       "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
+       "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-missing": "The file has no extension (like \".jpg\").",
+       "empty-file": "The file you submitted was empty.",
+       "file-too-large": "The file you submitted was too large.",
+       "filename-tooshort": "The filename is too short.",
+       "filetype-banned": "This type of file is banned.",
+       "verification-error": "This file did not pass file verification.",
+       "hookaborted": "The modification you tried to make was aborted by an extension.",
+       "illegal-filename": "The filename is not allowed.",
+       "overwrite": "Overwriting an existing file is not allowed.",
+       "unknown-error": "An unknown error occurred.",
+       "tmp-create-error": "Could not create temporary file.",
+       "tmp-write-error": "Error writing temporary file.",
+       "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
+       "largefileserver": "This file is bigger than the server is configured to allow.",
+       "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
+       "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
+       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
+       "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
+       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+       "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
+       "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
+       "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
+       "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
+       "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
+       "uploadwarning": "Upload warning",
+       "uploadwarning-text": "Please modify the file description below and try again.",
+       "savefile": "Save file",
+       "uploadedimage": "uploaded \"[[$1]]\"",
+       "overwroteimage": "uploaded a new version of \"[[$1]]\"",
+       "uploaddisabled": "Uploads disabled.",
+       "copyuploaddisabled": "Upload by URL disabled.",
+       "uploaddisabledtext": "File uploads are disabled.",
+       "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
+       "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
+       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
+       "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
+       "uploadvirus": "The file contains a virus!\nDetails: $1",
+       "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
+       "upload-source": "Source file",
+       "sourcefilename": "Source filename:",
+       "sourceurl": "Source URL:",
+       "destfilename": "Destination filename:",
+       "upload-maxfilesize": "Maximum file size: $1",
+       "upload-description": "File description",
+       "upload-options": "Upload options",
+       "watchthisupload": "Watch this file",
+       "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
+       "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
+       "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
+       "upload-success-subj": "Successful upload",
+       "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Upload problem",
+       "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
+       "upload-warning-subj": "Upload warning",
+       "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
+       "upload-proto-error": "Incorrect protocol",
+       "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
+       "upload-file-error": "Internal error",
+       "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-misc-error": "Unknown upload error",
+       "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-too-many-redirects": "The URL contained too many redirects",
+       "upload-http-error": "An HTTP error occurred: $1",
+       "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
+       "backend-fail-stream": "Could not stream file \"$1\".",
+       "backend-fail-backup": "Could not backup file \"$1\".",
+       "backend-fail-notexists": "The file $1 does not exist.",
+       "backend-fail-hashes": "Could not get file hashes for comparison.",
+       "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
+       "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
+       "backend-fail-delete": "Could not delete file \"$1\".",
+       "backend-fail-describe": "Could not change metadata for file \"$1\".",
+       "backend-fail-alreadyexists": "The file \"$1\" already exists.",
+       "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
+       "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
+       "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
+       "backend-fail-opentemp": "Could not open temporary file.",
+       "backend-fail-writetemp": "Could not write to temporary file.",
+       "backend-fail-closetemp": "Could not close temporary file.",
+       "backend-fail-read": "Could not read file \"$1\".",
+       "backend-fail-create": "Could not write file \"$1\".",
+       "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
+       "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
+       "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
+       "backend-fail-connect": "Could not connect to storage backend \"$1\".",
+       "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
+       "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
+       "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
+       "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
+       "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
+       "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
+       "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
+       "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
+       "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
+       "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
+       "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
+       "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
+       "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
+       "lockmanager-fail-db-release": "Could not release locks on database $1.",
+       "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
+       "lockmanager-fail-svr-release": "Could not release locks on server $1.",
+       "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
+       "zip-wrong-format": "The specified file was not a ZIP file.",
+       "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
+       "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
+       "uploadstash": "Upload stash",
+       "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
+       "uploadstash-clear": "Clear stashed files",
+       "uploadstash-nofiles": "You have no stashed files.",
+       "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
+       "uploadstash-errclear": "Clearing the files was unsuccessful.",
+       "uploadstash-refresh": "Refresh the list of files",
+       "invalid-chunk-offset": "Invalid chunk offset",
+       "img-auth-accessdenied": "Access denied",
+       "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Requested path is not in the configured upload directory.",
+       "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
+       "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
+       "img-auth-nofile": "File \"$1\" does not exist.",
+       "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
+       "img-auth-streaming": "Streaming \"$1\".",
+       "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
+       "img-auth-noread": "User does not have access to read \"$1\".",
+       "http-invalid-url": "Invalid URL: $1",
+       "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
+       "http-request-error": "HTTP request failed due to unknown error.",
+       "http-read-error": "HTTP read error.",
+       "http-timed-out": "HTTP request timed out.",
+       "http-curl-error": "Error fetching URL: $1",
+       "http-bad-status": "There was a problem during the HTTP request: $1 $2",
+       "upload-curl-error6": "Could not reach URL",
+       "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
+       "upload-curl-error28": "Upload timeout",
+       "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
+       "license": "Licensing:",
+       "license-header": "Licensing",
+       "nolicense": "None selected",
+       "licenses": "-",
+       "license-nopreview": "(Preview not available)",
+       "upload_source_url": "(a valid, publicly accessible URL)",
+       "upload_source_file": "(a file on your computer)",
+       "listfiles-summary": "This special page shows all uploaded files.",
+       "listfiles_search_for": "Search for media name:",
+       "imgfile": "file",
+       "listfiles": "File list",
+       "listfiles_thumb": "Thumbnail",
+       "listfiles_date": "Date",
+       "listfiles_name": "Name",
+       "listfiles_user": "User",
+       "listfiles_size": "Size",
+       "listfiles_description": "Description",
+       "listfiles_count": "Versions",
+       "listfiles-show-all": "Include old versions of images",
+       "listfiles-latestversion": "Current version",
+       "listfiles-latestversion-yes": "Yes",
+       "listfiles-latestversion-no": "No",
+       "file-anchor-link": "File",
+       "filehist": "File history",
+       "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
+       "filehist-deleteall": "delete all",
+       "filehist-deleteone": "delete",
+       "filehist-revert": "revert",
+       "filehist-current": "current",
+       "filehist-datetime": "Date/Time",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-nothumb": "No thumbnail",
+       "filehist-user": "User",
+       "filehist-dimensions": "Dimensions",
+       "filehist-filesize": "File size",
+       "filehist-comment": "Comment",
+       "imagelinks": "File usage",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
+       "nolinkstoimage": "There are no pages that link to this file.",
+       "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
+       "linkstoimage-redirect": "$1 (file redirect) $2",
+       "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
+       "sharedupload": "This file is from $1 and may be used by other projects.",
+       "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "shareddescriptionfollows": "-",
+       "filepage-nofile": "No file by this name exists.",
+       "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
+       "uploadnewversion-linktext": "Upload a new version of this file",
+       "shared-repo-from": "from $1",
+       "shared-repo": "a shared repository",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
+       "upload-disallowed-here": "You cannot overwrite this file.",
+       "filerevert": "Revert $1",
+       "filerevert-legend": "Revert file",
+       "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
+       "filerevert-comment": "Reason:",
+       "filerevert-defaultcomment": "Reverted to version as of $2, $1",
+       "filerevert-submit": "Revert",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
+       "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
+       "filedelete": "Delete $1",
+       "filedelete-legend": "Delete file",
+       "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
+       "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
+       "filedelete-comment": "Reason:",
+       "filedelete-submit": "Delete",
+       "filedelete-success": "<strong>$1</strong> has been deleted.",
+       "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
+       "filedelete-nofile": "<strong>$1</strong> does not exist.",
+       "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
+       "filedelete-otherreason": "Other/additional reason:",
+       "filedelete-reason-otherlist": "Other reason",
+       "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
+       "filedelete-edit-reasonlist": "Edit delete reasons",
+       "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
+       "filedelete-maintenance-title": "Cannot delete file",
+       "mimesearch": "MIME search",
+       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimetype": "MIME type:",
+       "download": "download",
+       "unwatchedpages": "Unwatched pages",
+       "unwatchedpages-summary": "",
+       "listredirects": "List of redirects",
+       "listredirects-summary": "",
+       "listduplicatedfiles": "List of files with duplicates",
+       "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
+       "unusedtemplates": "Unused templates",
+       "unusedtemplates-summary": "",
+       "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
+       "unusedtemplateswlh": "other links",
+       "randompage": "Random page",
+       "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
+       "randompage-url": "Special:Random",
+       "randomincategory": "Random page in category",
+       "randomincategory-invalidcategory": "\"$1\" is not a valid category name.",
+       "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
+       "randomincategory-selectcategory": "Get random page from category: $1 $2.",
+       "randomincategory-selectcategory-submit": "Go",
+       "randomredirect": "Random redirect",
+       "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
+       "statistics": "Statistics",
+       "statistics-summary": "",
+       "statistics-header-pages": "Page statistics",
+       "statistics-header-edits": "Edit statistics",
+       "statistics-header-views": "View statistics",
+       "statistics-header-users": "User statistics",
+       "statistics-header-hooks": "Other statistics",
+       "statistics-articles": "Content pages",
+       "statistics-pages": "Pages",
+       "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
+       "statistics-files": "Uploaded files",
+       "statistics-edits": "Page edits since {{SITENAME}} was set up",
+       "statistics-edits-average": "Average edits per page",
+       "statistics-views-total": "Views total",
+       "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
+       "statistics-views-peredit": "Views per edit",
+       "statistics-users": "Registered [[Special:ListUsers|users]]",
+       "statistics-users-active": "Active users",
+       "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
+       "statistics-mostpopular": "Most viewed pages",
+       "statistics-footer": "",
+       "pageswithprop": "Pages with a page property",
+       "pageswithprop-summary": "",
+       "pageswithprop-legend": "Pages with a page property",
+       "pageswithprop-text": "This page lists pages that use a particular page property.",
+       "pageswithprop-prop": "Property name:",
+       "pageswithprop-submit": "Go",
+       "pageswithprop-prophidden-long": "long text property value hidden ($1)",
+       "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
+       "doubleredirects": "Double redirects",
+       "doubleredirects-summary": "",
+       "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
+       "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
+       "double-redirect-fixer": "Redirect fixer",
+       "brokenredirects": "Broken redirects",
+       "brokenredirects-summary": "",
+       "brokenredirectstext": "The following redirects link to non-existent pages:",
+       "brokenredirects-edit": "edit",
+       "brokenredirects-delete": "delete",
+       "withoutinterwiki": "Pages without language links",
+       "withoutinterwiki-summary": "The following pages do not link to other language versions.",
+       "withoutinterwiki-legend": "Prefix",
+       "withoutinterwiki-submit": "Show",
+       "fewestrevisions": "Pages with the fewest revisions",
+       "fewestrevisions-summary": "",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1 {{PLURAL:$1|category|categories}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "nlinks": "$1 {{PLURAL:$1|link|links}}",
+       "nmembers": "$1 {{PLURAL:$1|member|members}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
+       "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
+       "nviews": "$1 {{PLURAL:$1|view|views}}",
+       "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
+       "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
+       "specialpage-empty": "There are no results for this report.",
+       "lonelypages": "Orphaned pages",
+       "lonelypages-summary": "",
+       "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
+       "uncategorizedpages": "Uncategorized pages",
+       "uncategorizedpages-summary": "",
+       "uncategorizedcategories": "Uncategorized categories",
+       "uncategorizedcategories-summary": "",
+       "uncategorizedimages": "Uncategorized files",
+       "uncategorizedimages-summary": "",
+       "uncategorizedtemplates": "Uncategorized templates",
+       "uncategorizedtemplates-summary": "",
+       "unusedcategories": "Unused categories",
+       "unusedcategories-summary": "",
+       "unusedimages": "Unused files",
+       "unusedimages-summary": "",
+       "popularpages": "Popular pages",
+       "popularpages-summary": "",
+       "wantedcategories": "Wanted categories",
+       "wantedcategories-summary": "",
+       "wantedpages": "Wanted pages",
+       "wantedpages-summary": "",
+       "wantedpages-badtitle": "Invalid title in result set: $1",
+       "wantedfiles": "Wanted files",
+       "wantedfiles-summary": "",
+       "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
+       "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
+       "wantedtemplates": "Wanted templates",
+       "wantedtemplates-summary": "",
+       "mostlinked": "Most linked-to pages",
+       "mostlinked-summary": "",
+       "mostlinkedcategories": "Most linked-to categories",
+       "mostlinkedcategories-summary": "",
+       "mostlinkedtemplates": "Most linked-to templates",
+       "mostlinkedtemplates-summary": "",
+       "mostcategories": "Pages with the most categories",
+       "mostcategories-summary": "",
+       "mostimages": "Most linked-to files",
+       "mostimages-summary": "",
+       "mostinterwikis": "Pages with the most interwikis",
+       "mostinterwikis-summary": "",
+       "mostrevisions": "Pages with the most revisions",
+       "mostrevisions-summary": "",
+       "prefixindex": "All pages with prefix",
+       "prefixindex-namespace": "All pages with prefix ($1 namespace)",
+       "prefixindex-summary": "",
+       "prefixindex-strip": "Strip prefix in list",
+       "shortpages": "Short pages",
+       "shortpages-summary": "",
+       "longpages": "Long pages",
+       "longpages-summary": "",
+       "deadendpages": "Dead-end pages",
+       "deadendpages-summary": "",
+       "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
+       "protectedpages": "Protected pages",
+       "protectedpages-indef": "Indefinite protections only",
+       "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Cascading protections only",
+       "protectedpages-noredirect": "Hide redirects",
+       "protectedpagesempty": "No pages are currently protected with these parameters.",
+       "protectedpages-timestamp": "Timestamp",
+       "protectedpages-page": "Page",
+       "protectedpages-expiry": "Expires",
+       "protectedpages-performer": "Protecting user",
+       "protectedpages-params": "Protection parameters",
+       "protectedpages-reason": "Reason",
+       "protectedpages-unknown-timestamp": "Unknown",
+       "protectedpages-unknown-performer": "Unknown user",
+       "protectedpages-unknown-reason": "—",
+       "protectedtitles": "Protected titles",
+       "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "No titles are currently protected with these parameters.",
+       "listusers": "User list",
+       "listusers-summary": "",
+       "listusers-editsonly": "Show only users with edits",
+       "listusers-creationsort": "Sort by creation date",
+       "listusers-desc": "Sort in descending order",
+       "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
+       "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
+       "newpages": "New pages",
+       "newpages-summary": "",
+       "newpages-username": "Username:",
+       "ancientpages": "Oldest pages",
+       "ancientpages-summary": "",
+       "move": "Move",
+       "movethispage": "Move this page",
+       "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
+       "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
+       "notargettitle": "No target",
+       "notargettext": "You have not specified a target page or user to perform this function on.",
+       "nopagetitle": "No such target page",
+       "nopagetext": "The target page you have specified does not exist.",
+       "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
+       "suppress": "Oversight",
+       "querypage-disabled": "This special page is disabled for performance reasons.",
+       "booksources": "Book sources",
+       "booksources-summary": "",
+       "booksources-search-legend": "Search for book sources",
+       "booksources-isbn": "ISBN:",
+       "booksources-go": "Go",
+       "booksources-text": "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:",
+       "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
+       "rfcurl": "//tools.ietf.org/html/rfc$1",
+       "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
+       "specialloguserlabel": "Performer:",
+       "speciallogtitlelabel": "Target (title or user):",
+       "log": "Logs",
+       "all-logs-page": "All public logs",
+       "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
+       "logempty": "No matching items in log.",
+       "log-title-wildcard": "Search titles starting with this text",
+       "showhideselectedlogentries": "Change visibility of selected log entries",
+       "allpages": "All pages",
+       "allpages-summary": "",
+       "nextpage": "Next page ($1)",
+       "prevpage": "Previous page ($1)",
+       "allpagesfrom": "Display pages starting at:",
+       "allpagesto": "Display pages ending at:",
+       "allarticles": "All pages",
+       "allinnamespace": "All pages ($1 namespace)",
+       "allpagessubmit": "Go",
+       "allpagesprefix": "Display pages with prefix:",
+       "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
+       "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
+       "allpages-hide-redirects": "Hide redirects",
+       "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
+       "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
+       "cachedspecial-refresh-now": "View latest.",
+       "categories": "Categories",
+       "categories-summary": "",
+       "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
+       "categoriesfrom": "Display categories starting at:",
+       "special-categories-sort-count": "sort by count",
+       "special-categories-sort-abc": "sort alphabetically",
+       "deletedcontributions": "Deleted user contributions",
+       "deletedcontributions-summary": "",
+       "deletedcontributions-title": "Deleted user contributions",
+       "sp-deletedcontributions-contribs": "contributions",
+       "linksearch": "External links search",
+       "linksearch-summary": "",
+       "linksearch-pat": "Search pattern:",
+       "linksearch-ns": "Namespace:",
+       "linksearch-ok": "Search",
+       "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
+       "linksearch-line": "$1 is linked from $2",
+       "linksearch-error": "Wildcards may appear only at the start of the hostname.",
+       "listusersfrom": "Display users starting at:",
+       "listusers-submit": "Show",
+       "listusers-noresult": "No user found.",
+       "listusers-blocked": "(blocked)",
+       "activeusers": "Active users list",
+       "activeusers-summary": "",
+       "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
+       "activeusers-from": "Display users starting at:",
+       "activeusers-hidebots": "Hide bots",
+       "activeusers-hidesysops": "Hide administrators",
+       "activeusers-noresult": "No users found.",
+       "listgrouprights": "User group rights",
+       "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
+       "listgrouprights-group": "Group",
+       "listgrouprights-rights": "Rights",
+       "listgrouprights-helppage": "Help:Group rights",
+       "listgrouprights-members": "(list of members)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
+       "listgrouprights-addgroup": "Add {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-addgroup-all": "Add all groups",
+       "listgrouprights-removegroup-all": "Remove all groups",
+       "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
+       "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
+       "listgrouprights-addgroup-self-all": "Add all groups to own account",
+       "listgrouprights-removegroup-self-all": "Remove all groups from own account",
+       "listgrouprights-namespaceprotection-header": "Namespace restrictions",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
+       "trackingcategories": "Tracking categories",
+       "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
+       "trackingcategories-msg": "Tracking category",
+       "trackingcategories-name": "Message name",
+       "trackingcategories-desc": "Category inclusion criteria",
+       "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
+       "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
+       "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
+       "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
+       "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
+       "trackingcategories-nodesc": "No description available.",
+       "trackingcategories-disabled": "Category is disabled",
+       "mailnologin": "No send address",
+       "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
+       "emailuser": "Email this user",
+       "emailuser-title-target": "Email this {{GENDER:$1|user}}",
+       "emailuser-title-notarget": "Email user",
+       "emailuser-summary": "",
+       "emailpage": "Email user",
+       "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
+       "defemailsubject": "{{SITENAME}} email from user \"$1\"",
+       "usermaildisabled": "User email disabled",
+       "usermaildisabledtext": "You cannot send email to other users on this wiki",
+       "noemailtitle": "No email address",
+       "noemailtext": "This user has not specified a valid email address.",
+       "nowikiemailtext": "This user has chosen not to receive email from other users.",
+       "emailnotarget": "Non-existent or invalid username for recipient.",
+       "emailtarget": "Enter username of recipient",
+       "emailusername": "Username:",
+       "emailusernamesubmit": "Submit",
+       "email-legend": "Send an email to another {{SITENAME}} user",
+       "emailfrom": "From:",
+       "emailto": "To:",
+       "emailsubject": "Subject:",
+       "emailmessage": "Message:",
+       "emailsend": "Send",
+       "emailccme": "Email me a copy of my message.",
+       "emailccsubject": "Copy of your message to $1: $2",
+       "emailsent": "Email sent",
+       "emailsenttext": "Your email message has been sent.",
+       "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
+       "usermessage-summary": "Leaving system message.",
+       "usermessage-editor": "System messenger",
+       "usermessage-template": "MediaWiki:UserMessage",
+       "watchlist": "Watchlist",
+       "watchlist-summary": "",
+       "mywatchlist": "Watchlist",
+       "watchlistfor2": "For $1 $2",
+       "nowatchlist": "You have no items on your watchlist.",
+       "watchlistanontext": "Please $1 to view or edit items on your watchlist.",
+       "watchnologin": "Not logged in",
+       "addwatch": "Add to watchlist",
+       "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
+       "removewatch": "Remove from watchlist",
+       "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
+       "watch": "Watch",
+       "watchthispage": "Watch this page",
+       "unwatch": "Unwatch",
+       "unwatchthispage": "Stop watching",
+       "notanarticle": "Not a content page",
+       "notvisiblerev": "The last revision by a different user has been deleted",
+       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
+       "wlheader-enotif": "Email notification is enabled.",
+       "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
+       "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
+       "wlshowlast": "Show last $1 hours $2 days $3",
+       "watchlist-options": "Watchlist options",
+       "watching": "Watching...",
+       "unwatching": "Unwatching...",
+       "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
+       "enotif_reset": "Mark all pages visited",
+       "enotif_impersonal_salutation": "{{SITENAME}} user",
+       "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
+       "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
+       "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
+       "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
+       "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
+       "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
+       "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_lastvisited": "See $1 for all changes since your last visit.",
+       "enotif_lastdiff": "See $1 to view this change.",
+       "enotif_anon_editor": "anonymous user $1",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
+       "created": "created",
+       "changed": "changed",
+       "deletepage": "Delete page",
+       "confirm": "Confirm",
+       "excontent": "content was: \"$1\"",
+       "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "content before blanking was: \"$1\"",
+       "delete-confirm": "Delete \"$1\"",
+       "delete-legend": "Delete",
+       "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
+       "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
+       "actioncomplete": "Action complete",
+       "actionfailed": "Action failed",
+       "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
+       "dellogpage": "Deletion log",
+       "dellogpagetext": "Below is a list of the most recent deletions.",
+       "deletionlog": "deletion log",
+       "reverted": "Reverted to earlier revision",
+       "deletecomment": "Reason:",
+       "deleteotherreason": "Other/additional reason:",
+       "deletereasonotherlist": "Other reason",
+       "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
+       "delete-edit-reasonlist": "Edit deletion reasons",
+       "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
+       "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
+       "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
+       "rollback": "Roll back edits",
+       "rollback_short": "Rollback",
+       "rollbacklink": "rollback",
+       "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
+       "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
+       "rollbackfailed": "Rollback failed",
+       "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
+       "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "The edit summary was: \"''$1''\".",
+       "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
+       "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "sessionfailure-title": "Session failure",
+       "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
+       "protectlogpage": "Protection log",
+       "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
+       "protectedarticle": "protected \"[[$1]]\"",
+       "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
+       "unprotectedarticle": "removed protection from \"[[$1]]\"",
+       "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
+       "protect-title": "Change protection level for \"$1\"",
+       "protect-title-notallowed": "View protection level of \"$1\"",
+       "prot_1movedto2": "[[$1]] moved to [[$2]]",
+       "protect-badnamespace-title": "Non-protectable namespace",
+       "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
+       "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
+       "protect-norestrictiontypes-title": "Non-protectable page",
+       "protect-legend": "Confirm protection",
+       "protectcomment": "Reason:",
+       "protectexpiry": "Expires:",
+       "protect_expiry_invalid": "Expiry time is invalid.",
+       "protect_expiry_old": "Expiry time is in the past.",
+       "protect-unchain-permissions": "Unlock further protect options",
+       "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
+       "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
+       "protect-default": "Allow all users",
+       "protect-fallback": "Allow only users with \"$1\" permission",
+       "protect-level-autoconfirmed": "Allow only autoconfirmed users",
+       "protect-level-sysop": "Allow only administrators",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "cascading",
+       "protect-expiring": "expires $1 (UTC)",
+       "protect-expiring-local": "expires $1",
+       "protect-expiry-indefinite": "indefinite",
+       "protect-cascade": "Protect pages included in this page (cascading protection)",
+       "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
+       "protect-othertime": "Other time:",
+       "protect-othertime-op": "other time",
+       "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "protect-otherreason": "Other/additional reason:",
+       "protect-otherreason-op": "Other reason",
+       "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
+       "protect-edit-reasonlist": "Edit protection reasons",
+       "protect-expiry-options": "1 hour:1 hour,1 day:1 day,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",
+       "restriction-type": "Permission:",
+       "restriction-level": "Restriction level:",
+       "minimum-size": "Min size",
+       "maximum-size": "Max size:",
+       "pagesize": "(bytes)",
+       "restriction-edit": "Edit",
+       "restriction-move": "Move",
+       "restriction-create": "Create",
+       "restriction-upload": "Upload",
+       "restriction-level-sysop": "fully protected",
+       "restriction-level-autoconfirmed": "semi protected",
+       "restriction-level-all": "any level",
+       "undelete": "View deleted pages",
+       "undelete-summary": "",
+       "undeletepage": "View and restore deleted pages",
+       "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "View deleted pages",
+       "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
+       "undelete-fieldset-title": "Restore revisions",
+       "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
+       "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
+       "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
+       "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
+       "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
+       "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
+       "undelete-nodiff": "No previous revision found.",
+       "undeletebtn": "Restore",
+       "undeletelink": "view/restore",
+       "undeleteviewlink": "view",
+       "undeleteinvert": "Invert selection",
+       "undeletecomment": "Reason:",
+       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
+       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
+       "cannotundelete": "Undelete failed:\n$1",
+       "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
+       "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
+       "undelete-search-title": "Search deleted pages",
+       "undelete-search-box": "Search deleted pages",
+       "undelete-search-prefix": "Show pages starting with:",
+       "undelete-search-submit": "Search",
+       "undelete-no-results": "No matching pages found in the deletion archive.",
+       "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
+       "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
+       "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
+       "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
+       "undelete-error": "Error undeleting page",
+       "undelete-error-short": "Error undeleting file: $1",
+       "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
+       "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "undelete-show-file-submit": "Yes",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
+       "namespace": "Namespace:",
+       "invert": "Invert selection",
+       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "blanknamespace": "(Main)",
+       "contributions": "{{GENDER:$1|User}} contributions",
+       "contributions-summary": "",
+       "contributions-title": "User contributions for $1",
+       "mycontris": "Contributions",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
+       "nocontribs": "No changes were found matching these criteria.",
+       "uctop": "(current)",
+       "month": "From month (and earlier):",
+       "year": "From year (and earlier):",
+       "sp-contributions-newbies": "Show contributions of new accounts only",
+       "sp-contributions-newbies-sub": "For new accounts",
+       "sp-contributions-newbies-title": "User contributions for new accounts",
+       "sp-contributions-blocklog": "block log",
+       "sp-contributions-suppresslog": "suppressed user contributions",
+       "sp-contributions-deleted": "deleted user contributions",
+       "sp-contributions-uploads": "uploads",
+       "sp-contributions-logs": "logs",
+       "sp-contributions-talk": "talk",
+       "sp-contributions-userrights": "user rights management",
+       "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-search": "Search for contributions",
+       "sp-contributions-username": "IP address or username:",
+       "sp-contributions-toponly": "Only show edits that are latest revisions",
+       "sp-contributions-newonly": "Only show edits that are page creations",
+       "sp-contributions-submit": "Search",
+       "sp-contributions-explain": "",
+       "sp-contributions-footer": "-",
+       "sp-contributions-footer-anon": "-",
+       "sp-contributions-footer-newbies": "-",
+       "whatlinkshere": "What links here",
+       "whatlinkshere-title": "Pages that link to \"$1\"",
+       "whatlinkshere-summary": "",
+       "whatlinkshere-page": "Page:",
+       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
+       "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
+       "isredirect": "redirect page",
+       "istemplate": "transclusion",
+       "isimage": "file link",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-links": "← links",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hideimages": "$1 file links",
+       "whatlinkshere-filters": "Filters",
+       "autoblockid": "Autoblock #$1",
+       "block": "Block user",
+       "unblock": "Unblock user",
+       "unblock-summary": "",
+       "blockip": "Block user",
+       "blockip-legend": "Block user",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
+       "ipaddressorusername": "IP address or username:",
+       "ipbexpiry": "Expiry:",
+       "ipbreason": "Reason:",
+       "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
+       "ipbcreateaccount": "Prevent account creation",
+       "ipbemailban": "Prevent user from sending email",
+       "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
+       "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,indefinite:infinite",
+       "ipbhidename": "Hide username from edits and lists",
+       "ipbwatchuser": "Watch this user's user and talk pages",
+       "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
+       "ipb-change-block": "Re-block the user with these settings",
+       "ipb-confirm": "Confirm block",
+       "badipaddress": "Invalid IP address",
+       "blockipsuccesssub": "Block succeeded",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
+       "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
+       "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
+       "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
+       "ipb-edit-dropdown": "Edit block reasons",
+       "ipb-unblock-addr": "Unblock $1",
+       "ipb-unblock": "Unblock a username or IP address",
+       "ipb-blocklist": "View existing blocks",
+       "ipb-blocklist-contribs": "Contributions for $1",
+       "unblockip": "Unblock user",
+       "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
+       "ipusubmit": "Remove this block",
+       "unblocked": "[[User:$1|$1]] has been unblocked.",
+       "unblocked-range": "$1 has been unblocked.",
+       "unblocked-id": "Block $1 has been removed.",
+       "blocklist": "Blocked users",
+       "ipblocklist": "Blocked users",
+       "ipblocklist-legend": "Find a blocked user",
+       "blocklist-userblocks": "Hide account blocks",
+       "blocklist-tempblocks": "Hide temporary blocks",
+       "blocklist-addressblocks": "Hide single IP blocks",
+       "blocklist-rangeblocks": "Hide range blocks",
+       "blocklist-timestamp": "Timestamp",
+       "blocklist-target": "Target",
+       "blocklist-expiry": "Expires",
+       "blocklist-by": "Blocking admin",
+       "blocklist-params": "Block parameters",
+       "blocklist-reason": "Reason",
+       "blocklist-summary": "",
+       "ipblocklist-submit": "Search",
+       "ipblocklist-localblock": "Local block",
+       "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
+       "infiniteblock": "infinite",
+       "expiringblock": "expires on $1 at $2",
+       "anononlyblock": "anon. only",
+       "noautoblockblock": "autoblock disabled",
+       "createaccountblock": "account creation disabled",
+       "emailblock": "email disabled",
+       "blocklist-nousertalk": "cannot edit own talk page",
+       "ipblocklist-empty": "The block list is empty.",
+       "ipblocklist-no-results": "The requested IP address or username is not blocked.",
+       "blocklink": "block",
+       "unblocklink": "unblock",
+       "change-blocklink": "change block",
+       "contribslink": "contribs",
+       "emaillink": "send email",
+       "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
+       "blocklogpage": "Block log",
+       "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
+       "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
+       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
+       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
+       "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "unblocklogentry": "unblocked $1",
+       "block-log-flags-anononly": "anonymous users only",
+       "block-log-flags-nocreate": "account creation disabled",
+       "block-log-flags-noautoblock": "autoblock disabled",
+       "block-log-flags-noemail": "email disabled",
+       "block-log-flags-nousertalk": "cannot edit own talk page",
+       "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
+       "block-log-flags-hiddenname": "username hidden",
+       "range_block_disabled": "The administrator ability to create range blocks is disabled.",
+       "ipb_expiry_invalid": "Expiry time invalid.",
+       "ipb_expiry_temp": "Hidden username blocks must be permanent.",
+       "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
+       "ipb_already_blocked": "\"$1\" is already blocked.",
+       "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
+       "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
+       "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
+       "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
+       "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
+       "ip_range_invalid": "Invalid IP range.",
+       "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
+       "proxyblocker": "Proxy blocker",
+       "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
+       "sorbs": "DNSBL",
+       "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
+       "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
+       "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
+       "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
+       "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
+       "ipbnounblockself": "You are not allowed to unblock yourself.",
+       "ipb-default-expiry": "",
+       "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.\nPlease 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.\nPlease 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 />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
+       "unlockdbsuccesstext": "The database has been unlocked.",
+       "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
+       "databasenotlocked": "The database is not locked.",
+       "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
+       "move-page": "Move $1",
+       "movepage-summary": "",
+       "move-page-legend": "Move page",
+       "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
+       "movearticle": "Move page:",
+       "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
+       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
+       "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
+       "movenotallowed": "You do not have permission to move pages.",
+       "movenotallowedfile": "You do not have permission to move files.",
+       "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
+       "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
+       "cant-move-category-page": "You do not have permission to move category pages.",
+       "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
+       "newtitle": "To new title:",
+       "move-watch": "Watch source page and target page",
+       "movepagebtn": "Move page",
+       "pagemovedsub": "Move succeeded",
+       "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
+       "movepage-moved-redirect": "A redirect has been created.",
+       "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
+       "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "movetalk": "Move associated talk page",
+       "move-subpages": "Move subpages (up to $1)",
+       "move-talk-subpages": "Move subpages of talk page (up to $1)",
+       "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
+       "movepage-page-moved": "The page $1 has been moved to $2.",
+       "movepage-page-unmoved": "The page $1 could not be moved to $2.",
+       "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
+       "movelogpage": "Move log",
+       "movelogpagetext": "Below is a list of all page moves.",
+       "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
+       "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
+       "movenosubpage": "This page has no subpages.",
+       "movereason": "Reason:",
+       "move-redirect-text": "",
+       "category-move-redirect-override": "-",
+       "revertmove": "revert",
+       "delete_and_move": "Delete and move",
+       "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo 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 from \"[[$1]]\"",
+       "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
+       "immobile-source-page": "This page is not movable.",
+       "immobile-target-page": "Cannot move to that destination title.",
+       "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
+       "imagetypemismatch": "The new file extension does not match its type",
+       "imageinvalidfilename": "The target filename is invalid",
+       "fix-double-redirects": "Update any redirects that point to the original title",
+       "move-leave-redirect": "Leave a redirect behind",
+       "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
+       "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
+       "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
+       "export": "Export pages",
+       "export-summary": "",
+       "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Export all pages",
+       "exportcuronly": "Include only the current revision, not the full history",
+       "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
+       "exportlistauthors": "Include a full list of contributors for each page",
+       "export-submit": "Export",
+       "export-addcattext": "Add pages from category:",
+       "export-addcat": "Add",
+       "export-addnstext": "Add pages from namespace:",
+       "export-addns": "Add",
+       "export-download": "Save as file",
+       "export-templates": "Include templates",
+       "export-pagelinks": "Include linked pages to a depth of:",
+       "allmessages": "System messages",
+       "allmessagesname": "Name",
+       "allmessagesdefault": "Default message text",
+       "allmessagescurrent": "Current message text",
+       "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+       "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
+       "allmessages-filter-legend": "Filter",
+       "allmessages-filter": "Filter by customization state:",
+       "allmessages-filter-unmodified": "Unmodified",
+       "allmessages-filter-all": "All",
+       "allmessages-filter-modified": "Modified",
+       "allmessages-prefix": "Filter by prefix:",
+       "allmessages-language": "Language:",
+       "allmessages-filter-submit": "Go",
+       "allmessages-filter-translate": "Translate",
+       "thumbnail-more": "Enlarge",
+       "filemissing": "File missing",
+       "thumbnail_error": "Error creating thumbnail: $1",
+       "thumbnail_error_remote": "Error message from $1:\n$2",
+       "djvu_page_error": "DjVu page out of range",
+       "djvu_no_xml": "Unable to fetch XML for DjVu file",
+       "thumbnail-temp-create": "Unable to create temporary thumbnail file",
+       "thumbnail-dest-create": "Unable to save thumbnail to destination",
+       "thumbnail_invalid_params": "Invalid thumbnail parameters",
+       "thumbnail_dest_directory": "Unable to create destination directory",
+       "thumbnail_image-type": "Image type not supported",
+       "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
+       "thumbnail_image-missing": "File seems to be missing: $1",
+       "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
+       "import": "Import pages",
+       "import-summary": "",
+       "importinterwiki": "Transwiki import",
+       "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll transwiki import actions are logged at the [[Special:Log/import|import log]].",
+       "import-interwiki-source": "Source wiki/page:",
+       "import-interwiki-history": "Copy all history revisions for this page",
+       "import-interwiki-templates": "Include all templates",
+       "import-interwiki-submit": "Import",
+       "import-interwiki-namespace": "Destination namespace:",
+       "import-interwiki-rootpage": "Destination root page (optional):",
+       "import-upload-filename": "Filename:",
+       "import-comment": "Comment:",
+       "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
+       "importstart": "Importing pages...",
+       "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
+       "importnopages": "No pages to import.",
+       "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
+       "importfailed": "Import failed: <nowiki>$1</nowiki>",
+       "importunknownsource": "Unknown import source type",
+       "importcantopen": "Could not open import file",
+       "importbadinterwiki": "Bad interwiki link",
+       "importsuccess": "Import finished!",
+       "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
+       "importnofile": "No import file was uploaded.",
+       "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
+       "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
+       "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
+       "import-parse-failure": "XML import parse failure",
+       "import-noarticle": "No page to import!",
+       "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
+       "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
+       "import-upload": "Upload XML data",
+       "import-token-mismatch": "Loss of session data.\nPlease try again.",
+       "import-invalid-interwiki": "Cannot import from the specified wiki.",
+       "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
+       "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
+       "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
+       "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
+       "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
+       "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
+       "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
+       "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "Given root page is an invalid title.",
+       "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
+       "importlogpage": "Import log",
+       "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
+       "import-logentry-upload": "imported [[$1]] by file upload",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
+       "import-logentry-interwiki": "transwikied $1",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
+       "javascripttest": "JavaScript testing",
+       "javascripttest-backlink": "< $1",
+       "javascripttest-title": "Running $1 tests",
+       "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
+       "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
+       "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
+       "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
+       "javascripttest-qunit-name": "QUnit",
+       "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
+       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
+       "accesskey-pt-userpage": ".",
+       "accesskey-pt-anonuserpage": ".",
+       "accesskey-pt-mytalk": "n",
+       "accesskey-pt-anontalk": "n",
+       "accesskey-pt-preferences": "",
+       "accesskey-pt-watchlist": "l",
+       "accesskey-pt-mycontris": "y",
+       "accesskey-pt-login": "o",
+       "accesskey-pt-logout": "",
+       "accesskey-ca-talk": "t",
+       "accesskey-ca-edit": "e",
+       "accesskey-ca-addsection": "+",
+       "accesskey-ca-viewsource": "e",
+       "accesskey-ca-history": "h",
+       "accesskey-ca-protect": "=",
+       "accesskey-ca-unprotect": "=",
+       "accesskey-ca-delete": "d",
+       "accesskey-ca-undelete": "d",
+       "accesskey-ca-move": "m",
+       "accesskey-ca-watch": "w",
+       "accesskey-ca-unwatch": "w",
+       "accesskey-search": "f",
+       "accesskey-search-go": "",
+       "accesskey-search-fulltext": "",
+       "accesskey-p-logo": "",
+       "accesskey-n-mainpage": "z",
+       "accesskey-n-mainpage-description": "z",
+       "accesskey-n-portal": "",
+       "accesskey-n-currentevents": "",
+       "accesskey-n-recentchanges": "r",
+       "accesskey-n-randompage": "x",
+       "accesskey-n-help": "",
+       "accesskey-t-whatlinkshere": "j",
+       "accesskey-t-recentchangeslinked": "k",
+       "accesskey-feed-rss": "",
+       "accesskey-feed-atom": "",
+       "accesskey-t-contributions": "",
+       "accesskey-t-emailuser": "",
+       "accesskey-t-permalink": "",
+       "accesskey-t-print": "p",
+       "accesskey-t-upload": "u",
+       "accesskey-t-specialpages": "q",
+       "accesskey-ca-nstab-main": "c",
+       "accesskey-ca-nstab-user": "c",
+       "accesskey-ca-nstab-media": "c",
+       "accesskey-ca-nstab-special": "",
+       "accesskey-ca-nstab-project": "a",
+       "accesskey-ca-nstab-image": "c",
+       "accesskey-ca-nstab-mediawiki": "c",
+       "accesskey-ca-nstab-template": "c",
+       "accesskey-ca-nstab-help": "c",
+       "accesskey-ca-nstab-category": "c",
+       "accesskey-minoredit": "i",
+       "accesskey-save": "s",
+       "accesskey-preview": "p",
+       "accesskey-diff": "v",
+       "accesskey-compareselectedversions": "v",
+       "accesskey-watch": "w",
+       "accesskey-upload": "s",
+       "accesskey-preferences-save": "s",
+       "accesskey-summary": "b",
+       "accesskey-userrights-set": "s",
+       "accesskey-blockip-block": "s",
+       "accesskey-export": "s",
+       "accesskey-import": "s",
+       "accesskey-watchlistedit-normal-submit": "s",
+       "accesskey-watchlistedit-raw-submit": "s",
+       "tooltip-pt-userpage": "Your user page",
+       "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
+       "tooltip-pt-mytalk": "Your talk page",
+       "tooltip-pt-anontalk": "Discussion about edits from this IP address",
+       "tooltip-pt-preferences": "Your preferences",
+       "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
+       "tooltip-pt-mycontris": "A list of your contributions",
+       "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-logout": "Log out",
+       "tooltip-ca-talk": "Discussion about the content page",
+       "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
+       "tooltip-ca-addsection": "Start a new section",
+       "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
+       "tooltip-ca-history": "Past revisions of this page",
+       "tooltip-ca-protect": "Protect this page",
+       "tooltip-ca-unprotect": "Change protection of this page",
+       "tooltip-ca-delete": "Delete this page",
+       "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
+       "tooltip-ca-move": "Move this page",
+       "tooltip-ca-watch": "Add this page to your watchlist",
+       "tooltip-ca-unwatch": "Remove this page from your watchlist",
+       "tooltip-search": "Search {{SITENAME}}",
+       "tooltip-search-go": "Go to a page with this exact name if exists",
+       "tooltip-search-fulltext": "Search the pages for this text",
+       "tooltip-p-logo": "Visit the main page",
+       "tooltip-n-mainpage": "Visit the main page",
+       "tooltip-n-mainpage-description": "Visit the main page",
+       "tooltip-n-portal": "About the project, what you can do, where to find things",
+       "tooltip-n-currentevents": "Find background information on current events",
+       "tooltip-n-recentchanges": "A list of recent changes in the wiki",
+       "tooltip-n-randompage": "Load a random page",
+       "tooltip-n-help": "The place to find out",
+       "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
+       "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
+       "tooltip-feed-rss": "RSS feed for this page",
+       "tooltip-feed-atom": "Atom feed for this page",
+       "tooltip-t-contributions": "A list of contributions of this user",
+       "tooltip-t-emailuser": "Send an email to this user",
+       "tooltip-t-upload": "Upload files",
+       "tooltip-t-specialpages": "A list of all special pages",
+       "tooltip-t-print": "Printable version of this page",
+       "tooltip-t-permalink": "Permanent link to this revision of the page",
+       "tooltip-ca-nstab-main": "View the content page",
+       "tooltip-ca-nstab-user": "View the user page",
+       "tooltip-ca-nstab-media": "View the media page",
+       "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
+       "tooltip-ca-nstab-project": "View the project page",
+       "tooltip-ca-nstab-image": "View the file page",
+       "tooltip-ca-nstab-mediawiki": "View the system message",
+       "tooltip-ca-nstab-template": "View the template",
+       "tooltip-ca-nstab-help": "View the help page",
+       "tooltip-ca-nstab-category": "View the category page",
+       "tooltip-minoredit": "Mark this as a minor edit",
+       "tooltip-save": "Save your changes",
+       "tooltip-preview": "Preview your changes, please use this before saving!",
+       "tooltip-diff": "Show which changes you made to the text",
+       "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
+       "tooltip-watch": "Add this page to your watchlist",
+       "tooltip-watchlistedit-normal-submit": "Remove titles",
+       "tooltip-watchlistedit-raw-submit": "Update watchlist",
+       "tooltip-recreate": "Recreate the page even though it has been deleted",
+       "tooltip-upload": "Start upload",
+       "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
+       "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
+       "tooltip-preferences-save": "Save preferences",
+       "tooltip-summary": "Enter a short summary",
+       "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-langonly": "$1",
+       "common.css": "/* CSS placed here will be applied to all skins */",
+       "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
+       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+       "modern.css": "/* CSS placed here will affect users of the Modern skin */",
+       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+       "print.css": "/* CSS placed here will affect the print output */",
+       "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
+       "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
+       "group-user.css": "/* CSS placed here will affect registered users only */",
+       "group-bot.css": "/* CSS placed here will affect bots only */",
+       "group-sysop.css": "/* CSS placed here will affect sysops only */",
+       "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
+       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
+       "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
+       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
+       "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
+       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+       "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
+       "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
+       "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
+       "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
+       "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
+       "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
+       "siteuser": "{{SITENAME}} user $1",
+       "anonuser": "{{SITENAME}} anonymous user $1",
+       "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
+       "othercontribs": "Based on work by $1.",
+       "others": "others",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
+       "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
+       "creditspage": "Page credits",
+       "nocredits": "There is no credits info available for this page.",
+       "spamprotectiontitle": "Spam protection filter",
+       "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
+       "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
+       "spambot_username": "MediaWiki spam cleanup",
+       "spam_reverting": "Reverting to last revision not containing links to $1",
+       "spam_blanking": "All revisions contained links to $1, blanking",
+       "spam_deleting": "All revisions contained links to $1, deleting",
+       "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
+       "pageinfo-header": "-",
+       "pageinfo-title": "Information for \"$1\"",
+       "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
+       "pageinfo-header-basic": "Basic information",
+       "pageinfo-header-edits": "Edit history",
+       "pageinfo-header-restrictions": "Page protection",
+       "pageinfo-header-properties": "Page properties",
+       "pageinfo-display-title": "Display title",
+       "pageinfo-default-sort": "Default sort key",
+       "pageinfo-length": "Page length (in bytes)",
+       "pageinfo-article-id": "Page ID",
+       "pageinfo-language": "Page content language",
+       "pageinfo-content-model": "Page content model",
+       "pageinfo-robot-policy": "Indexing by robots",
+       "pageinfo-robot-index": "Allowed",
+       "pageinfo-robot-noindex": "Disallowed",
+       "pageinfo-views": "Number of views",
+       "pageinfo-watchers": "Number of page watchers",
+       "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
+       "pageinfo-redirects-name": "Number of redirects to this page",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Number of subpages of this page",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
+       "pageinfo-firstuser": "Page creator",
+       "pageinfo-firsttime": "Date of page creation",
+       "pageinfo-lastuser": "Latest editor",
+       "pageinfo-lasttime": "Date of latest edit",
+       "pageinfo-edits": "Total number of edits",
+       "pageinfo-authors": "Total number of distinct authors",
+       "pageinfo-recent-edits": "Recent number of edits (within past $1)",
+       "pageinfo-recent-authors": "Recent number of distinct authors",
+       "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)",
+       "pageinfo-hidden-categories": "Hidden {{PLURAL:$1|category|categories}} ($1)",
+       "pageinfo-templates": "Transcluded {{PLURAL:$1|template|templates}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
+       "pageinfo-footer": "-",
+       "pageinfo-toolboxlink": "Page information",
+       "pageinfo-redirectsto": "Redirects to",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Counted as a content page",
+       "pageinfo-contentpage-yes": "Yes",
+       "pageinfo-protect-cascading": "Protections are cascading from here",
+       "pageinfo-protect-cascading-yes": "Yes",
+       "pageinfo-protect-cascading-from": "Protections are cascading from",
+       "pageinfo-category-info": "Category information",
+       "pageinfo-category-pages": "Number of pages",
+       "pageinfo-category-subcats": "Number of subcategories",
+       "pageinfo-category-files": "Number of files",
+       "skinname-cologneblue": "Cologne Blue",
+       "skinname-monobook": "MonoBook",
+       "skinname-modern": "Modern",
+       "skinname-vector": "Vector",
+       "markaspatrolleddiff": "Mark as patrolled",
+       "markaspatrolledlink": "[$1]",
+       "markaspatrolledtext": "Mark this page as patrolled",
+       "markedaspatrolled": "Marked as patrolled",
+       "markedaspatrolledtext": "The selected revision of [[:$1]] 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.",
+       "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
+       "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
+       "markedaspatrollederrornotify": "Marking as patrolled failed.",
+       "patrol-log-page": "Patrol log",
+       "patrol-log-header": "This is a log of patrolled revisions.",
+       "log-show-hide-patrol": "$1 patrol log",
+       "deletedrevision": "Deleted old revision $1",
+       "filedeleteerror-short": "Error deleting file: $1",
+       "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
+       "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
+       "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
+       "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
+       "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
+       "previousdiff": "← Older edit",
+       "nextdiff": "Newer edit →",
+       "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
+       "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
+       "thumbsize": "Thumbnail size:",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
+       "file-info": "file size: $1, MIME type: $2",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
+       "file-nohires": "No higher resolution available.",
+       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-error": "Invalid SVG file: $1",
+       "show-big-image": "Original file",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "file-info-gif-looped": "looped",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-info-png-looped": "looped",
+       "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
+       "newimages": "Gallery of new files",
+       "newimagestext": "-",
+       "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
+       "newimages-summary": "This special page shows the last uploaded files.",
+       "newimages-legend": "Filter",
+       "newimages-label": "Filename (or a part of it):",
+       "newimages-showbots": "Show uploads by bots",
+       "noimages": "Nothing to see.",
+       "ilsubmit": "Search",
+       "bydate": "by date",
+       "sp-newimages-showfrom": "Show new files starting from $2, $1",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 min",
+       "hours-abbrev": "$1 h",
+       "days-abbrev": "$1 d",
+       "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
+       "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
+       "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
+       "days": "{{PLURAL:$1|$1 day|$1 days}}",
+       "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
+       "months": "{{PLURAL:$1|$1 month|$1 months}}",
+       "years": "{{PLURAL:$1|$1 year|$1 years}}",
+       "ago": "$1 ago",
+       "just-now": "just now",
+       "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
+       "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
+       "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
+       "monday-at": "Monday at $1",
+       "tuesday-at": "Tuesday at $1",
+       "wednesday-at": "Wednesday at $1",
+       "thursday-at": "Thursday at $1",
+       "friday-at": "Friday at $1",
+       "saturday-at": "Saturday at $1",
+       "sunday-at": "Sunday at $1",
+       "today-at": "$1",
+       "yesterday-at": "Yesterday at $1",
+       "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
+       "variantname-zh-hans": "hans",
+       "variantname-zh-hant": "hant",
+       "variantname-zh-cn": "cn",
+       "variantname-zh-tw": "tw",
+       "variantname-zh-hk": "hk",
+       "variantname-zh-mo": "mo",
+       "variantname-zh-sg": "sg",
+       "variantname-zh-my": "my",
+       "variantname-zh": "zh",
+       "variantname-gan-hans": "hans",
+       "variantname-gan-hant": "hant",
+       "variantname-gan": "gan",
+       "variantname-sr-ec": "sr-ec",
+       "variantname-sr-el": "sr-el",
+       "variantname-sr": "sr",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
+       "variantname-ku-arab": "ku-Arab",
+       "variantname-ku-latn": "ku-Latn",
+       "variantname-ku": "ku",
+       "variantname-tg-cyrl": "tg-Cyrl",
+       "variantname-tg-latn": "tg-Latn",
+       "variantname-tg": "tg",
+       "variantname-ike-cans": "ike-Cans",
+       "variantname-ike-latn": "ike-Latn",
+       "variantname-iu": "iu",
+       "variantname-shi-tfng": "shi-Tfng",
+       "variantname-shi-latn": "shi-Latn",
+       "variantname-shi": "shi",
+       "variantname-uz": "uz",
+       "variantname-uz-latn": "uz-Latn",
+       "variantname-uz-cyrl": "uz-Cyrl",
+       "metadata": "Metadata",
+       "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-expand": "Show extended details",
+       "metadata-collapse": "Hide extended details",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
+       "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-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-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": "Image width",
+       "exif-pixelxdimension": "Image height",
+       "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-shutterspeedvalue": "APEX shutter speed",
+       "exif-aperturevalue": "APEX aperture",
+       "exif-brightnessvalue": "APEX brightness",
+       "exif-exposurebiasvalue": "APEX 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-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-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",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
+       "exif-jpegfilecomment": "JPEG file comment",
+       "exif-keywords": "Keywords",
+       "exif-worldregioncreated": "World region that the picture was taken in",
+       "exif-countrycreated": "Country that the picture was taken in",
+       "exif-countrycodecreated": "Code for the country that the picture was taken in",
+       "exif-provinceorstatecreated": "Province or state that the picture was taken in",
+       "exif-citycreated": "City that the picture was taken in",
+       "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
+       "exif-worldregiondest": "World region shown",
+       "exif-countrydest": "Country shown",
+       "exif-countrycodedest": "Code for country shown",
+       "exif-provinceorstatedest": "Province or state shown",
+       "exif-citydest": "City shown",
+       "exif-sublocationdest": "Sublocation of city shown",
+       "exif-objectname": "Short title",
+       "exif-specialinstructions": "Special instructions",
+       "exif-headline": "Headline",
+       "exif-credit": "Credit/Provider",
+       "exif-source": "Source",
+       "exif-editstatus": "Editorial status of image",
+       "exif-urgency": "Urgency",
+       "exif-fixtureidentifier": "Fixture name",
+       "exif-locationdest": "Location depicted",
+       "exif-locationdestcode": "Code of location depicted",
+       "exif-objectcycle": "Time of day that media is intended for",
+       "exif-contact": "Contact information",
+       "exif-writer": "Writer",
+       "exif-languagecode": "Language",
+       "exif-iimversion": "IIM version",
+       "exif-iimcategory": "Category",
+       "exif-iimsupplementalcategory": "Supplemental categories",
+       "exif-datetimeexpires": "Do not use after",
+       "exif-datetimereleased": "Released on",
+       "exif-originaltransmissionref": "Original transmission location code",
+       "exif-identifier": "Identifier",
+       "exif-lens": "Lens used",
+       "exif-serialnumber": "Serial number of camera",
+       "exif-cameraownername": "Owner of camera",
+       "exif-label": "Label",
+       "exif-datetimemetadata": "Date metadata was last modified",
+       "exif-nickname": "Informal name of image",
+       "exif-rating": "Rating (out of 5)",
+       "exif-rightscertificate": "Rights management certificate",
+       "exif-copyrighted": "Copyright status",
+       "exif-copyrightowner": "Copyright owner",
+       "exif-usageterms": "Usage terms",
+       "exif-webstatement": "Online copyright statement",
+       "exif-originaldocumentid": "Unique ID of original document",
+       "exif-licenseurl": "URL for copyright license",
+       "exif-morepermissionsurl": "Alternative licensing information",
+       "exif-attributionurl": "When re-using this work, please link to",
+       "exif-preferredattributionname": "When re-using this work, please credit",
+       "exif-pngfilecomment": "PNG file comment",
+       "exif-disclaimer": "Disclaimer",
+       "exif-contentwarning": "Content warning",
+       "exif-giffilecomment": "GIF file comment",
+       "exif-intellectualgenre": "Type of item",
+       "exif-subjectnewscode": "Subject code",
+       "exif-scenecode": "IPTC scene code",
+       "exif-event": "Event depicted",
+       "exif-organisationinimage": "Organization depicted",
+       "exif-personinimage": "Person depicted",
+       "exif-originalimageheight": "Height of image before it was cropped",
+       "exif-originalimagewidth": "Width of image before it was cropped",
+       "exif-make-value": "$1",
+       "exif-model-value": "$1",
+       "exif-software-value": "$1",
+       "exif-software-version-value": "$1 (Version $2)",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
+       "exif-compression-1": "Uncompressed",
+       "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
+       "exif-compression-3": "CCITT Group 3 fax encoding",
+       "exif-compression-4": "CCITT Group 4 fax encoding",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (old)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-8": "Deflate (Adobe)",
+       "exif-compression-32773": "PackBits (Macintosh RLE)",
+       "exif-compression-32946": "Deflate (PKZIP)",
+       "exif-compression-34712": "JPEG2000",
+       "exif-copyrighted-true": "Copyrighted",
+       "exif-copyrighted-false": "Copyright status not set",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-6": "YCbCr",
+       "exif-unknowndate": "Unknown date",
+       "exif-orientation-1": "Normal",
+       "exif-orientation-2": "Flipped horizontally",
+       "exif-orientation-3": "Rotated 180°",
+       "exif-orientation-4": "Flipped vertically",
+       "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
+       "exif-orientation-6": "Rotated 90° CCW",
+       "exif-orientation-7": "Rotated 90° CW and flipped vertically",
+       "exif-orientation-8": "Rotated 90° CW",
+       "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-65535": "Uncalibrated",
+       "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 meters",
+       "exif-meteringmode-0": "Unknown",
+       "exif-meteringmode-1": "Average",
+       "exif-meteringmode-2": "Center weighted average",
+       "exif-meteringmode-3": "Spot",
+       "exif-meteringmode-4": "Multi-Spot",
+       "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-flash-fired-0": "Flash did not fire",
+       "exif-flash-fired-1": "Flash fired",
+       "exif-flash-return-0": "no strobe return detection function",
+       "exif-flash-return-2": "strobe return light not detected",
+       "exif-flash-return-3": "strobe return light detected",
+       "exif-flash-mode-1": "compulsory flash firing",
+       "exif-flash-mode-2": "compulsory flash suppression",
+       "exif-flash-mode-3": "auto mode",
+       "exif-flash-function-1": "No flash function",
+       "exif-flash-redeye-1": "red-eye reduction mode",
+       "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": "Digital still camera",
+       "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",
+       "exif-gpslatitude-n": "North latitude",
+       "exif-gpslatitude-s": "South latitude",
+       "exif-gpslongitude-e": "East longitude",
+       "exif-gpslongitude-w": "West longitude",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
+       "exif-gpsstatus-a": "Measurement in progress",
+       "exif-gpsstatus-v": "Measurement interoperability",
+       "exif-gpsmeasuremode-2": "2-dimensional measurement",
+       "exif-gpsmeasuremode-3": "3-dimensional measurement",
+       "exif-gpsspeed-k": "Kilometers per hour",
+       "exif-gpsspeed-m": "Miles per hour",
+       "exif-gpsspeed-n": "Knots",
+       "exif-gpsdestdistance-k": "Kilometers",
+       "exif-gpsdestdistance-m": "Miles",
+       "exif-gpsdestdistance-n": "Nautical miles",
+       "exif-gpsdop-excellent": "Excellent ($1)",
+       "exif-gpsdop-good": "Good ($1)",
+       "exif-gpsdop-moderate": "Moderate ($1)",
+       "exif-gpsdop-fair": "Fair ($1)",
+       "exif-gpsdop-poor": "Poor ($1)",
+       "exif-objectcycle-a": "Morning only",
+       "exif-objectcycle-p": "Evening only",
+       "exif-objectcycle-b": "Both morning and evening",
+       "exif-gpsdirection-t": "True direction",
+       "exif-gpsdirection-m": "Magnetic direction",
+       "exif-ycbcrpositioning-1": "Centered",
+       "exif-ycbcrpositioning-2": "Co-sited",
+       "exif-dc-contributor": "Contributors",
+       "exif-dc-coverage": "Spatial or temporal scope of media",
+       "exif-dc-date": "Date(s)",
+       "exif-dc-publisher": "Publisher",
+       "exif-dc-relation": "Related media",
+       "exif-dc-rights": "Rights",
+       "exif-dc-source": "Source media",
+       "exif-dc-type": "Type of media",
+       "exif-rating-rejected": "Rejected",
+       "exif-isospeedratings-overflow": "Greater than 65535",
+       "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
+       "exif-iimcategory-ace": "Arts, culture and entertainment",
+       "exif-iimcategory-clj": "Crime and law",
+       "exif-iimcategory-dis": "Disasters and accidents",
+       "exif-iimcategory-fin": "Economy and business",
+       "exif-iimcategory-edu": "Education",
+       "exif-iimcategory-evn": "Environment",
+       "exif-iimcategory-hth": "Health",
+       "exif-iimcategory-hum": "Human interest",
+       "exif-iimcategory-lab": "Labor",
+       "exif-iimcategory-lif": "Lifestyle and leisure",
+       "exif-iimcategory-pol": "Politics",
+       "exif-iimcategory-rel": "Religion and belief",
+       "exif-iimcategory-sci": "Science and technology",
+       "exif-iimcategory-soi": "Social issues",
+       "exif-iimcategory-spo": "Sports",
+       "exif-iimcategory-war": "War, conflict and unrest",
+       "exif-iimcategory-wea": "Weather",
+       "exif-urgency-normal": "Normal ($1)",
+       "exif-urgency-low": "Low ($1)",
+       "exif-urgency-high": "High ($1)",
+       "exif-urgency-other": "User-defined priority ($1)",
+       "watchlistall2": "all",
+       "namespacesall": "all",
+       "monthsall": "all",
+       "confirmemail": "Confirm email address",
+       "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
+       "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
+       "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
+       "confirmemail_send": "Mail a confirmation code",
+       "confirmemail_sent": "Confirmation email sent.",
+       "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
+       "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
+       "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
+       "confirmemail_needlogin": "Please $1 to confirm your email address.",
+       "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
+       "confirmemail_loggedin": "Your email address has now been confirmed.",
+       "confirmemail_subject": "{{SITENAME}} email address confirmation",
+       "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_invalidated": "Email address confirmation canceled",
+       "invalidateemail": "Cancel email confirmation",
+       "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
+       "scarytranscludefailed": "[Template fetch failed for $1]",
+       "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
+       "scarytranscludetoolong": "[URL is too long]",
+       "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
+       "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
+       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
+       "recreate": "Recreate",
+       "unit-pixel": "px",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Clear the cache of this page?",
+       "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Add this page to your watchlist?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Remove this page from your watchlist?",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "autocomment-prefix": "",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← previous page",
+       "imgmultipagenext": "next page →",
+       "imgmultigo": "Go!",
+       "imgmultigoto": "Go to page $1",
+       "img-lang-opt": "$2 ($1)",
+       "img-lang-default": "(default language)",
+       "img-lang-info": "Render this image in $1. $2",
+       "img-lang-go": "Go",
+       "ascending_abbrev": "asc",
+       "descending_abbrev": "desc",
+       "table_pager_next": "Next page",
+       "table_pager_prev": "Previous page",
+       "table_pager_first": "First page",
+       "table_pager_last": "Last page",
+       "table_pager_limit": "Show $1 items per page",
+       "table_pager_limit_label": "Items per page:",
+       "table_pager_limit_submit": "Go",
+       "table_pager_empty": "No results",
+       "autosumm-blank": "Blanked the page",
+       "autosumm-replace": "Replaced content with \"$1\"",
+       "autoredircomment": "Redirected page to [[$1]]",
+       "autosumm-new": "Created page with \"$1\"",
+       "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
+       "size-bytes": "$1 B",
+       "size-kilobytes": "$1 KB",
+       "size-megabytes": "$1 MB",
+       "size-gigabytes": "$1 GB",
+       "size-terabytes": "$1 TB",
+       "size-petabytes": "$1 PB",
+       "size-exabytes": "$1 EB",
+       "size-zetabytes": "$1 ZB",
+       "size-yottabytes": "$1 YB",
+       "bitrate-bits": "$1 bps",
+       "bitrate-kilobits": "$1 kbps",
+       "bitrate-megabits": "$1 Mbps",
+       "bitrate-gigabits": "$1 Gbps",
+       "bitrate-terabits": "$1 Tbps",
+       "bitrate-petabits": "$1 Pbps",
+       "bitrate-exabits": "$1 Ebps",
+       "bitrate-zetabits": "$1 Zbps",
+       "bitrate-yottabits": "$1 Ybps",
+       "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "editwatchlist-summary": "",
+       "watchlistedit-normal-title": "Edit watchlist",
+       "watchlistedit-normal-legend": "Remove titles from watchlist",
+       "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
+       "watchlistedit-normal-submit": "Remove titles",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
+       "watchlistedit-raw-title": "Edit raw watchlist",
+        "watchlistedit-raw-legend": "Edit raw watchlist",
+       "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
+        "watchlistedit-raw-titles": "Titles:",
+        "watchlistedit-raw-submit": "Update watchlist",
+        "watchlistedit-raw-done": "Your watchlist has been updated.",
+        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
+        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-clear-title": "Cleared watchlist",
+       "watchlistedit-clear-legend": "Clear watchlist",
+       "watchlistedit-clear-explain": "All of the titles will be removed from your watchlist",
+       "watchlistedit-clear-titles": "Titles:",
+       "watchlistedit-clear-submit": "Clear the watchlist (This is permanent!)",
+       "watchlistedit-clear-done": "Your watchlist has been cleared.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-too-many": "There are too many pages to display here.",
+       "watchlisttools-clear": "Clear the watchlist",
+       "watchlisttools-view": "View relevant changes",
+       "watchlisttools-edit": "View and edit watchlist",
+       "watchlisttools-raw": "Edit raw watchlist",
+       "iranian-calendar-m1": "Farvardin",
+       "iranian-calendar-m2": "Ordibehesht",
+       "iranian-calendar-m3": "Khordad",
+       "iranian-calendar-m4": "Tir",
+       "iranian-calendar-m5": "Mordad",
+       "iranian-calendar-m6": "Shahrivar",
+       "iranian-calendar-m7": "Mehr",
+       "iranian-calendar-m8": "Aban",
+       "iranian-calendar-m9": "Azar",
+       "iranian-calendar-m10": "Dey",
+       "iranian-calendar-m11": "Bahman",
+       "iranian-calendar-m12": "Esfand",
+       "hijri-calendar-m1": "Muharram",
+       "hijri-calendar-m2": "Safar",
+       "hijri-calendar-m3": "Rabi' al-awwal",
+       "hijri-calendar-m4": "Rabi' al-thani",
+       "hijri-calendar-m5": "Jumada al-awwal",
+       "hijri-calendar-m6": "Jumada al-thani",
+       "hijri-calendar-m7": "Rajab",
+       "hijri-calendar-m8": "Sha'aban",
+       "hijri-calendar-m9": "Ramadan",
+       "hijri-calendar-m10": "Shawwal",
+       "hijri-calendar-m11": "Dhu al-Qi'dah",
+       "hijri-calendar-m12": "Dhu al-Hijjah",
+       "hebrew-calendar-m1": "Tishrei",
+       "hebrew-calendar-m2": "Cheshvan",
+       "hebrew-calendar-m3": "Kislev",
+       "hebrew-calendar-m4": "Tevet",
+       "hebrew-calendar-m5": "Shevat",
+       "hebrew-calendar-m6": "Adar",
+       "hebrew-calendar-m6a": "Adar I",
+       "hebrew-calendar-m6b": "Adar II",
+       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m8": "Iyar",
+       "hebrew-calendar-m9": "Sivan",
+       "hebrew-calendar-m10": "Tamuz",
+       "hebrew-calendar-m11": "Av",
+       "hebrew-calendar-m12": "Elul",
+       "hebrew-calendar-m1-gen": "Tishrei",
+       "hebrew-calendar-m2-gen": "Cheshvan",
+       "hebrew-calendar-m3-gen": "Kislev",
+       "hebrew-calendar-m4-gen": "Tevet",
+       "hebrew-calendar-m5-gen": "Shevat",
+       "hebrew-calendar-m6-gen": "Adar",
+       "hebrew-calendar-m6a-gen": "Adar I",
+       "hebrew-calendar-m6b-gen": "Adar II",
+       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m8-gen": "Iyar",
+       "hebrew-calendar-m9-gen": "Sivan",
+       "hebrew-calendar-m10-gen": "Tamuz",
+       "hebrew-calendar-m11-gen": "Av",
+       "hebrew-calendar-m12-gen": "Elul",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
+       "timezone-utc": "UTC",
+       "unknown_extension_tag": "Unknown extension tag \"$1\"",
+       "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
+       "version": "Version",
+       "version-summary": "",
+       "version-extensions": "Installed extensions",
+       "version-specialpages": "Special pages",
+       "version-parserhooks": "Parser hooks",
+       "version-variables": "Variables",
+       "version-antispam": "Spam prevention",
+       "version-skins": "Skins",
+       "version-api": "API",
+       "version-other": "Other",
+       "version-mediahandlers": "Media handlers",
+       "version-hooks": "Hooks",
+       "version-parser-extensiontags": "Parser extension tags",
+       "version-parser-function-hooks": "Parser function hooks",
+       "version-hook-name": "Hook name",
+       "version-hook-subscribedby": "Subscribed by",
+       "version-version": "($1)",
+       "version-svn-revision": "r$1",
+       "version-license": "MediaWiki License",
+       "version-ext-license": "License",
+       "version-ext-colheader-name": "Extension",
+       "version-ext-colheader-version": "Version",
+       "version-ext-colheader-license": "License",
+       "version-ext-colheader-description": "Description",
+       "version-ext-colheader-credits": "Authors",
+       "version-license-title": "License for $1",
+       "version-license-not-found": "No detailed license information was found for this extension.",
+       "version-credits-title": "Credits for $1",
+       "version-credits-not-found": "No detailed credits information was found for this extension.",
+       "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "others",
+       "version-poweredby-translators": "translatewiki.net translators",
+       "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki 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.\n\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
+       "version-software": "Installed software",
+       "version-software-product": "Product",
+       "version-software-version": "Version",
+       "version-db-mysql-url": "http://www.mysql.com/",
+       "version-db-mariadb-url": "http://mariadb.org/",
+       "version-db-percona-url": "http://www.percona.com/software/percona-server",
+       "version-db-postgres-url": "http://www.postgresql.org/",
+       "version-db-oracle-url": "http://www.oracle.com/database/",
+       "version-db-sqlite-url": "http://www.sqlite.org/",
+       "version-db-mssql-url": "http://www.microsoft.com/sql/",
+       "version-entrypoints": "Entry point URLs",
+       "version-entrypoints-header-entrypoint": "Entry point",
+       "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
+       "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
+       "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
+       "redirect": "Redirect by file, user, page or revision ID",
+       "redirect-legend": "Redirect to a file or page",
+       "redirect-text": "",
+       "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Go",
+       "redirect-lookup": "Lookup:",
+       "redirect-value": "Value:",
+       "redirect-user": "User ID",
+       "redirect-page": "Page ID",
+       "redirect-revision": "Page revision",
+       "redirect-file": "File name",
+       "redirect-not-exists": "Value not found",
+       "fileduplicatesearch": "Search for duplicate files",
+       "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
+       "fileduplicatesearch-legend": "Search for a duplicate",
+       "fileduplicatesearch-filename": "Filename:",
+       "fileduplicatesearch-submit": "Search",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
+       "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
+       "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
+       "fileduplicatesearch-noresults": "No file named \"$1\" found.",
+       "specialpages": "Special pages",
+       "specialpages-summary": "",
+       "specialpages-note-top": "Legend",
+       "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
+       "specialpages-group-maintenance": "Maintenance reports",
+       "specialpages-group-other": "Other special pages",
+       "specialpages-group-login": "Login / create account",
+       "specialpages-group-changes": "Recent changes and logs",
+       "specialpages-group-media": "Media reports and uploads",
+       "specialpages-group-users": "Users and rights",
+       "specialpages-group-highuse": "High use pages",
+       "specialpages-group-pages": "Lists of pages",
+       "specialpages-group-pagetools": "Page tools",
+       "specialpages-group-wiki": "Data and tools",
+       "specialpages-group-redirects": "Redirecting special pages",
+       "specialpages-group-spam": "Spam tools",
+       "blankpage": "Blank page",
+       "intentionallyblankpage": "This page is intentionally left blank.",
+       "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
+       "tags": "Valid change tags",
+       "tags-summary": "",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-filter-submit": "Filter",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tags-title": "Tags",
+       "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
+       "tags-tag": "Tag name",
+       "tags-display-header": "Appearance on change lists",
+       "tags-description-header": "Full description of meaning",
+       "tags-active-header": "Active?",
+       "tags-hitcount-header": "Tagged changes",
+       "tags-active-yes": "Yes",
+       "tags-active-no": "No",
+       "tags-edit": "edit",
+       "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
+       "comparepages": "Compare pages",
+       "comparepages-summary": "",
+       "compare-page1": "Page 1",
+       "compare-page2": "Page 2",
+       "compare-rev1": "Revision 1",
+       "compare-rev2": "Revision 2",
+       "compare-submit": "Compare",
+       "compare-invalid-title": "The title you specified is invalid.",
+       "compare-title-not-exists": "The title you specified does not exist.",
+       "compare-revision-not-exists": "The revision you specified does not exist.",
+       "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
+       "dberr-again": "Try waiting a few minutes and reloading.",
+       "dberr-info": "(Cannot contact the database server: $1)",
+       "dberr-info-hidden": "(Cannot contact the database server)",
+       "dberr-usegoogle": "You can try searching via Google in the meantime.",
+       "dberr-outofdate": "Note that their indexes of our content may be out of date.",
+       "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
+       "htmlform-invalid-input": "There are problems with some of your input.",
+       "htmlform-select-badoption": "The value you specified is not a valid option.",
+       "htmlform-int-invalid": "The value you specified is not an integer.",
+       "htmlform-float-invalid": "The value you specified is not a number.",
+       "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
+       "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
+       "htmlform-required": "This value is required.",
+       "htmlform-submit": "Submit",
+       "htmlform-reset": "Undo changes",
+       "htmlform-selectorother-other": "Other",
+       "htmlform-no": "No",
+       "htmlform-yes": "Yes",
+       "htmlform-chosen-placeholder": "Select an option",
        "htmlform-cloner-create": "Add more",
        "htmlform-cloner-delete": "Remove",
        "htmlform-cloner-required": "At least one value is required.",
-    "sqlite-has-fts": "$1 with full-text search support",
-    "sqlite-no-fts": "$1 without full-text search support",
-    "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
-    "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
-    "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
-    "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "revdelete-content-hid": "content hidden",
-    "revdelete-summary-hid": "edit summary hidden",
-    "revdelete-uname-hid": "username hidden",
-    "revdelete-content-unhid": "content unhidden",
-    "revdelete-summary-unhid": "edit summary unhidden",
-    "revdelete-uname-unhid": "username unhidden",
-    "revdelete-restricted": "applied restrictions to administrators",
-    "revdelete-unrestricted": "removed restrictions for administrators",
-    "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
-    "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
-    "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
-    "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
-    "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
-    "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
-    "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
-    "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
-    "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
-    "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
-    "rightsnone": "(none)",
-    "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
-    "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
-    "revdelete-content": "content",
-    "revdelete-summary": "edit summary",
-    "revdelete-uname": "username",
-    "revdelete-hid": "hid $1",
-    "revdelete-unhid": "unhid $1",
-    "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
-    "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
-    "deletedarticle": "deleted \"[[$1]]\"",
-    "suppressedarticle": "suppressed \"[[$1]]\"",
-    "undeletedarticle": "restored \"[[$1]]\"",
-    "patrol-log-line": "marked $1 of $2 patrolled $3",
-    "patrol-log-auto": "(automatic)",
-    "patrol-log-diff": "revision $1",
-    "1movedto2": "moved [[$1]] to [[$2]]",
-    "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
-    "move-redirect-suppressed": "redirect suppressed",
-    "newuserlog-create-entry": "New user account",
-    "newuserlog-create2-entry": "created new account $1",
-    "newuserlog-autocreate-entry": "Account created automatically",
-    "rightslogentry": "changed group membership for $1 from $2 to $3",
-    "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
-    "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
-    "feedback-subject": "Subject:",
-    "feedback-message": "Message:",
-    "feedback-cancel": "Cancel",
-    "feedback-submit": "Submit Feedback",
-    "feedback-adding": "Adding feedback to page...",
-    "feedback-error1": "Error: Unrecognized result from API",
-    "feedback-error2": "Error: Edit failed",
-    "feedback-error3": "Error: No response from API",
-    "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
-    "feedback-close": "Done",
-    "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
-    "feedback-bugnew": "I checked. Report a new bug",
-    "searchsuggest-search": "Search",
-    "searchsuggest-containing": "containing...",
-    "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
-    "api-error-badtoken": "Internal error: Bad token.",
-    "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-    "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-    "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-    "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-    "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
-    "api-error-empty-file": "The file you submitted was empty.",
-    "api-error-emptypage": "Creating new, empty pages is not allowed.",
-    "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
-    "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
-    "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
-    "api-error-file-too-large": "The file you submitted was too large.",
-    "api-error-filename-tooshort": "The filename is too short.",
-    "api-error-filetype-banned": "This type of file is banned.",
-    "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "api-error-filetype-missing": "The filename is missing an extension.",
-    "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
-    "api-error-http": "Internal error: Unable to connect to server.",
-    "api-error-illegal-filename": "The filename is not allowed.",
-    "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
-    "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
-    "api-error-missingparam": "Internal error: Missing parameters on request.",
-    "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
-    "api-error-mustbeloggedin": "You must be logged in to upload files.",
-    "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
-    "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
-    "api-error-nomodule": "Internal error: No upload module set.",
-    "api-error-ok-but-empty": "Internal error: No response from server.",
-    "api-error-overwrite": "Overwriting an existing file is not allowed.",
-    "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
-    "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
-    "api-error-stasherror": "There was an error while uploading the file to stash.",
-    "api-error-timeout": "The server did not respond within the expected time.",
-    "api-error-unclassified": "An unknown error occurred.",
-    "api-error-unknown-code": "Unknown error: \"$1\".",
-    "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
-    "api-error-unknown-warning": "Unknown warning: \"$1\".",
-    "api-error-unknownerror": "Unknown error: \"$1\".",
-    "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
-    "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
-    "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
-    "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
-    "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
-    "duration-days": "$1 {{PLURAL:$1|day|days}}",
-    "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
-    "duration-years": "$1 {{PLURAL:$1|year|years}}",
-    "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
-    "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
-    "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
-    "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
-    "limitreport-title": "Parser profiling data:",
-    "limitreport-cputime": "CPU time usage",
-    "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-walltime": "Real time usage",
-    "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-ppvisitednodes": "Preprocessor visited node count",
-    "limitreport-ppvisitednodes-value": "$1/$2",
-    "limitreport-ppgeneratednodes": "Preprocessor generated node count",
-    "limitreport-ppgeneratednodes-value": "$1/$2",
-    "limitreport-postexpandincludesize": "Post-expand include size",
-    "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-templateargumentsize": "Template argument size",
-    "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-expansiondepth": "Highest expansion depth",
-    "limitreport-expansiondepth-value": "$1/$2",
-    "limitreport-expensivefunctioncount": "Expensive parser function count",
-    "limitreport-expensivefunctioncount-value": "$1/$2",
-    "expandtemplates": "Expand templates",
-    "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
-    "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
-    "expand_templates_input": "Input text:",
-    "expand_templates_output": "Result",
-    "expand_templates_xml_output": "XML output",
-    "expand_templates_html_output": "Raw HTML output",
-    "expand_templates_ok": "OK",
-    "expand_templates_remove_comments": "Remove comments",
-    "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
-    "expand_templates_generate_xml": "Show XML parse tree",
-    "expand_templates_generate_rawhtml": "Show raw HTML",
-    "expand_templates_preview": "Preview"
+       "sqlite-has-fts": "$1 with full-text search support",
+       "sqlite-no-fts": "$1 without full-text search support",
+       "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
+       "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "revdelete-content-hid": "content hidden",
+       "revdelete-summary-hid": "edit summary hidden",
+       "revdelete-uname-hid": "username hidden",
+       "revdelete-content-unhid": "content unhidden",
+       "revdelete-summary-unhid": "edit summary unhidden",
+       "revdelete-uname-unhid": "username unhidden",
+       "revdelete-restricted": "applied restrictions to administrators",
+       "revdelete-unrestricted": "removed restrictions for administrators",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
+       "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
+       "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
+       "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
+       "rightsnone": "(none)",
+       "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
+       "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
+       "revdelete-content": "content",
+       "revdelete-summary": "edit summary",
+       "revdelete-uname": "username",
+       "revdelete-hid": "hid $1",
+       "revdelete-unhid": "unhid $1",
+       "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
+       "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
+       "deletedarticle": "deleted \"[[$1]]\"",
+       "suppressedarticle": "suppressed \"[[$1]]\"",
+       "undeletedarticle": "restored \"[[$1]]\"",
+       "patrol-log-line": "marked $1 of $2 patrolled $3",
+       "patrol-log-auto": "(automatic)",
+       "patrol-log-diff": "revision $1",
+       "1movedto2": "moved [[$1]] to [[$2]]",
+       "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
+       "move-redirect-suppressed": "redirect suppressed",
+       "newuserlog-create-entry": "New user account",
+       "newuserlog-create2-entry": "created new account $1",
+       "newuserlog-autocreate-entry": "Account created automatically",
+       "rightslogentry": "changed group membership for $1 from $2 to $3",
+       "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
+       "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
+       "feedback-subject": "Subject:",
+       "feedback-message": "Message:",
+       "feedback-cancel": "Cancel",
+       "feedback-submit": "Submit Feedback",
+       "feedback-adding": "Adding feedback to page...",
+       "feedback-error1": "Error: Unrecognized result from API",
+       "feedback-error2": "Error: Edit failed",
+       "feedback-error3": "Error: No response from API",
+       "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
+       "feedback-close": "Done",
+       "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
+       "feedback-bugnew": "I checked. Report a new bug",
+       "searchsuggest-search": "Search",
+       "searchsuggest-containing": "containing...",
+       "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
+       "api-error-badtoken": "Internal error: Bad token.",
+       "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
+       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
+       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
+       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
+       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "api-error-empty-file": "The file you submitted was empty.",
+       "api-error-emptypage": "Creating new, empty pages is not allowed.",
+       "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
+       "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
+       "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
+       "api-error-file-too-large": "The file you submitted was too large.",
+       "api-error-filename-tooshort": "The filename is too short.",
+       "api-error-filetype-banned": "This type of file is banned.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "api-error-filetype-missing": "The filename is missing an extension.",
+       "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
+       "api-error-http": "Internal error: Unable to connect to server.",
+       "api-error-illegal-filename": "The filename is not allowed.",
+       "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
+       "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
+       "api-error-missingparam": "Internal error: Missing parameters on request.",
+       "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
+       "api-error-mustbeloggedin": "You must be logged in to upload files.",
+       "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
+       "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
+       "api-error-nomodule": "Internal error: No upload module set.",
+       "api-error-ok-but-empty": "Internal error: No response from server.",
+       "api-error-overwrite": "Overwriting an existing file is not allowed.",
+       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
+       "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
+       "api-error-stasherror": "There was an error while uploading the file to stash.",
+       "api-error-timeout": "The server did not respond within the expected time.",
+       "api-error-unclassified": "An unknown error occurred.",
+       "api-error-unknown-code": "Unknown error: \"$1\".",
+       "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
+       "api-error-unknown-warning": "Unknown warning: \"$1\".",
+       "api-error-unknownerror": "Unknown error: \"$1\".",
+       "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
+       "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
+       "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
+       "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
+       "duration-days": "$1 {{PLURAL:$1|day|days}}",
+       "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
+       "duration-years": "$1 {{PLURAL:$1|year|years}}",
+       "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
+       "limitreport-title": "Parser profiling data:",
+       "limitreport-cputime": "CPU time usage",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-walltime": "Real time usage",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-ppvisitednodes": "Preprocessor visited node count",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Preprocessor generated node count",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "Post-expand include size",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-templateargumentsize": "Template argument size",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-expansiondepth": "Highest expansion depth",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "Expensive parser function count",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expandtemplates": "Expand templates",
+       "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
+       "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
+       "expand_templates_input": "Input text:",
+       "expand_templates_output": "Result",
+       "expand_templates_xml_output": "XML output",
+       "expand_templates_html_output": "Raw HTML output",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Remove comments",
+       "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
+       "expand_templates_generate_xml": "Show XML parse tree",
+       "expand_templates_generate_rawhtml": "Show raw HTML",
+       "expand_templates_preview": "Preview"
 }
index 85f0c9a..dd696b5 100644 (file)
        "blockip": "Forbari uzanton/IP-adreson",
        "blockip-legend": "Forbari uzanton",
        "blockiptext": "Per jena formularo vi povas forpreni de ajna nomo aŭ IP-adreso la rajton skribi en la vikio. Oni faru tion ''nur'' por eviti vandalismon, kaj sekvante la [[{{MediaWiki:Policy-url}}|regulojn pri forbarado]]. Klarigu la precizan kialon malsupre (ekzemple, citu paĝojn, kiuj estis vandaligitaj).",
-       "ipadressorusername": "IP-adreso aŭ salutnomo:",
+       "ipaddressorusername": "IP-adreso aŭ salutnomo:",
        "ipbexpiry": "Blokdaŭro",
        "ipbreason": "Kialo:",
        "ipbreason-dropdown": "*Oftaj kialoj de forbaro\n** Enmetas malveraĵojn\n** Forviŝas entenon el paĝoj\n** Entrudas ligilojn al eksteraj paĝaroj\n** Enmetas sensencaĵojn\n** Terurigema sinteno\n** Misuzo de pluraj salutnomoj\n** Neakceptebla uzanto-nomo",
        "newimages-summary": "Ĉi tiu speciala paĝo montras la lastajn alŝutitajn dosierojn.",
        "newimages-legend": "Dosiernomo",
        "newimages-label": "Dosiernomo (aŭ parto de ĝi):",
-       "showhidebots": "($1 robotojn)",
        "noimages": "Nenio videbla.",
        "ilsubmit": "Serĉi",
        "bydate": "laŭ dato",
index 9ac3216..041ad94 100644 (file)
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
-       "tog-ccmeonemails": "Recibir copias de los correos que envío a otros usuarios",
+       "tog-ccmeonemails": "Recibir copias de los mensajes que envíe a otros usuarios",
        "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
        "tog-showhiddencats": "Mostrar las categorías escondidas",
        "tog-norollbackdiff": "Omitir la diferencia después de revertir",
        "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
        "databaseerror": "Error de la base de datos",
-       "databaseerror-text": "Se ha producido un error en la base de datos.\nEsto puede indicar un bug en el software.",
+       "databaseerror-text": "Ocurrió un error de consulta de la base de datos.\nEsto puede indicar un fallo en el software.",
        "databaseerror-textcl": "Se ha producido un error en la base de datos.",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
        "viewyourtext": "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "editinginterface": "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "editinginterface": "<strong>Aviso:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "mycustomjsprotected": "No tienes permiso para editar esta página JavaScript.",
        "myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
        "mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
-       "ns-specialprotected": "Las páginas especiales no se pueden editar",
+       "ns-specialprotected": "No se pueden editar las páginas especiales.",
        "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
        "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
        "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
        "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
-       "virus-badscanner": "Error de configuración: Antivirus desconocido: ''$1''",
+       "virus-badscanner": "Configuración incorrecta: antivirus desconocido: <em>$1</em>",
        "virus-scanfailed": "falló el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
-       "logouttext": "\"'Usted está ahora desconectado.\"'\nTenga en cuenta que algunas páginas pueden continuar mostrándose como si todavía estuviera conectado, hasta que borres la caché de tu navegador.",
+       "logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
        "welcomeuser": "¡Te damos la bienvenida, $1!",
        "welcomecreation-msg": "Se ha creado tu cuenta.\nNo olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].",
        "yourname": "Nombre de usuario:",
        "remembermypassword": "Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})",
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
-       "yourdomainname": "Dominio",
+       "yourdomainname": "Tu dominio:",
        "password-change-forbidden": "No puedes cambiar las contraseñas de este wiki.",
        "externaldberror": "Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Acceder",
        "login-userblocked": "Este usuario está bloqueado. Inicio de sesión no permitido.",
        "wrongpassword": "La contraseña indicada es incorrecta.\nInténtalo de nuevo.",
        "wrongpasswordempty": "No has escrito una contraseña.\nInténtalo de nuevo.",
-       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 caracter|$1 caracteres}}.",
+       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
        "createacct-another-realname-tip": "El nombre real es opcional.\nSi se proporciona, se usará para dar al usuario la atribución de su trabajo.",
-       "pt-login": "Iniciar sesión",
-       "pt-login-button": "Iniciar sesión",
+       "pt-login": "Acceder",
+       "pt-login-button": "Acceder",
        "pt-createaccount": "Crear una cuenta",
-       "pt-userlogout": "Cerrar sesión",
+       "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Error desconocido en la función mail() de PHP.",
        "user-mail-no-addy": "Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.",
        "user-mail-no-body": "Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "La contraseña antigua no es correcta.\nPuede que ya hayas cambiado la contraseña o que hayas pedido una temporal.",
-       "resetpass-recycled": "Por favor, restablece tu contraseña a algo distinto de tu contraseña actual.",
+       "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
        "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar la sesión, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "right-move": "Trasladar páginas",
        "right-move-subpages": "Trasladar páginas con sus subpáginas",
        "right-move-rootuserpages": "Trasladar páginas de usuario raíz",
+       "right-move-categorypages": "Trasladar páginas de categoría",
        "right-movefile": "Trasladar archivos",
        "right-suppressredirect": "No crear redirecciones de las páginas fuente  al trasladar páginas",
        "right-upload": "Subir archivos",
        "action-move": "trasladar esta página",
        "action-move-subpages": "trasladar esta página y sus subpáginas",
        "action-move-rootuserpages": "trasladar páginas de usuario raíz",
+       "action-move-categorypages": "trasladar páginas de categoría",
        "action-movefile": "trasladar este archivo",
        "action-upload": "subir este archivo",
        "action-reupload": "reemplazar este archivo existente",
        "log-title-wildcard": "Buscar títulos que empiecen con este texto",
        "showhideselectedlogentries": "Mostrar u ocultar las entradas seleccionadas del registro",
        "allpages": "Todas las páginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Siguiente página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Mostrar páginas que empiecen por:",
        "trackingcategories-disabled": "La categoría está desactivada",
        "mailnologin": "Ninguna dirección de envio",
        "mailnologintext": "Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.",
-       "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
-       "emailuser-title-target": "Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}",
+       "emailuser": "Enviar un mensaje de correo a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
+       "emailuser-title-target": "Enviar un mensaje a {{GENDER:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Enviar un correo electrónico al usuario",
-       "emailpage": "Enviar un correo electrónico a un usuario",
+       "emailpage": "Enviar mensaje al usuario",
        "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
        "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
        "usermaildisabled": "Correo electrónico del usuario deshabilitado",
        "blockip": "Bloquear usuario",
        "blockip-legend": "Bloquear usuario",
        "blockiptext": "Usa el siguiente formulario para bloquear el acceso de escritura desde una dirección IP específica o nombre de usuario.\nEsto debería hacerse sólo para prevenir vandalismos, y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).",
-       "ipadressorusername": "Dirección IP o nombre de usuario:",
+       "ipaddressorusername": "Dirección IP o nombre de usuario:",
        "ipbexpiry": "Caducidad:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos comunes de bloqueo\n** Añadir información falsa\n** Eliminar contenido de las páginas\n** Publicitar enlaces a otras páginas web\n** Añadir basura a las páginas\n** Comportamiento intimidatorio u hostil\n** Abuso de múltiples cuentas\n** Nombre de usuario inaceptable",
        "movepagetalktext": "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''\n*Estés trasladando la página entre espacios de nombres diferentes,\n*Una página de discusión no vacía ya exista con el nombre nuevo, o\n*No marques el recuadro «Renombrar la página de discusión asociada».\n\nEn estos casos, deberás trasladar manualmente el contenido de la página de discusión.",
        "movearticle": "Renombrar página",
        "moveuserpage-warning": "'''Aviso:''' estás a punto de trasladar una página de usuario. Ten en cuenta que solo será trasladada la página; el usuario '''no''' será renombrado.",
+       "movecategorypage-warning": "<strong>Advertencia:</strong> Estás a punto de trasladar una página de categoría. Ten en cuenta que se trasladará sólo la página y las páginas en la antigua categoría <em>no</em> serán recategorizadas en la nueva.",
        "movenologintext": "Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.",
        "movenotallowed": "No tienes permiso para trasladar páginas.",
        "movenotallowedfile": "No tienes permiso para trasladar archivos.",
        "cant-move-user-page": "No tienes permiso para trasladar páginas de usuario (excepto subpáginas).",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
+       "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
+       "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
        "newtitle": "A título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
        "newimages-legend": "Nombre del fichero",
        "newimages-label": "Nombre del fichero (o una parte):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostrar subidas por los bots",
        "noimages": "No hay nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Se ha añadido una página|Se han añadido $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una página ha sido borrada|$1 páginas han sido borradas}}:",
+       "watchlistedit-clear-title": "Lista de seguimiento limpiada",
+       "watchlistedit-clear-legend": "Limpiar lista de seguimiento",
+       "watchlistedit-clear-explain": "Todos los títulos serán removidos de tu lista de seguimiento",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Limpiar la lista de seguimiento (Esto es permanente!)",
+       "watchlistedit-clear-done": "Tu lista de seguimiento ha sido limpiada.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue removido|Los títulos $1 fueron removidos}}:",
+       "watchlistedit-too-many": "Hay demasiadas páginas para mostrar aquí.",
+       "watchlisttools-clear": "Limpiar la lista de seguimiento",
        "watchlisttools-view": "Ver cambios",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "specialpages-note": "* Páginas especiales normales\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>\n* <span class=\"mw-specialpagecached\">Páginas especiales en caché (podrían ser obsoletas).</span>",
        "specialpages-group-maintenance": "Reportes de mantenimiento",
        "specialpages-group-other": "Otras páginas especiales",
-       "specialpages-group-login": "Iniciar sesión / Crear cuenta",
+       "specialpages-group-login": "Acceder/crear cuenta",
        "specialpages-group-changes": "Cambios recientes y registros",
        "specialpages-group-media": "Páginas sobre archivos",
        "specialpages-group-users": "Usuarios y permisos",
index ce72fea..592287c 100644 (file)
        "blockip": "Kasutaja blokeerimine",
        "blockip-legend": "Kasutaja blokeerimine",
        "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.",
-       "ipadressorusername": "IP-aadress või kasutajanimi:",
+       "ipaddressorusername": "IP-aadress või kasutajanimi:",
        "ipbexpiry": "Kehtivus:",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Tavalised blokeerimise põhjused\n** Valeandmete lisamine\n** Lehekülgedelt sisu kustutamine\n** Välislinkide rämpspostitus\n** Sodimine\n** Hirmutav käitumine/ahistamine\n** Mitme konto väärkasutus\n** Lubamatu kasutajanimi",
        "newimages-summary": "Sellel erilehel on viimati üles laaditud failid.",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
-       "showhidebots": "($1 robotite kaastööd)",
        "noimages": "Uusi pilte ei ole.",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
index 9bc62de..ef07966 100644 (file)
        "searchbutton": "Bilatu",
        "go": "Joan",
        "searcharticle": "Joan",
-       "history": "Orrialdearen historia",
+       "history": "Orriaren historia",
        "history_short": "Historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "pagemerge-logentry": "[[$1]] [[$2]](r)ekin batu da ($3(e)raino berrikuspenak)",
        "revertmerge": "Bereiztu",
        "mergelogpagetext": "Jarraian dagoen zerrendak orrialde baten historiatik beste batera egindako azken bateratzeak erakusten ditu.",
-       "history-title": "«$1» orrialdearen historia berrikuspena",
+       "history-title": "«$1» orriaren historia berrikuspena",
        "difference-title": "«$1»: berrikuspenen arteko aldeak",
        "difference-title-multipage": "«$1» eta «$2» orrien arteko aldeak",
        "difference-multipage": "(Orrien arteko aldeak)",
        "log-title-wildcard": "Testu honekin hasten diren izenburuak bilatu",
        "showhideselectedlogentries": "Erakutsi/ezkutatu aukeratutako log sarrerak",
        "allpages": "Orri guztiak",
-       "alphaindexline": "$1(e)tik $2(e)raino",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "allpagesfrom": "Erakutsi hasiera hau duten orriak:",
        "blockip": "Blokeatu erabiltzailea",
        "blockip-legend": "Blokeatu erabiltzailea",
        "blockiptext": "IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).",
-       "ipadressorusername": "IP Helbidea edo erabiltzaile izena",
+       "ipaddressorusername": "IP Helbidea edo erabiltzaile izena",
        "ipbexpiry": "Iraungipena",
        "ipbreason": "Arrazoia:",
        "ipbreason-dropdown": "*Blokeaketa arrazoi arruntak\n** Benetakoa ez den informazioa ezartzea\n** Orrialdetatik edukia ezabatzea\n** Spam-a edota kanpoko loturak ezarri\n** Bandalismoa egitea\n** Beste erabiltzaileei mehatxatzea\n** Kontu ugari erabiltzea\n** Erabiltzaile izen desegokia",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "newimages-legend": "Iragazkia",
        "newimages-label": "Fitxategia (edo bere zati bat):",
-       "showhidebots": "($1 bot-ak)",
        "noimages": "Ez dago ezer ikusteko.",
        "ilsubmit": "Bilatu",
        "bydate": "dataren arabera",
index d48e85c..46d5017 100644 (file)
        "blockip": "Atarugal usuáriu",
        "blockip-legend": "Atarugal usuáriu",
        "blockiptext": "Gasta el hormuláriu d'embahu p'atarugal el acesu duna IP u dun usuáriu.\nEstu solu ebi hazelsi pa evital el vandalismu, i dalcuerdu cola [[{{MediaWiki:Policy-url}}|póliça]].\nEscrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan siu vandalizás pol esti usuáriu).",
-       "ipadressorusername": "IP u nombri d´usuáriu:",
+       "ipaddressorusername": "IP u nombri d´usuáriu:",
        "ipbexpiry": "Acabiha:",
        "ipbreason": "Razón:",
        "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d´otras páhinas...\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d´usuárius enacetabris",
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nu ai ná pa vel.",
        "ilsubmit": "Landeal",
        "bydate": "pol fecha",
index 8b008b7..a5437d0 100644 (file)
@@ -33,7 +33,8 @@
                        "جواد",
                        "درفش کاویانی",
                        "محک",
-                       "아라"
+                       "아라",
+                       "Mostafadaneshvar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "showhideselectedversions": "نمایش/نهفتن نسخه‌های انتخاب شده",
        "editundo": "خنثی‌سازی",
        "diff-empty": "(بدون تفاوت)",
-       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط کاربر مشابهی که نشان داده نشده)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}} توسط کاربر مشابهی که نشان داده نشده)",
        "diff-multi-otherusers": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط {{PLURAL:$2|کاربر دیگری|$2 کاربران}} نشان داده نشده)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "پنهان‌ کردن",
+       "rcshowhideminor-hide": "پنهان‌کردن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
        "rcshowhidebots-hide": "پنهان‌کردن",
        "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
        "showhideselectedlogentries": "نمایش/نهفتن موارد انتخابی در سیاهه",
        "allpages": "همهٔ صفحه‌ها",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "صفحهٔ بعد ($1)",
        "prevpage": "صفحهٔ قبلی ($1)",
        "allpagesfrom": "نمایش صفحه‌ها با شروع از:",
        "blockip": "بستن کاربر",
        "blockip-legend": "بستن کاربر",
        "blockiptext": "از فرم زیر برای بستن دسترسی ویرایش یک نشانی آی‌پی یا نام کاربری مشخص استفاده کنید.\nاین کار فقط فقط باید برای جلوگیری از خرابکاری و بر اساس [[{{MediaWiki:Policy-url}}|سیاست قطع دسترسی]] انجام شود.\nدلیل مشخص این کار را در زیر ذکر کنید (مثلاً با ذکر صفحه‌های به‌خصوصی که مورد خرابکاری واقع شده‌اند).",
-       "ipadressorusername": "نشانی آی‌پی یا نام کاربری:",
+       "ipaddressorusername": "نشانی آی‌پی یا نام کاربری:",
        "ipbexpiry": "زمان سرآمدن:",
        "ipbreason": "دلیل:",
        "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحه‌ها\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحه‌ها\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
        "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
        "newimages-legend": "پالودن",
        "newimages-label": "نام پرونده (یا قسمتی از آن):",
-       "showhidebots": "($1 ربات‌ها)",
        "noimages": "چیزی برای دیدن نیست.",
        "ilsubmit": "جستجو",
        "bydate": "از روی تاریخ",
index 30d604b..7154e86 100644 (file)
        "edit": "Muokkaa",
        "edit-local": "Muokkaa paikallista kuvausta",
        "create": "Luo sivu",
-       "create-local": "Lisää paikallinen kuvaus",
+       "create-local": "Luo paikallinen kuvaus",
        "editthispage": "Muokkaa tätä sivua",
        "create-this-page": "Luo tämä sivu",
        "delete": "Poista",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:",
        "edittools": "<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->",
        "nocreatetext": "Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|luoda käyttäjätunnuksen]].",
-       "nocreate-loggedin": "Sinulla ei ole oikeuksia luoda uusia sivuja.",
+       "nocreate-loggedin": "Sinulla ei ole oikeutta luoda uusia sivuja.",
        "sectioneditnotsupported-title": "Osioiden muokkaamista ei tueta.",
        "sectioneditnotsupported-text": "Osioiden muokkaamista ei tueta tällä sivulla.",
        "permissionserrors": "Puutteelliset oikeudet",
        "right-move": "Siirtää sivuja",
        "right-move-subpages": "Siirtää sivuja alasivuineen",
        "right-move-rootuserpages": "Siirtää käyttäjäsivuja",
+       "right-move-categorypages": "Siirtää luokkasivuja",
        "right-movefile": "Siirtää tiedostoja",
        "right-suppressredirect": "Siirtää sivuja luomatta automaattisia ohjauksia",
        "right-upload": "Tallentaa tiedostoja",
-       "right-reupload": "Korvata olemassa olevia tiedostoja uudella",
+       "right-reupload": "Tallentaa olemassa olevien tiedostojen tilalle uusia",
        "right-reupload-own": "Korvata itsetallennettu tiedosto uudella tiedostolla",
-       "right-reupload-shared": "Korvata jaettuun mediavarastoon tallennettuja tiedostoja paikallisesti",
+       "right-reupload-shared": "Korvata yhteiseen mediavarastoon tallennettuja tiedostoja paikallisesti",
        "right-upload_by_url": "Tallentaa tiedostoja verkko-osoitteella",
        "right-purge": "Tyhjentää sivuston välimuisti ilman varmennussivua",
        "right-autoconfirmed": "IP-pohjaiset nopeusrajoitukset eivät ole voimassa",
        "action-createpage": "luoda sivuja",
        "action-createtalk": "luoda keskustelusivuja",
        "action-createaccount": "luoda tätä käyttäjätunnusta",
-       "action-history": "näyttää tämän sivun historiaa",
+       "action-history": "tarkastella tämän sivun historiaa",
        "action-minoredit": "merkitä tätä muokkausta pieneksi",
        "action-move": "siirtää tätä sivua",
        "action-move-subpages": "siirtää tätä sivua eikä sen alasivuja",
        "action-move-rootuserpages": "siirtää käyttäjäsivuja",
+       "action-move-categorypages": "siirtää luokkasivuja",
        "action-movefile": "siirtää tätä tiedostoa",
        "action-upload": "tallentaa tätä tiedostoa",
-       "action-reupload": "korvata tätä olemassa olevaa tiedostoa",
-       "action-reupload-shared": "korvata tätä jaetun mediavaraston tiedostoa",
+       "action-reupload": "tallentaa tämän tiedoston tilalle uutta",
+       "action-reupload-shared": "korvata tätä yhteisen mediavaraston tiedostoa",
        "action-upload_by_url": "tallentaa tätä tiedostoa URL-osoitteesta",
        "action-writeapi": "käyttää kirjoitus-APIa",
        "action-delete": "poistaa tätä sivua",
        "fileexists-extension": "Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]\n* Tallennetun tiedoston nimi: <strong>[[:$1]]</strong>\n* Olemassa olevan tiedoston nimi: <strong>[[:$2]]</strong>\nValitse toinen tiedostonimi.",
        "fileexists-thumbnail-yes": "Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''. [[$1|thumb]]\nTarkista tiedosto <strong>[[:$1]]</strong>.\nJos yllä oleva tiedosto on alkuperäisversio samasta kuvasta, ei sille tarvitse tallentaa pienoiskuvaa.",
        "file-thumbnail-no": "Tiedostonimi alkaa merkkijonolla <strong>$1</strong>. Tiedosto näyttäisi olevan pienennetty kuva.\nJos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.",
-       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sitä voi korvata. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sen tilalle voi tallentaa uutta. \nJos kuitenkin haluat tallentaa tiedostosi, palaa takaisin ja käytä jotain toista nimeä. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:",
        "file-deleted-duplicate": "Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.",
        "filedelete-maintenance-title": "Tiedostoa ei voi poistaa",
        "mimesearch": "MIME-haku",
        "mimesearch-summary": "Tällä sivulla voit etsiä tiedostoja niiden MIME-tyypin perusteella.\nSyöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.",
-       "mimetype": "MIME-tyyppi",
+       "mimetype": "MIME-tyyppi:",
        "download": "lataa",
        "unwatchedpages": "Tarkkailemattomat sivut",
        "listredirects": "Ohjaukset",
        "log-title-wildcard": "Kohde alkaa merkkijonolla",
        "showhideselectedlogentries": "Muuta valittujen lokitapahtumien näkyvyyttä",
        "allpages": "Kaikki sivut",
-       "alphaindexline": "$1…$2",
        "nextpage": "Seuraava sivu ($1)",
        "prevpage": "Edellinen sivu ($1)",
        "allpagesfrom": "Alkaen sivusta",
        "protect-text": "Voit tarkastella ja muuttaa sivun '''$1''' suojaustasoa.",
        "protect-locked-blocked": "Et voi muuttaa sivun suojauksia, koska sinut on estetty. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
        "protect-locked-dblock": "Sivun suojauksia ei voi muuttaa, koska tietokanta on lukittu. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
-       "protect-locked-access": "Sinulla ei ole tarvittavia oikeuksia sivujen suojauksen muuttamiseen. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
+       "protect-locked-access": "Sinun käyttäjätunnuksellasi ei ole oikeutta muuttaa sivujen suojauksia. \nTässä ovat nykyiset suojausasetukset sivulla <strong>$1</strong>:",
        "protect-cascadeon": "Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan suojattuun sivuun, jossa|oleviin suojattuihin sivuihin, joissa}} on kytketty tarttuva suojaus päälle.\n\nTämän sivun suojaustasoon tehdyillä muutoksilla ei ole vaikutusta sivuun muualta tarttuneeseen suojaukseen.",
        "protect-default": "Salli kaikki käyttäjät",
        "protect-fallback": "Salli vain käyttäjät, joilla on oikeus $1",
        "blockip": "Estä käyttäjä",
        "blockip-legend": "Estä käyttäjä",
        "blockiptext": "Tällä toiminnolla voit estää käyttäjätunnusta tai IP-osoitetta muokkaamasta.<br />\nTällainen muokkausesto pitäisi asettaa vain vandalismin torjumiseksi ja [[{{MediaWiki:Policy-url}}|käytännön]] mukaisesti.\nKirjoita eston syy alla olevaan kenttään.",
-       "ipadressorusername": "IP-osoite tai käyttäjätunnus",
+       "ipaddressorusername": "IP-osoite tai käyttäjätunnus",
        "ipbexpiry": "Kesto",
        "ipbreason": "Syy",
        "ipbreason-dropdown": "*Yleiset estosyyt\n** Väärän tiedon lisääminen\n** Sisällön poistaminen\n** Mainoslinkkien lisääminen\n** Sotkeminen tai roskan lisääminen\n** Häiriköinti\n** Useamman käyttäjätunnuksen väärinkäyttö\n** Sopimaton käyttäjätunnus",
        "movepagetalktext": "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''\n*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai\n*jos otat pois rastin alla olevasta ruudusta.\n\nNäissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "movearticle": "Siirrettävä sivu:",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
+       "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan sivu siirretään ja tämä toiminto <em>ei</em> luokittele vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenologintext": "Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.",
        "movenotallowed": "Sinulla ei ole oikeutta siirtää sivuja.",
        "movenotallowedfile": "Sinulla ei ole oikeutta siirtää tiedostoja.",
        "cant-move-user-page": "Sinulla ei ole oikeutta siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).",
        "cant-move-to-user-page": "Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).",
+       "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
+       "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "newimages": "Uudet tiedostot",
        "imagelisttext": "Alla on {{PLURAL:$1|1 tiedosto|$1 tiedostoa}} lajiteltuna <strong>$2</strong>.",
        "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.",
-       "newimages-legend": "Suodin",
+       "newimages-legend": "Suodatin",
        "newimages-label": "Tiedostonimi (tai osa siitä)",
-       "showhidebots": "($1 botit)",
+       "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "noimages": "Ei uusia tiedostoja.",
        "ilsubmit": "Hae",
        "bydate": "päiväyksen mukaan",
        "watchlistedit-raw-done": "Tarkkailulistasi on päivitetty.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Yksi sivu|$1 sivua}} lisättiin:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} poistettiin:",
+       "watchlistedit-clear-title": "Tyhjä tarkkailulista",
+       "watchlistedit-clear-legend": "Tyhjennä tarkkailulista",
+       "watchlistedit-clear-explain": "Kaikki sivut poistetaan tarkkailulistaltasi",
+       "watchlistedit-clear-titles": "Sivujen nimet:",
+       "watchlistedit-clear-submit": "Tyhjennä tarkkailulista (pysyvästi ja peruuttamattomasti!)",
+       "watchlistedit-clear-done": "Tarkkailulistasi on tyhjennetty.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} on poistettu:",
+       "watchlistedit-too-many": "Luettelossa on liikaa sivuja näytettäväksi tässä.",
+       "watchlisttools-clear": "Tyhjennä tarkkailulista",
        "watchlisttools-view": "Näytä tarkkaillut muutokset",
        "watchlisttools-edit": "Katso ja muokkaa tarkkailulistaa",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
index 44d82ee..f5dcfb4 100644 (file)
        "right-move": "Renommer des pages",
        "right-move-subpages": "Renommer des pages avec leurs sous-pages",
        "right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
+       "right-move-categorypages": "Renommer des pages de catégorie",
        "right-movefile": "Renommer des fichiers",
        "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
        "right-upload": "Importer des fichiers",
        "action-move": "renommer cette page",
        "action-move-subpages": "renommer cette page et ses sous-pages",
        "action-move-rootuserpages": "renommer la page principale d'un utilisateur",
+       "action-move-categorypages": "renommer des pages de catégorie",
        "action-movefile": "renommer ce fichier",
        "action-upload": "importer ce fichier",
        "action-reupload": "écraser ce fichier existant",
        "log-title-wildcard": "Chercher parmi les titres commençant par ce texte",
        "showhideselectedlogentries": "Afficher/masquer les entrées de journal sélectionnées",
        "allpages": "Toutes les pages",
-       "alphaindexline": "de $1 à $2",
        "nextpage": "Page suivante ($1)",
        "prevpage": "Page précédente ($1)",
        "allpagesfrom": "Afficher les pages à partir de :",
        "blockip": "Bloquer l’utilisateur",
        "blockip-legend": "Bloquer l’utilisateur",
        "blockiptext": "Utilisez le formulaire ci-dessous pour bloquer les tentatives de modification faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.\nUne telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].\nDonnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).",
-       "ipadressorusername": "Adresse IP ou nom d'utilisateur :",
+       "ipaddressorusername": "Adresse IP ou nom d'utilisateur :",
        "ipbexpiry": "Durée avant expiration :",
        "ipbreason": "Motif :",
        "ipbreason-dropdown": "* Motifs de blocage les plus fréquents\n** Insertion de fausses informations\n** Suppression injustifiée de contenu des pages\n** Insertion répétée de liens externes publicitaires (pollupostage)\n** Insertion de contenu sans aucun sens et de déchets dans les pages\n** Tentative d'intimidation ou harcèlement\n** Abus d'utilisation de comptes multiples\n** Nom d'utilisateur inacceptable, injurieux ou diffamant",
        "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''\n* vous déplacez la page vers un autre espace de noms, ou\n* une page de discussion non vide existe déjà sous le nouveau nom, ou\n* vous décochez la case ci-dessous.\n\nDans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "movearticle": "Renommer la page :",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
+       "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seul la page sera renommée et que toutes les pages dans l'ancienne catégorie ne seront <em>pas</em> transférées dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e|(e)}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
        "movenotallowed": "Vous n'avez pas la permission de renommer les pages.",
        "movenotallowedfile": "Vous n'avez pas la permission de renommer les fichiers.",
        "cant-move-user-page": "Vous n’avez pas la permission de renommer les pages principales d’utilisateurs.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).",
+       "cant-move-category-page": "Vous n'avez pas la permis de renommer les pages de catégorie.",
+       "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
        "newtitle": "Vers le nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "newimages-summary": "Cette page spéciale affiche les derniers fichiers importés.",
        "newimages-legend": "Nom du fichier",
        "newimages-label": "Nom du fichier (ou une partie de celui-ci) :",
-       "showhidebots": "($1 robots)",
+       "newimages-showbots": "Afficher les imports par des robots",
        "noimages": "Aucune image à afficher.",
        "ilsubmit": "Rechercher",
        "bydate": "par date",
        "watchlistedit-raw-done": "Votre liste de suivi a été mise à jour.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Un titre a été ajouté|$1 titres ont été ajoutés}} :",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Un titre a été retiré|$1 titres ont été retirés}} :",
+       "watchlistedit-clear-title": "Liste de suivi vidée",
+       "watchlistedit-clear-legend": "Effacer la liste de suivi",
+       "watchlistedit-clear-explain": "Tous les titres seront supprimés de votre liste de suivi",
+       "watchlistedit-clear-titles": "Titres :",
+       "watchlistedit-clear-submit": "Effacer la liste de suivi (ceci est permanent !)",
+       "watchlistedit-clear-done": "Votre liste de suivi a été effacée.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un titre a été|$1 titres ont été}} retirés :",
+       "watchlistedit-too-many": "Il y a trop de pages à afficher ici.",
+       "watchlisttools-clear": "Effacer la liste de suivi",
        "watchlisttools-view": "Liste de suivi",
        "watchlisttools-edit": "Voir et modifier la liste de suivi",
        "watchlisttools-raw": "Modifier la liste de suivi en mode brut",
index 6ffc38e..1d41451 100644 (file)
        "blockip": "Blocar l’usanciér",
        "blockip-legend": "Blocar l’usanciér",
        "blockiptext": "Utilisâd lo formulèro ce-desot por blocar l’accès en ècritura dês una adrèce IP spècefica ou ben un nom d’usanciér.\nUna tâla mesera devrêt étre prêsa ren que por empachiér lo vandalismo et en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].\nBalyéd ce-desot una rêson justa (per ègzemplo en citent les pâges qu’ont étâ vandalisâs).",
-       "ipadressorusername": "Adrèce IP ou ben nom d’usanciér :",
+       "ipaddressorusername": "Adrèce IP ou ben nom d’usanciér :",
        "ipbexpiry": "Temps devant èxpiracion :",
        "ipbreason": "Rêson :",
        "ipbreason-dropdown": "*Rêsons corentes de blocâjo\n** Entrebetâ d’enformacions fôsses\n** Suprèssion de contegnu de les pâges\n** Entrebetâ de lims de defôr publicitèros (spame)\n** Entrebetâ de contegnu sen gins de significacion et d’ècovelyes dedens les pâges\n** Tentativa d’entimidacion ou ben de torment\n** Abus d’usâjo d’un mouél de comptos\n** Nom d’utilisator pas accèptâblo",
        "newimages-summary": "Ceta pâge spèciâla montre los dèrriérs fichiérs tèlèchargiês.",
        "newimages-legend": "Nom du fichiér",
        "newimages-label": "Nom du fichiér (ou ben una partia de ceti) :",
-       "showhidebots": "($1 los bots)",
        "noimages": "Gins de fichiér a fâre vêre.",
        "ilsubmit": "Rechèrchiér",
        "bydate": "per dâta",
index 766a041..624a890 100644 (file)
        "blockip": "IP-adres/brüker spere",
        "blockip-legend": "IP-adres/brüker spere",
        "blockiptext": "Mä detdiar formulaar sperest dü en IP-adres of en brükernööm, so dat faan diar nian feranrangen muar maaget wurd kön. \nDet skul bluas föörnimen wurd, am jin wandaalen föörtugungen an uun auerianstemang mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]].\nSkriiw en guden grünj för det sper ap.",
-       "ipadressorusername": "IP-adres of brükernööm:",
+       "ipaddressorusername": "IP-adres of brükernööm:",
        "ipbexpiry": "Sperdüür:",
        "ipbreason": "Grünj:",
        "ipbreason-dropdown": "* Mist brükt spergrünjer\n** Skraft wat ferkiards\n** Maaget sidjen leesag\n** Maaget tuföl ferwisangen üüb frääm sidjen\n** Maaget dom tschüch\n** Koon ham ei skake\n** Masbrükt brükerkontos\n** Hää en brükernööm, diar ei tuläät as",
        "newimages-summary": "Detdiar spezial-sidj wiset a tuleetst huuchschüürd datein uun.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinööm (of en dial diarfaan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks tu sen.",
        "ilsubmit": "Schük",
        "bydate": "efter dootem",
index 69a5a40..ece00d8 100644 (file)
        "blockip": "Slút meidogger út",
        "blockip-legend": "Slút brûker út",
        "blockiptext": "Brûk dizze fjilden om in meidogger fan skriuwtagong út te sluten.\nDat soe allinnich fanwege fandalisme dien wurde moatte, sa't de\n[[{{MediaWiki:Policy-url}}|útslut-rie]] it oanjout.\nMeld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
-       "ipadressorusername": "IP Adres of meidoggernamme:",
+       "ipaddressorusername": "IP Adres of meidoggernamme:",
        "ipbexpiry": "Ferrint nei:",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Faak foarkommende redenen foar blokkades\n** Ferkearde ynformaasje ynfiere\n** Fuortheljen fan ynformaasje út siden\n** Spamferwizing nei eksterne websites\n** Ynfoegjen fan ûnsin yn siden\n** Yntimidearjend gedrach\n** Misbrûk troch meardere brûkers\n** Unakseptabele brûkersnamme",
        "newimages": "Nije ôfbylden",
        "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|triem|triemen}}, op $2.",
        "newimages-legend": "Filter",
-       "showhidebots": "(Bots $1)",
        "noimages": "Neat te sjen.",
        "ilsubmit": "Sykje",
        "bydate": "datum",
index 79fd14b..97b3acb 100644 (file)
        "blockip": "Coisc úsáideoir",
        "blockip-legend": "Coisc úsáideoir",
        "blockiptext": "Úsáid an foirm anseo thíos chun bealach scríofa a chosc ó\nseoladh IP nó ainm úsáideora áirithe.\nIs féidir leat an rud seo a dhéanamh amháin chun an chreachadóireacht a chosc, de réir\nmar a deirtear sa [[{{MediaWiki:Policy-url}}|polasaí {{GRAMMAR:genitive|{{SITENAME}}}}]].\nLíonaigh cúis áirithe anseo thíos (mar shampla, is féidir leat a luaigh\nleathanaigh áirithe a rinne an duine damáiste ar).",
-       "ipadressorusername": "Seoladh IP nó ainm úsáideora:",
+       "ipaddressorusername": "Seoladh IP nó ainm úsáideora:",
        "ipbexpiry": "Am éaga",
        "ipbreason": "Fáth:",
        "ipbreason-dropdown": "*Fáthanna coitianta\n** Loitiméaracht\n** Naisc turscar\n** Fadhbanna cóipcheart\n** Ag iarraidh ciapadh daoine eile\n** Drochúsáid as cuntais iolrach\n** Fadhbanna idirvicí\n** Feallaire\n** Seachfhreastalaí Oscailte",
        "newimages": "Gailearaí na n-íomhánna nua",
        "imagelisttext": "Tá liosta thíos de {{PLURAL:$1|comhad amháin|$1 comhaid $2}}.",
        "newimages-label": "Comhadainm (nó cuid de):",
-       "showhidebots": "($1 róbónna)",
        "noimages": "Tada le feiceáil.",
        "ilsubmit": "Cuardaigh",
        "bydate": "de réir dáta",
index 4421439..747f40c 100644 (file)
        "whatlinkshere-filters": "筛滤器",
        "blockip": "封到IP地址",
        "blockiptext": "用下底𠮶表格去阻止某一IP𠮶修改权限。除非倷系为到怕佢乱扤,接到非要符合[[{{MediaWiki:Policy-url}}|守则]]𠮶条件下才能啖做。请到下底话只确切原因(比如引用一只拖破坏𠮶页面)。",
-       "ipadressorusername": "IP地址或用户名:",
+       "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般𠮶封锁原因\n** 紧编写假𠮶内容\n** 删卟文章内容\n** 乱加外部链接\n** 写冇油盐𠮶话\n** 吓人/骚扰别𠮶\n** 滥用帐号\n** 乱起用户名",
        "show-big-image": "完整分辨率",
        "newimages": "新建图像画廊",
        "imagelisttext": "底下系按$2排列𠮶$1只档案列表。",
-       "showhidebots": "($1机器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "寻",
        "bydate": "按日子",
index 395ded1..d98fe23 100644 (file)
        "whatlinkshere-filters": "篩濾器",
        "blockip": "封到IP地址",
        "blockiptext": "用下底嗰表格去阻止某一IP嗰修改許可權。除非倷係為到怕佢亂扤,接到非要符合[[{{MediaWiki:Policy-url}}|守則]]嗰條件下才能噉做。請到下底話隻確切原因(比如引用一隻拕破壞嗰頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般嗰封鎖原因\n** 緊編寫假嗰內容\n** 刪卟文章內容\n** 亂加外部連結\n** 寫冇油鹽嗰話\n** 嚇人/騷擾別嗰\n** 濫用帳號\n** 亂起用戶名",
        "show-big-image": "完整解析度",
        "newimages": "新建圖像畫廊",
        "imagelisttext": "底下係按$2排列嗰$1隻檔案列表。",
-       "showhidebots": "($1機器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "尋",
        "bydate": "按日子",
index d3c7021..3072722 100644 (file)
        "blockip": "Bloquear o usuario",
        "blockip-legend": "Bloquear un usuario",
        "blockiptext": "Use o seguinte formulario para bloquear o acceso de escritura desde un enderezo IP ou para bloquear un usuario específico.\nIsto debería facerse só para previr vandalismo, e de acordo coa [[{{MediaWiki:Policy-url}}|política e normas]] vixentes.\nExplique a razón específica do bloqueo (por exemplo, citando as páxinas concretas que sufriron vandalismo).",
-       "ipadressorusername": "Enderezo IP ou nome de usuario:",
+       "ipaddressorusername": "Enderezo IP ou nome de usuario:",
        "ipbexpiry": "Duración:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frecuentes para bloquear\n** Inserir información falsa\n** Eliminar o contido de páxinas\n** Ligazóns lixo a sitios externos\n** Inserir textos sen sentido ou inintelixibles\n** Comportamento intimidatorio/acoso\n** Abuso de múltiples contas de usuario\n** Nome de usuario inaceptable",
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
-       "showhidebots": "($1 os bots)",
        "noimages": "Non hai imaxes para ver.",
        "ilsubmit": "Procurar",
        "bydate": "por data",
index 410c8c9..95e9f9b 100644 (file)
        "whatlinkshere-filters": "Ἠθητήρια",
        "blockip": "Ἀποκλῄειν τόνδε τὸν χρώμενον",
        "blockip-legend": "Φράττειν χρώμενον",
-       "ipadressorusername": "Διεύθυνσις IP ἢ ὄνομα χρωμένου:",
+       "ipaddressorusername": "Διεύθυνσις IP ἢ ὄνομα χρωμένου:",
        "ipbexpiry": "Λῆξις:",
        "ipbreason": "Αἰτία:",
        "ipbreason-dropdown": "*Κοιναὶ αἰτίαι φραγῆς\n** Εἰσαγωγὴ ψευδοῦς πεύσεως\n** Ἁφαίρεσις τοῦ περιεχομένου τῶν δέλτων\n** Σύνδεσμοι πρὸς ἀνεπιθύμητους ἀγγελίας\n** Εἰσαγωγὴ ἀσυναρτησιῶν ἐν ταῖς δέλτοις\n** Ἐκφοβιστικὴ συμπεριφορά/ἐνόχλησις\n** Κατάχρησις πολλαπλῶν λογισμῶν\n** Ἀναπόδεκτον ὄνομα χρωμένου",
        "newimages-summary": "Ἥδε ἡ εἰδικὴ δέλτος δεικνύει τὰ πλέον πρόσφατα ἐπιπεφορτισμένα ἀρχεῖα.",
        "newimages-legend": "Διηθητήριον",
        "newimages-label": "Ἀρχειώνυμον (ἢ μέρος οὗ):",
-       "showhidebots": "($1 αὐτόματα)",
        "noimages": "Οὐδεμία εἰκών.",
        "ilsubmit": "Ζητεῖν",
        "bydate": "κατὰ χρονολογίαν",
index 17454ea..a3ec3ba 100644 (file)
        "blockip": "Däm Binutzer d Bearbeitigsrächt furtnee",
        "blockip-legend": "IP-Adräss/Benutzer sperre",
        "blockiptext": "Nimm des Formular go ne Benutzer oder e IP-Adräss sperre.\nDes sott numme erfolge go Vandalismus verhindere un in Ibereinstimmig mit in dr [[{{MediaWiki:Policy-url}}|Leitlinie]]. Bitte gib au ne Grund fi d Sperri aa (z. B. indäm du einzel ni Syte zitiersch, wu vandaliert wore sin).",
-       "ipadressorusername": "IP-Adräss oder Benutzername:",
+       "ipaddressorusername": "IP-Adräss oder Benutzername:",
        "ipbexpiry": "Sperrduur:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgmeini Sperrgrind\n** Lesche vu Syte\n** Aalege vu bledsinnige Syte\n** Vylfachi Verstess gege d Richtlinie fir Netzgleicher\n** Verstoss gege dr Grundsatz „Kei persenligi Aagriff“\n* Benutzerspezifischi Sperrgrind\n** Uugeignete Benutzername\n** Neijaamäldig vun eme uubschränkt gsperrte Benutzer\n* IP-spezifischi Sperrgrind\n** Proxy, wäge Vandalismus vu einzelne Benutzer lengerfrischtig gsperrt",
        "newimages-summary": "Die Spezialsyte zeigt di zletscht uffegladene Dateie aa.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder e Teil devu):",
-       "showhidebots": "(Bötli $1)",
        "noimages": "Kei Dateie gfunde.",
        "ilsubmit": "Suech",
        "bydate": "noch Datum",
index 7a60eb5..bc124ce 100644 (file)
        "blockip": "સભ્ય પર પ્રતિબંધ મુકો",
        "blockip-legend": "સભ્ય પર પ્રતિબંધ મુકો",
        "blockiptext": "કોઈ ચોક્કસ IP સરનામું કે સભ્યના લેખન યોગદાન પર પ્રતિબંધ મુકવા નીચેનું ફોર્મ વાપરો.\nતેનો ઉપયોગ માત્ર ભાંગફોડિયા પ્રવૃત્તિઓને રોકવા અને  [[{{MediaWiki:Policy-url}}|નીતિ]] અનુસાર જ હોવો જોઈએ.\nકારણનું ખાનું અવશ્ય ભરશો (દા.ત. અમુક ભાંગફોડ કરાયેલા પાનાનો સંદર્ભ).",
-       "ipadressorusername": "IP સરનામું અથવા સભ્યનામ:",
+       "ipaddressorusername": "IP સરનામું અથવા સભ્યનામ:",
        "ipbexpiry": "સમાપ્તિ:",
        "ipbreason": "કારણ:",
        "ipbreason-dropdown": "*સામાન્ય પ્રતિબંધ કારણો\n** ખોટી માહિતી ઉમેરાઈ  \n** પાનામાંથી માહિતી ભૂંસી નાંખી\n** અનાવશ્યક બાહ્ય કડીઓ ઉમેરી \n** પાનામાં મૂર્ખામીભરી/અર્થહીન માહિતી ઉમેરી\n** ત્રાસદાયક વર્તન \n** ઘણા ખાતાઓ અને દુરુપયોગ\n** અસ્વીકાર્ય સભ્ય નામ\n** આત્યંતિક ભાંગફોડ",
        "newimages-summary": "આ ખાસ પાનું છેવટની  ચડાવેલા વફાઈલા બતાવે છે",
        "newimages-legend": "ચાળણી",
        "newimages-label": "ફાઈલનામ (કે તેનો ભાગ)",
-       "showhidebots": "($1 બોટ)",
        "noimages": "જોવા માટે કશું નથી.",
        "ilsubmit": "શોધો",
        "bydate": "તારીખ પ્રમાણે",
index 5a01e62..cb5b009 100644 (file)
        "whatlinkshere-filters": "Shollaneyn",
        "blockip": "Glass magh yn ymmydeyr",
        "blockip-legend": "Glass magh yn ymmydeyr",
-       "ipadressorusername": "Enmys IP ny ennym ymmydeyr:",
+       "ipaddressorusername": "Enmys IP ny ennym ymmydeyr:",
        "ipbexpiry": "Jerrey:",
        "ipbreason": "Fa:",
        "ipbreason-dropdown": "* Oyr glassey cadjin\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n* Oyr elley\n** Ennym ymmydeyryn neuchooie\n** Feyshtyn eddyr-wiki",
        "svg-long-desc": "coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3",
        "show-big-image": "Jeeskeaylley ymlane",
        "newimages": "Laaragh coadanyn noa",
-       "showhidebots": "($1 botyn)",
        "ilsubmit": "Ronsee",
        "bydate": "rere date",
        "bad_image_list": "Shoh yn aght:\n\nCha nel agh meeryn ayns rolley (linnaghyn as * ec y toshiaght) ta goll er smooinaghtyn er.\nShegin da'n chied chiangley er linney ve ny chiangley da drogh choadan.\nKianglaghyn eiyrtyssagh erbee er yn linney shoh, t'ad goll er loaghtey myr lhimmaghyn, shen gra, duillagyn as ta'n coadan ayns-linney, foddee.",
index 756ac12..63e467b 100644 (file)
        "whatlinkshere-filters": "過濾器",
        "blockip": "封禁用戶",
        "blockiptext": "用下背嘅表單來禁止來自某一特定IP地址嘅修改許可權。\n單淨在為防止破壞,撈符合[[{{MediaWiki:Policy-url}}|守則]]嘅情況下正做得採取邇行動。\n請在下背輸入一隻具體嘅理由(例如引述一隻分破壞嘅頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般嘅封禁理由\n** 多次加入虛假資料\n** 刪除頁面內容\n** 外部鏈接廣告\n** 在頁面肚增加無意義文字\n** 無禮嘅行為、攻擊/騷擾別儕\n** 濫用多隻賬號\n** 做毋得接受嘅用戶名",
        "show-big-image": "完整分辨率",
        "newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
        "imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
-       "showhidebots": "($1 kî-hi-ngìn)",
        "noimages": "Mò-khó kiám-sṳ thù-chhiong.",
        "ilsubmit": "Chhìm-cháu",
        "bydate": "on-cheu ngit-khì",
index bc02012..7bedfad 100644 (file)
@@ -25,7 +25,8 @@
                        "ערן",
                        "פדיחה",
                        "שומבלע",
-                       "תומר ט"
+                       "תומר ט",
+                       "Matanya"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "right-move": "העברת דפים",
        "right-move-subpages": "העברת דפים עם דפי המשנה שלהם",
        "right-move-rootuserpages": "העברת דפי משתמש שאינם דפי משנה",
+       "right-move-categorypages": "העברת דפי קטגוריה",
        "right-movefile": "העברת קבצים",
        "right-suppressredirect": "הימנעות מיצירת הפניות מדפי המקור בעת העברת דפים",
        "right-upload": "העלאת קבצים",
        "action-move": "להעביר דף זה",
        "action-move-subpages": "להעביר דף זה יחד עם דפי המשנה שלו",
        "action-move-rootuserpages": "להעביר דפי משתמש שאינם דפי משנה",
+       "action-move-categorypages": "להעביר דפי קטגוריה",
        "action-movefile": "להעביר קובץ זה",
        "action-upload": "להעלות קובץ זה",
        "action-reupload": "לדרוס את הקובץ הקיים הזה",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "הצגת/הסתרת פעולות היומן שנבחרו",
        "allpages": "כל הדפים",
-       "alphaindexline": "$1 עד $2",
        "nextpage": "הדף הבא ($1)",
        "prevpage": "הדף הקודם ($1)",
        "allpagesfrom": "הצגת דפים החל מ:",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
-       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\9e×\99ש×\94×\95 ×\90×\97ר ×\9b×\91ר ×¢×¨×\9a ×\90×\95 ×©×\97×\96ר ×\90ת ×\94×\93×£.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\94×\93×£ ×\9b×\91ר × ×¢×¨×\9a ×\90×\95 ×©×\95×\97×\96ר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: \"'''$1'''\".",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "blockip": "חסימת משתמש",
        "blockip-legend": "חסימת משתמש",
        "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).",
-       "ipadressorusername": "כתובת IP או שם משתמש:",
+       "ipaddressorusername": "כתובת IP או שם משתמש:",
        "ipbexpiry": "פקיעה:",
        "ipbreason": "סיבה:",
        "ipbreason-dropdown": "* סיבות חסימה נפוצות\n** הוספת מידע שגוי\n** הסרת תוכן מדפים\n** הצפת קישורים לאתרים חיצוניים\n** הוספת שטויות/ג'יבריש לדפים\n** התנהגות מאיימת/הטרדה\n** שימוש לרעה בחשבונות מרובים\n** שם משתמש בעייתי",
        "movepagetalktext": "דף השיחה של דף זה יועבר אוטומטית, אלא אם:\n* קיים דף שיחה שאינו ריק תחת השם החדש אליו מועבר הדף, או\n* הסרתם את הסימון בתיבה שלהלן.\n\nבמקרים אלו, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "movearticle": "העברת דף:",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
+       "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "movenotallowed": "אינכם מורשים להעביר דפים.",
        "movenotallowedfile": "אינכם מורשים להעביר קבצים.",
        "cant-move-user-page": "אינכם מורשים להעביר דפי משתמש (למעט דפי משנה).",
        "cant-move-to-user-page": "אינכם מורשים להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
+       "cant-move-category-page": "אינכם מורשים להעביר דפי קטגוריה.",
+       "cant-move-to-category-page": "אינכם מורשים להעביר דף לדף קטגוריה.",
        "newtitle": "לשם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "newimages-summary": "דף זה מציג את הקבצים האחרונים שהועלו",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
-       "showhidebots": "($1 בוטים)",
+       "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "noimages": "אין קבצים.",
        "ilsubmit": "חיפוש",
        "bydate": "לפי תאריך",
        "watchlistedit-raw-done": "רשימת המעקב עודכנה.",
        "watchlistedit-raw-added": "{{PLURAL:$1|כותרת אחת נוספה|$1 כותרות נוספו}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
+       "watchlistedit-clear-title": "רשימת המעקב נמחקה",
+       "watchlistedit-clear-legend": "מחיקת רשימת המעקב",
+       "watchlistedit-clear-explain": "כל הכותרות של הדפים שיוסרו מרשימת המעקב",
+       "watchlistedit-clear-titles": "כותרות:",
+       "watchlistedit-clear-submit": "מחיקת רשימת המעקב (לצמיתות!)",
+       "watchlistedit-clear-done": "רשימת המעקב שלך נמחקה.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
+       "watchlistedit-too-many": "יש יותר מדי דפים ולא ניתן להציגם כאן.",
+       "watchlisttools-clear": "מחיקת רשימת המעקב",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
        "watchlisttools-raw": "עריכת הרשימה הגולמית",
index 4ec3114..5aea0f6 100644 (file)
        "blockip": "अवरोधित करें",
        "blockip-legend": "सदस्य को ब्लॉक करें",
        "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।",
-       "ipadressorusername": "आईपी एड्रेस या सदस्यनाम:",
+       "ipaddressorusername": "आईपी एड्रेस या सदस्यनाम:",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*अवरोधित करने के साधारण कारण\n** अवैध सदस्यनाम\n** एक से अधिक खातें खोलकर उनका दुरुपयोग करना\n** गलत जानकारी भरना\n** पृष्ठों में कचरा भरना\n** पृष्ठों से सामग्री हटाना‍‍‍‍‍\n** बाहरी जालस्थलों की फ़ालतू कड़ियां देना \n** सदस्यों को तंग करना",
        "newimages-summary": "यह विशेष पृष्ठ हाल ही में अपलोड की गयी फ़ाइलें दिखाता है।",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
-       "showhidebots": "(बोट्स $1)",
        "noimages": "देखने के लिए कुछ नहीं है।",
        "ilsubmit": "खोजें",
        "bydate": "तिथि अनुसार",
index c4f039e..caa8d29 100644 (file)
        "blockip": "Sadasya ke roko",
        "blockip-legend": "Sadasya ke roko",
        "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir use kare ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nNiche ek khaas kaaran likho (jaise ki, citing particular pages that were vandalized).",
-       "ipadressorusername": "IP Address nai to username:",
+       "ipaddressorusername": "IP Address nai to username:",
        "ipbexpiry": "Expiry:",
        "ipbreason": "Kaaran:",
        "ipbreason-dropdown": "*Roke ke sadhaarankaaran\n** Galat jaankari diis\n** Panna se jaankari nikalis\n** Bahaari site se spamming jorr\n** Panna me bakwaas/and sand liko\n** Duusre ke dhamki do\n** Ek se jaada account ke khraab kaam me laao\n** Sadasya ke naam thiik nai hae",
        "newimages-summary": "Ii khaas panna pahile waala upload karaa gais file ke dekhae hai.",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
-       "showhidebots": "($1 bots)",
        "noimages": "Koi chij dekhe ke nai hai.",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
index 94a7b70..63140de 100644 (file)
        "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
        "revdel-restore": "Promijeni dostupnost",
-       "pagehist": "Povijest stranice",
+       "pagehist": "stare izmjene",
        "deletedhist": "Obrisana povijest",
        "revdelete-hide-current": "Pogrješka u skrivanju stavke datirane $2, $1: ovo je trenutačna inačica. Ne može biti skrivena.",
        "revdelete-show-no-access": "Pogrješka u prikazivanju stavke od $2, $1: ova stavka označena je kao \"ograničeno\".\nNemate pristup do nje.",
        "log-title-wildcard": "Traži stranice koje počinju s navedenim izrazom",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Pokaži stranice počevši od:",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Obriši \"$1\"",
        "delete-legend": "Izbriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite obrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
+       "historywarning": "'''Upozorenje''': stranica koju želite izbrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Zahvat završen",
        "actionfailed": "Radnja nije uspjela",
        "blockip": "Blokiraj suradnika",
        "blockip-legend": "Blokiraj suradnika",
        "blockiptext": "Koristite donji obrazac za blokiranje pisanja pojedinih suradnika ili IP adresa .\nTo biste trebali raditi samo zbog sprječavanja vandalizma i u skladu\nsa [[{{MediaWiki:Policy-url}}|smjernicama]].\nUpišite i razlog za ovo blokiranje (npr. stranice koje su\nvandalizirane).",
-       "ipadressorusername": "IP adresa ili suradničko ime",
+       "ipaddressorusername": "IP adresa ili suradničko ime",
        "ipbexpiry": "Rok (na engleskom)",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Netočne informacije\n** Uklanjanje sadržaja stranica\n** Postavljanje ''spam'' vanjskih poveznica\n** Grafiti\n** Osobni napadi (ili napadačko ponašanje)\n** Čarapare (zloporaba više suradničkih računa)\n** Neprihvatljivo suradničko ime",
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
-       "showhidebots": "($1 botova)",
        "noimages": "Nema slika.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
index d090924..93680c3 100644 (file)
        "edit-gone-missing": "Die Seit konnt net aktualisiert sin.\nDie woard oonscheinend gelöscht.",
        "edit-conflict": "Beoorbeitungskonflikt.",
        "edit-no-change": "Dein Beoorbeitung woard ignoriert, do ken Ännrung an dem Text voargenomm  woard.",
+       "postedit-confirmation-created": "Die Seit woard erstellt.",
+       "postedit-confirmation-restored": "Die Seit woard wiederhergestellt.",
        "postedit-confirmation-saved": "Dein Beoorbeitung woard gespeichert.",
        "edit-already-exists": "Die neie Seit konnt net erstellt werre, do sie bereits voarhand ist.",
        "defaultmessagetext": "Standardtext",
        "action-createpage": "Seite zu erstelle",
        "action-createtalk": "Diskussionsseite erstelle",
        "action-createaccount": "der Benutzerkonto erstelle",
+       "action-history": "die Versionsgeschichte von der Seit oonsiehen",
        "action-minoredit": "die Beoorbeitung als klen markiere",
        "action-move": "die Seit verschiebe",
        "action-move-subpages": "die Seit und zugehöriche Unnerseite verschiebe",
        "pageswithprop-prophidden-binary": "Binäreichenschaftsweart versteckt ($1)",
        "doubleredirects": "Doppelte Weiterleitunge",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
-       "double-redirect-fixed-move": "[[$1]] woard verschub und leitet jetzt noh [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] woard verschub. Die Seit woard automatisch aktualisiert und leitet jetzt noh [[$2]] weiter.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]] in enem Woortungsufftrooch.",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitunge",
        "brokenredirectstext": "Die Spezialseit listiert Weiterleitung uff net existierende Seite uff.",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträch oonzeiche/verstecke",
        "allpages": "All Seite",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seit ($1)",
        "prevpage": "Vorhrich Seit ($1)",
        "allpagesfrom": "Seite oonzeiche ab:",
        "blockip": "IP-Adress/Benutzer sperre",
        "blockip-legend": "IP-Adress/Benutzer sperre",
        "blockiptext": "Mit dem Formular sperrst du en IP-Adress orrer en Benutzernoome, so dass von dort ken Ännrunge meh voargenomm sin könne.\nDas sollt nuar erfolche, um Vandalismus zu verhinnre und in Üwereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinie]].\nBittschön tue den Grund für die Sperr gebe.",
-       "ipadressorusername": "IP-Adress orrer Benutzernoome:",
+       "ipaddressorusername": "IP-Adress orrer Benutzernoome:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemein Sperrgründe\n** Infüchung von falscher Informatione\n** Leere von Seite\n** Massweises infüchung von externer Links\n** Instellung von unsinnicher Inhalte in Seite\n** Ungebührliches Verhalte\n** Missbrauch mit mehrre Benutzerkonte\n** Ungeeichneter Benutzernoome",
        "newimages-summary": "Die Spezialseit tut die zuletzt hochgeloodne Dateie oonzeiche.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinoome (orrer ein Tel davon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Kene Dateie gefund.",
        "ilsubmit": "Suche",
        "bydate": "noh Datum",
        "htmlform-no": "Ne, nein",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wähl ein Option",
+       "htmlform-cloner-create": "Weitre dozu tun",
+       "htmlform-cloner-delete": "Entferne",
+       "htmlform-cloner-required": "Es ist minschtens en Weart erforderlich.",
        "sqlite-has-fts": "Version $1 mit Unnerstützung für die Volltextsuch",
        "sqlite-no-fts": "Version $1 ohne Unnerstützung für die Volltextsuch",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seit $3",
index dfe8d8c..d980bb2 100644 (file)
        "action-createpage": "strony wutworić",
        "action-createtalk": "diskusijne strony wutworić",
        "action-createaccount": "wužiwarske konto załožić",
+       "action-history": "historiju tuteje strony pokazać",
        "action-minoredit": "tutu změnu jako snadnu markěrować",
        "action-move": "tutu stronu přesunyć",
        "action-move-subpages": "tutu stronu a jeje podstrony přesunyć",
        "log-title-wildcard": "Titul započina so z …",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazać/schować",
        "allpages": "Wšě nastawki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "přichodna strona ($1)",
        "prevpage": "předchadna strona ($1)",
        "allpagesfrom": "Strony pokazać, započinajo z:",
        "blockip": "Wužiwarja zablokować",
        "blockip-legend": "Wužiwarja blokować",
        "blockiptext": "Wužij slědowacy formular deleka, zo by pisanski přistup za podatu IP-adresu abo wužiwarske mjeno blokował. To měło so jenož stać, zo by wandalizmej zadźěwało a woptpowědujo [[{{MediaWiki:Policy-url}}|zasadam]]. Zapodaj deleka přičinu (na př. citujo wosebite strony, kotrež běchu z woporom wandalizma).",
-       "ipadressorusername": "IP-adresa abo wužiwarske mjeno",
+       "ipaddressorusername": "IP-adresa abo wužiwarske mjeno",
        "ipbexpiry": "Spadnjenje",
        "ipbreason": "Přičina:",
        "ipbreason-dropdown": "*powšitkowne přičiny\n** wandalizm\n** wutworjenje njezmyslnych stronow\n** linkspam\n** wobobinske nadběhi\n*specifiske přičiny\n** njepřihódne wužiwarske mjeno\n** znowapřizjewjenje na přeco zablokowaneho wužiwarja\n** proksy, wandalizma jednotliwych wužiwarjow dla dołhodobnje zablokowany",
        "newimages-summary": "Tuta specialna strona naliči aktualnje nahrate wobrazy a druhe dataje.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mjeno (abo dźěl z njeho):",
-       "showhidebots": "(bots $1)",
        "noimages": "Žane dataje.",
        "ilsubmit": "Pytać",
        "bydate": "datumje",
        "htmlform-no": "Ně",
        "htmlform-yes": "Haj",
        "htmlform-chosen-placeholder": "Wubjer móžnosć",
-       "htmlform-cloner-create": "Wjcace přidać",
+       "htmlform-cloner-create": "Wjace přidać",
        "htmlform-cloner-delete": "Wotstronić",
        "htmlform-cloner-required": "Znjamjeńša jedna hódnota je trěbna.",
        "sqlite-has-fts": "$1 połnotekstowe pytanje podpěruje.",
index 595081a..e29db8e 100644 (file)
        "gotaccountlink": "Bejelentkezés",
        "userlogin-resetlink": "Elfelejtetted a bejelentkezési adataidat?",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
+       "userlogin-helplink2": "Segítség a bejelentkezéshez",
        "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
        "userlogin-createanother": "Felhasználói fiók létrehozása",
        "createacct-emailrequired": "E-mail cím",
        "resetpass-abort-generic": "A jelszómódosítást megszakította egy kiterjesztés.",
        "resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
        "resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.",
+       "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:resetpass-submit-cancel}}\" gombra, ha később akarod megadni.",
        "passwordreset": "Jelszó törlése",
        "passwordreset-text-one": "A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.",
        "passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
        "editundo": "visszavonás",
        "diff-empty": "(Nincs különbség)",
        "diff-multi-sameuser": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}} ugyanattól a szerkesztőtől nincs mutatva)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}}, amit {{PLURAL:$2|egy másik szerkesztő végzett|$2 másik szerkesztő végzett}}, nincs mutatva)",
        "diff-multi-manyusers": "({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)",
        "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "searchresults": "A keresés eredménye",
        "search-section": "($1 szakasz)",
        "search-suggest": "Keresési javaslat: $1",
        "search-interwiki-caption": "Társlapok",
-       "search-interwiki-default": "$1 találat",
+       "search-interwiki-default": "$1 találatok:",
        "search-interwiki-more": "(több)",
        "search-relatedarticle": "Kapcsolódó",
        "searcheverything-enable": "Keresés az összes névtérben",
        "log-title-wildcard": "Így kezdődő címek keresése",
        "showhideselectedlogentries": "Kijelölt napló bejegyzések megjelenítése/elrejtése",
        "allpages": "Az összes lap listája",
-       "alphaindexline": "$1 – $2",
        "nextpage": "Következő lap ($1)",
        "prevpage": "Előző lap ($1)",
        "allpagesfrom": "Lapok listázása a következő címtől kezdve:",
        "blockip": "Blokkolás",
        "blockip-legend": "Felhasználó blokkolása",
        "blockiptext": "Az alábbi űrlap segítségével megvonhatod egy szerkesztő vagy IP-cím szerkesztési jogait.\nÜgyelj rá, hogy az intézkedésed mindig legyen tekintettel a vonatkozó [[{{MediaWiki:Policy-url}}|irányelvekre]].\nAdd meg a blokkolás okát is (például idézd a blokkolandó személy által vandalizált lapokat).",
-       "ipadressorusername": "IP-cím vagy felhasználói név",
+       "ipaddressorusername": "IP-cím vagy felhasználói név",
        "ipbexpiry": "Lejárat:",
        "ipbreason": "Ok:",
        "ipbreason-dropdown": "*Gyakori blokkolási okok\n** Téves információ beírása\n** Lapok tartalmának eltávolítása\n** Spammelgetés, reklámlinkek tömködése a lapokba\n** Értelmetlen megjegyzések, halandzsa beillesztése a cikkekbe\n** Megfélemlítő viselkedés, zaklatás\n** Több szerkesztői fiókkal való visszaélés\n** Elfogadhatatlan azonosító",
        "newimages-summary": "Ezen a speciális lapon láthatóak a legutóbb feltöltött fájlok.",
        "newimages-legend": "Fájlnév",
        "newimages-label": "Fájlnév (vagy annak részlete):",
-       "showhidebots": "(botok szerkesztéseinek $1)",
        "noimages": "Nem tekinthető meg semmi.",
        "ilsubmit": "Keresés",
        "bydate": "dátum szerint",
index ac2e3f3..ce10d7e 100644 (file)
        "blockip": "Մասնակցի արգելափակում",
        "blockip-legend": "Մասնակցի արգելափակում",
        "blockiptext": "Օգտագործեք ստորև բերված ձևը որոշակի IP-հասցեից կամ մասնակցի անունից գրելու հնարավորությունը արգելափակելու համար։\nՆման բան հարկավոր է անել միայն վանդալության կանխարգելման նպատակով և համաձայն [[{{MediaWiki:Policy-url}}|կանոնակարգի]]։\nՆշեք արգելափակման որոշակի պատճառը ստորև (օրինակ՝ նշեք այն էջը, որում վանդալություն է տեղի ունեցել)։",
-       "ipadressorusername": "IP-հասցե կամ մասնակցի անուն.",
+       "ipaddressorusername": "IP-հասցե կամ մասնակցի անուն.",
        "ipbexpiry": "Մարման ժամկետ.",
        "ipbreason": "Պատճառ.",
        "ipbreason-dropdown": "*Արգելափակման սովորական պատճառներ\n** Կեղծ տեղեկությունների ներմուծում\n** Էջերից նյութերի հեռացում\n** Արտաքին կայքերին հղումների սպամ\n** Անիմաստ/անկապ տեքստի ներմուծում էջերում\n** Վարկաբեկող/ահաբեկող պահվածք\n** Բազմաթիվ մասնակցային հաշիվների չարաշահում\n** Անպատշաճ մասնակցի անուն",
        "newimages": "Նոր նիշքերի սրահ",
        "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։",
        "newimages-legend": "Ֆիլտր",
-       "showhidebots": "($1 բոտերին)",
        "noimages": "Տեսնելու բան չկա։",
        "ilsubmit": "Որոնել",
        "bydate": "ըստ ամսաթվի",
index da12405..bd1d41e 100644 (file)
        "blockip": "Blocar usator",
        "blockip-legend": "Blocar usator",
        "blockiptext": "Usa le formulario infra pro blocar le accesso de scriptura\na partir de un adresse IP specific.\nIsto debe esser facite solmente pro impedir vandalismo, e de\naccordo con le [[{{MediaWiki:Policy-url}}|politica de {{SITENAME}}]].\nScribe un motivo specific infra (per exemplo, citante paginas\nspecific que ha essite vandalisate).",
-       "ipadressorusername": "Adresse IP o nomine de usator:",
+       "ipaddressorusername": "Adresse IP o nomine de usator:",
        "ipbexpiry": "Expiration:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frequente pro blocar\n** Insertion de informationes false\n** Elimination de contento de paginas\n** Ligamines ''spam'' verso sitos externe\n** Insertion de nonsenso/absurditates in paginas\n** Comportamento intimidatori/molestation\n** Abuso de contos multiple\n** Nomine de usator inacceptabile",
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nihil a vider.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
index ba8a253..545f719 100644 (file)
        "protectedpages-unknown-timestamp": "Tidak diketahui",
        "protectedpages-unknown-performer": "Pengguna yang tidak diketahui",
        "protectedtitles": "Judul yang dilindungi",
+       "protectedtitles-summary": "Halaman ini mendaftarkan judul-judul yang saat ini dilindungi dari pembuatan. Untuk daftar halaman yang sudah ada dan dilindungi, lihat [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tidak ada judul yang dilindungi.",
        "listusers": "Daftar pengguna",
        "listusers-editsonly": "Tampilkan hanya pengguna yang memiliki kontribusi",
        "log-title-wildcard": "Cari judul yang diawali dengan teks tersebut",
        "showhideselectedlogentries": "Tampilkan/sembunyikan entri log terpilih",
        "allpages": "Semua halaman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman selanjutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tampilkan halaman mulai dari:",
        "listgrouprights-namespaceprotection-namespace": "Ruang nama",
        "listgrouprights-namespaceprotection-restrictedto": "Hak yang mengizinkan pengguna untuk menyunting",
        "trackingcategories": "Kategori pelacak",
+       "trackingcategories-summary": "Halaman ini mendaftarkan kategori-kategori pelacak yang secara otomatis dibuat oleh perangkat lunak MediaWiki. Nama kategori ini dapat diubah dengan mengubah pesan sistem yang sesuai dalam ruang nama {{ns:8}}.",
        "trackingcategories-msg": "Kategori pelacak",
        "trackingcategories-name": "Nama pesan",
        "trackingcategories-desc": "Kriteria inklusi kategori",
+       "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
        "post-expand-template-inclusion-category-desc": "Setelah memperluas semua templat, ukuran halaman menjadi lebih besar dari <code>$wgMaxArticleSize</code>, sehingga beberapa templat tidak diperluas.",
        "broken-file-category-desc": "Kategori ditambahkan jika halaman tersebut berisi pranala rusak (pranala untuk menanamkan sebuah berkas ketika berkas tersebut tidak ada).",
        "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "protect-locked-blocked": "Anda tak dapat mengganti tingkat pelindungan selagi diblokir. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-locked-dblock": "Tingkat pelindungan tak dapat diganti karena aktifnya penguncian basis data. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-locked-access": "Akun Anda tidak dapat memiliki hak untuk mengganti tingkat pelindungan halaman. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
-       "protect-cascadeon": "Halaman ini sedang dilindungi karena disertakan dalam {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan pilihan pelindungan runtun diaktifkan. Anda dapat mengganti tingkat pelindungan untuk halaman ini, tapi hal tersebut tidak akan mempengaruhi pelindungan runtun.",
+       "protect-cascadeon": "Halaman ini sedang dilindungi karena disertakan dalam {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan pilihan pelindungan runtun diaktifkan.\nPenggantian tingkat pelindungan untuk halaman ini tidak akan mempengaruhi pelindungan runtun.",
        "protect-default": "Izinkan semua pengguna",
        "protect-fallback": "Hanya untuk pengguna dengan izin  \"$1\"",
        "protect-level-autoconfirmed": "Hanya untuk pengguna terdaftar otomatis",
        "blockip": "Blokir pengguna",
        "blockip-legend": "Blokir pengguna",
        "blockiptext": "Gunakan formulir di bawah untuk memblokir akses penulisan dari sebuah alamat IP atau pengguna tertentu.\nIni hanya boleh dilakukan untuk mencegah vandalisme, dan sejalan dengan [[{{MediaWiki:Policy-url}}|kebijakan]].\nMasukkan alasan Anda di bawah (contoh, menuliskan nama halaman yang telah divandalisasi).",
-       "ipadressorusername": "Alamat IP atau nama pengguna:",
+       "ipaddressorusername": "Alamat IP atau nama pengguna:",
        "ipbexpiry": "Kedaluwarsa:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan umum\n** Vandalisme\n** Memberikan informasi palsu\n** Menghilangkan isi halaman\n** Spam pranala ke situs luar\n** Memasukkan omong kosong ke halaman\n** Perilaku intimidasi/pelecehan\n** Menyalahgunakan beberapa akun\n** Nama pengguna tak layak",
        "range_block_disabled": "Kemampuan pengurus dalam membuat blokir blok IP dimatikan.",
        "ipb_expiry_invalid": "Waktu kedaluwarsa tidak sah.",
        "ipb_expiry_temp": "Pemblokiran atas nama pengguna yang disembunyikan harus permanen.",
-       "ipb_hide_invalid": "Tak dapat menutup akun ini; mungkin akun tersebut memiliki terlalu banyak suntingan.",
+       "ipb_hide_invalid": "Tak dapat menutup akun ini; akun tersebut memiliki {{PLURAL:$1|satu suntingan|$1 suntingan}}.",
        "ipb_already_blocked": "\"$1\" telah diblokir",
        "ipb-needreblock": "$1 sudah diblokir. Apakah Anda ingin mengubah set pemblokiran yang bersangkutan?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blok|Blok}} lain",
        "newimages-summary": "Halaman istimewa berikut menampilkan daftar berkas yang terakhir dimuat",
        "newimages-legend": "Penyaring",
        "newimages-label": "Nama berkas (atau sebagian dari nama berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tidak ada yang dilihat.",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Pilih opsi",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
+       "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
index 6fee47c..715a939 100644 (file)
        "blockip": "Serraan ti agar-aramat",
        "blockip-legend": "Serraan ti agar-aramat",
        "blockiptext": "Usaren ti kinabuklan dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
-       "ipadressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Nabutbuteng a panagkukua /agriribok\n** Agab-abuso kadagiti sabsabali a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
        "newimages-summary": "Daytoy nga espesial a panid ket ipakitana ti kinaudi a pinag-ipan kadagiti papeles.",
        "newimages-legend": "Sagat",
        "newimages-label": "Nagan ti papeles (wenno paset na) :",
-       "showhidebots": "($1 dagiti bot)",
        "noimages": "Awan ti makita.",
        "ilsubmit": "Biruken",
        "bydate": "babaen ti petsa",
index 372c607..d7a1e69 100644 (file)
        "blockip": "Banna notanda",
        "blockip-legend": "Banna notanda",
        "blockiptext": "Notaðu eyðublaðið hér að neðan til þess að banna ákveðið vistfang eða notandanafn.\nÞetta ætti einungis að gera til þess að koma í veg fyrir skemmdarverk, og í samræmi við [[{{MediaWiki:Policy-url}}|samþykktir]].\nGefðu nákvæma skýringu að neðan (til dæmis, með því að vísa í þær síður sem skemmdar voru).",
-       "ipadressorusername": "Vistfang eða notandanafn:",
+       "ipaddressorusername": "Vistfang eða notandanafn:",
        "ipbexpiry": "Bannið rennur út:",
        "ipbreason": "Ástæða:",
        "ipbreason-dropdown": "* Algengar bannástæður\n** Setur inn rangar upplýsingar\n** Fjarlægir efni af síðum\n** Setur inn rusltengla á utanaðkomandi síður\n** Setur inn vitleysu/þvaður á síður\n** Yfirþyrmandi framkoma/áreitni\n** Misnotkun á fjölda notandanafna\n** Óásættanlegt notandanafn",
        "newimages-summary": "Þessi kerfissíða sýnir nýlega innhlaðnar skrár.",
        "newimages-legend": "Sía",
        "newimages-label": "Skráarnafn (eða hluti þess):",
-       "showhidebots": "($1 vélmenni)",
        "noimages": "Ekkert að sjá.",
        "ilsubmit": "Leita",
        "bydate": "eftir dagsetningu",
index 3c30cf1..78daf74 100644 (file)
        "right-move": "Sposta le pagine",
        "right-move-subpages": "Sposta le pagine insieme alle relative sottopagine",
        "right-move-rootuserpages": "Sposta le pagine principali degli utenti",
+       "right-move-categorypages": "Sposta le categorie",
        "right-movefile": "Sposta i file",
        "right-suppressredirect": "Non crea un redirect automatico quando si sposta una pagina",
        "right-upload": "Carica file",
        "action-move": "spostare questa pagina",
        "action-move-subpages": "spostare questa pagina e le relative sottopagine",
        "action-move-rootuserpages": "spostare le pagine principali degli utenti",
+       "action-move-categorypages": "spostare le categorie",
        "action-movefile": "spostare questo file",
        "action-upload": "caricare questo file",
        "action-reupload": "sovrascrivere questo file esistente",
        "log-title-wildcard": "Ricerca dei titoli che iniziano con",
        "showhideselectedlogentries": "Mostra/nascondi le voci di registro selezionate",
        "allpages": "Tutte le pagine",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pagina successiva ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mostra le pagine a partire da:",
        "blockip": "Blocco utente",
        "blockip-legend": "Blocca l'utente",
        "blockiptext": "Usare il modulo sottostante per bloccare l'accesso in scrittura a uno specifico indirizzo IP o un utente registrato.\nIl blocco dev'essere operato per prevenire atti di vandalismo e in stretta osservanza della [[{{MediaWiki:Policy-url}}|policy di {{SITENAME}}]].\nIndicare il motivo specifico per il quale si procede al blocco (per esempio, citando i titoli di eventuali pagine oggetto di vandalismo).",
-       "ipadressorusername": "Indirizzo IP o nome utente:",
+       "ipaddressorusername": "Indirizzo IP o nome utente:",
        "ipbexpiry": "Scadenza del blocco:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivazioni più comuni per i blocchi\n** Inserimento di informazioni false\n** Rimozione di contenuti dalle pagine\n** Collegamenti promozionali a siti esterni\n** Inserimento di contenuti privi di senso\n** Comportamenti intimidatori o molestie\n** Uso indebito di utenze multiple\n** Nome utente non consono",
        "movepagetalktext": "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':\n* lo spostamento della pagina è tra namespace diversi;\n* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);\n* la casella qui sotto è stata deselezionata.\n\nIn questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manualmente le informazioni contenute nella pagina di discussione.",
        "movearticle": "Sposta la pagina:",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
+       "movecategorypage-warning": "<strong>Attenzione:</strong> stai per spostare una categoria. Solo la pagina verrà spostata, ma tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "movenotallowed": "Non si dispone dei permessi necessari per spostare le pagine.",
        "movenotallowedfile": "Non si dispone dei permessi necessari per spostare i file.",
        "cant-move-user-page": "Non si dispone dei permessi necessari per spostare le pagine utente (escluse le sottopagine).",
        "cant-move-to-user-page": "Non si dispone dei permessi necessari per spostare la pagina su una pagina utente (escluse le sottopagine utente).",
+       "cant-move-category-page": "Non si dispone dei permessi necessari per spostare categorie.",
+       "cant-move-to-category-page": "Non si dispone dei permessi necessari per spostare la pagina su una categoria.",
        "newtitle": "Nuovo titolo:",
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "newimages-summary": "Questa pagina speciale mostra i file caricati più di recente.",
        "newimages-legend": "Filtra",
        "newimages-label": "Nome file (o una parte di esso):",
-       "showhidebots": "($1 i bot)",
+       "newimages-showbots": "Mostra caricamenti di bot",
        "noimages": "Non c'è nulla da vedere.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "watchlistedit-raw-title": "Modifica degli osservati speciali in forma testuale",
        "watchlistedit-raw-legend": "Modifica testuale osservati speciali",
        "watchlistedit-raw-explain": "Di seguito sono elencate tutte le pagine osservate. Per modificare la lista aggiungere o rimuovere i rispettivi titoli, uno per riga.\nUna volta terminato, fare clic su \"{{int:Watchlistedit-raw-submit}}\" in fondo all'elenco.\nSi noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l'interfaccia standard]].",
-       "watchlistedit-raw-titles": "Titoli delle pagine:",
+       "watchlistedit-raw-titles": "Titoli:",
        "watchlistedit-raw-submit": "Aggiorna la lista",
        "watchlistedit-raw-done": "La lista degli osservati speciali è stata aggiornata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|È stata aggiunta una pagina|Sono state aggiunte $1 pagine}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-clear-title": "Osservati speciali puliti",
+       "watchlistedit-clear-legend": "Pulisci osservati speciali",
+       "watchlistedit-clear-explain": "Tutti i titoli saranno rimossi dai tuoi osservati speciali",
+       "watchlistedit-clear-titles": "Titoli:",
+       "watchlistedit-clear-submit": "Pulisci gli osservati speciali (sarà permanente!)",
+       "watchlistedit-clear-done": "La lista degli osservati speciali è stata pulita.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
+       "watchlisttools-clear": "Pulisci gli osservati speciali",
        "watchlisttools-view": "Visualizza le modifiche pertinenti",
        "watchlisttools-edit": "Visualizza e modifica la lista degli osservati speciali",
        "watchlisttools-raw": "Modifica la lista in formato testo",
        "compare-submit": "Confronta",
        "compare-invalid-title": "Il titolo che hai specificato non è valido.",
        "compare-title-not-exists": "Il titolo che hai specificato non esiste.",
-       "compare-revision-not-exists": "La revisione che hai specificato non esiste.",
+       "compare-revision-not-exists": "La versione che hai specificato non esiste.",
        "dberr-problems": "Questo sito sta avendo dei problemi tecnici.",
        "dberr-again": "Prova ad attendere qualche minuto e ricaricare.",
        "dberr-info": "(Impossibile contattare il server del database: $1)",
index 7a364e1..7c29cf8 100644 (file)
@@ -57,7 +57,8 @@
                        "欅",
                        "蝋燭α",
                        "青子守歌",
-                       "아라"
+                       "아라",
+                       "Rxy"
                ]
        },
        "tog-underline": "リンクの下線:",
        "jumptonavigation": "案内",
        "jumptosearch": "検索",
        "view-pool-error": "申し訳ありませんが、現在サーバーに過大な負荷がかかっています。\nこのページを閲覧しようとする利用者が多すぎます。\nしばらく時間を置いてから、もう一度このページにアクセスしてみてください。\n\n$1",
+       "generic-pool-error": "申し訳ありませんが、現在サーバーに過大な負荷がかかっています。\nこのページを閲覧しようとする利用者が多すぎます。\nしばらく時間を置いてから、もう一度このリソースにアクセスしてみてください。",
        "pool-timeout": "ロック待ちタイムアウト",
        "pool-queuefull": "プールキューがいっぱいです",
        "pool-errorunknown": "不明なエラー",
        "right-move": "ページを移動",
        "right-move-subpages": "下位ページを含めてページを移動",
        "right-move-rootuserpages": "利用者ページ本体を移動",
+       "right-move-categorypages": "カテゴリのページを移動",
        "right-movefile": "ファイルを移動",
        "right-suppressredirect": "転送ページを作成せずにページを移動",
        "right-upload": "ファイルをアップロード",
        "action-move": "このページの移動",
        "action-move-subpages": "このページとその下位ページの移動",
        "action-move-rootuserpages": "利用者ページ本体の移動",
+       "action-move-categorypages": "カテゴリのページの移動",
        "action-movefile": "このファイルの移動",
        "action-upload": "このファイルのアップロード",
        "action-reupload": "この既存のファイルへの上書き",
        "doubleredirects": "二重転送",
        "doubleredirectstext": "このページでは、転送ページへの転送ページを列挙します。\n最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。\n<del>取り消し線</del>が入った項目は解決済みです。",
        "double-redirect-fixed-move": "[[$1]]を移動しました。\n今後は[[$2]]に転送されます。",
-       "double-redirect-fixed-maintenance": "[[$1]]から[[$2]]への二重転送を修正します。",
+       "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します。",
        "double-redirect-fixer": "転送修正係",
        "brokenredirects": "迷子のリダイレクト",
        "brokenredirectstext": "以下は、存在しないページへのリダイレクトの一覧です:",
        "log-title-wildcard": "この文字列で始まるページ名を検索",
        "showhideselectedlogentries": "選択した記録項目を表示/非表示",
        "allpages": "全ページ",
-       "alphaindexline": "$1から$2まで",
        "nextpage": "次のページ ($1)",
        "prevpage": "前のページ ($1)",
        "allpagesfrom": "最初に表示するページ:",
        "listgrouprights-removegroup-self": "自身のアカウントから{{PLURAL:$2|グループ}}を除去: $1",
        "listgrouprights-addgroup-self-all": "自身のアカウントに全グループを追加可能",
        "listgrouprights-removegroup-self-all": "自身のアカウントから全グループを除去可能",
+       "listgrouprights-namespaceprotection-header": "名前空間ごとの制限",
        "listgrouprights-namespaceprotection-namespace": "名前空間",
+       "listgrouprights-namespaceprotection-restrictedto": "編集を可能にする権限",
        "trackingcategories": "追跡用カテゴリ",
        "trackingcategories-summary": "このページでは、MediaWiki ソフトウェアが自動的に追加した追跡用カテゴリを列挙します。これらの名前は、{{ns:8}} 名前空間内の対応するシステム メッセージを修正することで変更できます。",
        "trackingcategories-msg": "追跡用カテゴリ",
        "trackingcategories-name": "メッセージ名",
+       "trackingcategories-desc": "カテゴリに入る基準",
        "post-expand-template-inclusion-category-desc": "テンプレートを展開したあとのページ サイズが <code>$wgMaxArticleSize</code> よりも大きいため、一部のテンプレートが展開されなかった",
        "post-expand-template-argument-category-desc": "テンプレート引数 (<code>{{{Foo}}}</code> のような三重中括弧部分) を展開したあとのページが <code>$wgMaxArticleSize</code> よりも大きい",
        "expensive-parserfunction-category-desc": "高負荷なパーサー関数 (<code>#ifexist</code> など) の呼び出し回数が多過ぎるページ。[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] を参照してください。",
        "broken-file-category-desc": "リンク切れしたファイルを含むページ (ファイルを埋め込むリンクがあり、そのファイルが存在しない) に追加されるカテゴリ",
        "hidden-category-category-desc": "<code><nowiki>__HIDDENCAT__</nowiki></code> を含むカテゴリ。このカテゴリは、既定ではページのカテゴリ リンク ボックス内に表示されません。",
        "trackingcategories-nodesc": "説明はありません。",
+       "trackingcategories-disabled": "このカテゴリは無効化されています",
        "mailnologin": "送信アドレスがありません",
        "mailnologintext": "他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。",
        "emailuser": "この利用者にメールを送信",
        "blockip": "利用者をブロック",
        "blockip-legend": "利用者をブロック",
        "blockiptext": "以下のフォームを使用して、指定したIPアドレスまたは利用者からの書き込みアクセスをブロックできます。\nこのような措置は、荒らしからの防御の目的のみに行われるべきで、また[[{{MediaWiki:Policy-url}}|方針]]に沿ったものであるべきです。\n以下にブロックの理由を具体的に書いてください (例えば、荒らされたページへの言及など)。",
-       "ipadressorusername": "IPアドレスまたは利用者名:",
+       "ipaddressorusername": "IPアドレスまたは利用者名:",
        "ipbexpiry": "有効期限:",
        "ipbreason": "理由:",
        "ipbreason-dropdown": "*よくあるブロック理由\n** 虚偽情報の挿入\n** ページから内容の除去\n** 外部サイトへのスパムリンク追加\n** ページへ無意味な/意味不明な内容の挿入\n** 威圧的な態度/嫌がらせ\n** 複数アカウントの不正利用\n** 不適切な利用者名",
        "movepagetalktext": "関連付けられたトークページも一緒に、自動的に移動されます。ただし、<strong>以下の場合を除きます:</strong>\n* 移動先に、空ではないトークページが既に存在する場合\n* 下のボックスのチェックを消した場合\n\nこれらの場合、必要に応じて、トークページを移動または統合する必要があります。",
        "movearticle": "移動するページ:",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
+       "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
        "movenotallowed": "ページを移動する権限がありません。",
        "movenotallowedfile": "ファイルを移動する権限がありません。",
        "cant-move-user-page": "利用者ページを移動させる権限がありません (下位ページ内を除く)。",
        "cant-move-to-user-page": "利用者下位ページ以外の利用者ページに、ページを移動させる権限がありません。",
+       "cant-move-category-page": "カテゴリのページを移動させる権限がありません。",
+       "cant-move-to-category-page": "ページをカテゴリのページに移動させる権限がありません。",
        "newtitle": "新しいページ名:",
        "move-watch": "移動元と移動先ページをウォッチ",
        "movepagebtn": "ページを移動",
        "newimages-summary": "この特別ページでは、最近アップロードされたファイルを表示します。",
        "newimages-legend": "絞り込み",
        "newimages-label": "ファイル名 (またはその一部):",
-       "showhidebots": "(ボットを$1)",
+       "newimages-showbots": "ボットによるアップロードを表示",
        "noimages": "表示できるものがありません。",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "watchlistedit-raw-done": "ウォッチリストを更新しました。",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 ページ}}を追加しました:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 ページ}}を除去しました:",
+       "watchlistedit-clear-explain": "ウォッチリストに追加されたページ名がすべて除去されます",
+       "watchlistedit-clear-titles": "ページ名:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|$1 件のページ}}を除去しました:",
+       "watchlistedit-too-many": "ページ数が多すぎるため表示できません。",
        "watchlisttools-view": "関連する変更を閲覧",
        "watchlisttools-edit": "ウォッチリストの閲覧と編集",
        "watchlisttools-raw": "ウォッチリストをテキストで編集",
index 9f97c70..dc61e25 100644 (file)
        "blockip": "Blokir panganggo",
        "blockip-legend": "Blokir panganggo",
        "blockiptext": "Enggonen formulir ing ngisor iki kanggo mblokir sawijining alamat IP utawa panganggo supaya ora bisa nyunting kaca.\nPrekara iki perlu dilakoni kanggo menggak vandalisme, lan miturut [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].\nLebokna alesan panjenengan ing ngisor iki (contoné njupuk conto kaca sing wis tau dirusak).",
-       "ipadressorusername": "Alamat IP utawa jeneng panganggo",
+       "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
        "ipbreason-dropdown": "*Alesan umum mblokir panganggo\n** Mènèhi informasi palsu\n** Ngilangi isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak intimidasi/nglècèhaké\n** Nyalahgunakaké sawetara akun utawa rékening\n** Jeneng panganggo ora layak",
        "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké daftar berkas anyar dhéwé sing diunggahaké.",
        "newimages-legend": "Filter",
        "newimages-label": "Jeneng berkas (utawa sapérangan seka jeneng berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Ora ana sing dideleng.",
        "ilsubmit": "Golek",
        "bydate": "miturut tanggal",
index 4045ee3..d52e783 100644 (file)
        "gotaccountlink": "შესვლა",
        "userlogin-resetlink": "ავტორიზაციის მონაცემები დაგავიწყდათ?",
        "userlogin-resetpassword-link": "დაგავიწყდათ პაროლი?",
+       "userlogin-helplink2": "დახმარება:შესვლა",
        "userlogin-createanother": "სხვა ანგარიშის შექმნა",
        "createacct-emailrequired": "ელ. ფოსტის მისამართი",
        "createacct-emailoptional": "ელ. ფოსტის მისამართი (არასავალდებულო)",
        "log-title-wildcard": "სათაურების ძებნა, რომლებიც იწყება ამ ტექსტით",
        "showhideselectedlogentries": "არჩეული ჟურნალის ჩანაწერის ჩვენება/დამალვა",
        "allpages": "ყველა გვერდი",
-       "alphaindexline": "$1-დან $2-მდე",
        "nextpage": "შემდეგი გვერდი ($1)",
        "prevpage": "წინა გვერდი ($1)",
        "allpagesfrom": "გვერდების ჩვენება დაწყებული:",
        "blockip": "მომხმარებლის ან IP მისამართის ბლოკირება",
        "blockip-legend": "მომხმარებლის დაბლოკვა",
        "blockiptext": "გამოიყენეთ ქვემოთ მოყვანილი ფორმა სპეციფიური IP მისამართის\nან მომხმარებლისთვის რედაქტირების ბლოკირებისთვის.\nამის გაკეთება შეიძლება მხოლოდ ვანდალიზმის ასარიდებლად,\nდა [[{{MediaWiki:Policy-url}}|პოლიტიკასთან]] თანხმობაში.\nჩაწერეთ სპეციფიური მიზეზი ქვემოთ (მაგ. მიუთითეთ გვერდები,\nრომლებზეც ვანდალიზმი განხორციელდა).",
-       "ipadressorusername": "IP მისამართი ან მომხმარებლის სახელი",
+       "ipaddressorusername": "IP მისამართი ან მომხმარებლის სახელი",
        "ipbexpiry": "ვადა",
        "ipbreason": "მიზეზი:",
        "ipbreason-dropdown": "* დაბლოკვის სტანდარტული მიზეზები\n** ცრუ ინფორმაციის ჩამატება\n** გვერდების შინაარსის წაშლა\n** სპამ ბმულები გარე საიტებზე\n** სულელური ტექსტის/ნაგვის ჩამატება\n** დაშინება, მომხმარებელთა დარბევა\n** რამდენიმე ანგარიშის ბოროტად გამოყენება\n** მომხმარებლის მიუღებელი სახელი",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
-       "showhidebots": "(რობოტების $1)",
        "noimages": "გადასახედი არაფერია.",
        "ilsubmit": "ძიება",
        "bydate": "თარიღით",
index 1dafab6..7737c39 100644 (file)
        "blockip": "Ɛekkel aseqdac",
        "blockip-legend": "Ɛekkel aseqdac",
        "blockiptext": "Seqdec tiferkit ddaw-agi iwakken ad  sewḥeleḍ ineɛruḍen n ubeddel seg yiwet tansa IP tulmist neɣ n yiwen isem umseqdac.\nAsket am wagi, ur ilaq ad yetwexddem kan iwakken ad yeεeggen axeṣṣar dɣa ilaq ad yemtawi s [[{{MediaWiki:Policy-url}}|ilugan igensanen]].\nEfked ddaw-agi taɣẓint tusdidt (amedya : efked isebtar yetwaxeṣṣren).",
-       "ipadressorusername": "Tansa IP neɣ isem n wemseqdac",
+       "ipaddressorusername": "Tansa IP neɣ isem n wemseqdac",
        "ipbexpiry": "Tanzagt uqbel aneffeṛ :",
        "ipbreason": "Ayɣer",
        "ipbreason-dropdown": "* Tiɣẓinin n ukyaf id ttuɣalen aṭas tikwal\n** Taguri n tilɣa n ukellax\n** Tukksa war assefhem n ugbur n isebtar\n** Taguri s uɛiwed n izdayen uffiɣen ɣer idellilen (abluleɣ)\n** Taguri n ugbur war anamek d tursaḍ deg isebtar\n** Aneɛruḍ n umsiged neɣ ubbezbax\n** Tafuli n useqdac n aṭas imiḍanen\n** Isem n umseqdac ur nezmer ara an qbel, d-anergam neɣ d-abucemmat",
        "newimages-summary": "Asebtar agi uslig yebeqqeḍ ifuyla ineggura i kteren.",
        "newimages-legend": "Tastayt",
        "newimages-label": "Isem n ufaylu (naɣ aḥric ines) :",
-       "showhidebots": "($1 iṛubuten)",
        "noimages": "Tugna ulac-itt.",
        "ilsubmit": "Nadi",
        "bydate": "s uzemz",
index 919a5e6..7d03a8c 100644 (file)
        "nmembers": "$1 {{PLURAL:$1|eza|ezay}}",
        "nrevisions": "$1 {{PLURAL:$1|çım-ra-viarnais|çım-ra-viarnaişi}}",
        "nviews": "$1 {{PLURAL:$1|vênais|vênaişi}}",
-       "uncategorizedpages": "Pelê kategorizenêkerdey",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "prefixindex": "Peli pêro be verbend",
        "shortpages": "Pelê kılmi",
        "longpages": "Pelê dergi",
        "speciallogtitlelabel": "Sernuste:",
        "log": "Qeydi",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 bere $2",
        "nextpage": "Pela peyê coy ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelê ke be na herfe dest niyo pıra bıasne:",
        "removedwatchtext": "Na pele \"[[:$1]]\" [[Special:Watchlist|lista tuya şêrkerdişi]] ra esteriya.",
        "watch": "Şêr ke",
        "watchthispage": "Na pele de şêr ke",
-       "unwatch": "Endi şêr meke",
+       "unwatch": "Şêr meke",
        "watchlist-details": "Pelunê hurênaişi ra qêri {{PLURAL:$1|$1 pele lista şêrkerdişi dera|$1 peli lista şêrkerdişi derê}}.",
        "wlshowlast": "$1 saetunê $2 rozunê peyênu bıasne $3",
        "watchlist-options": "Alternatifê lista şêrkerdene",
index 09d44ea..a2a890e 100644 (file)
        "searchall": "барлық",
        "showingresults": "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
        "showingresultsnum": "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
-       "showingresultsheader": "«'''$4'''» үшін {{PLURAL:$5|тек '''$1''' нәтиже табылды|табылған '''$3''' нәтиженің '''$1—$2''' аралығы көрсетілген}}",
+       "showingresultsheader": "«<strong>$4</strong>» сұранысына {{PLURAL:$5|тек <strong>$1</strong> нәтиже табылды|табылған <strong>$3</strong> нәтиженің <strong>$1 - $2</strong> аралығы көрсетілген}}",
        "search-nonefound": "Сұрауға сәйкес нәтижелер табылмады.",
        "powersearch-legend": "Кеңейтілген іздеу",
        "powersearch-ns": "Атау кеңістіктері бойынша іздеу:",
        "booksources-go": "Өту",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген. Бұл тораптарда ізделген кітаптар туралы былайғы ақпарат болуға мүмкін.",
        "specialloguserlabel": "Орындаушы:",
-       "speciallogtitlelabel": "Нысана (тақырып аты немесе қатысушы):",
+       "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
        "log": "Журналдар",
        "all-logs-page": "Барлық журналдар",
        "alllogstext": "{{SITENAME}} жобасының барлық қатынаулы журналдарын біріктіріп көрсетуі.\nЖурнал түрін, қатысушы атын (үлкен кішілігін ескеріп), не тиісті бетін бөлектеп, тарылтып қарай аласыз (кейде үлкен кішілігін ескеріп).",
        "log-title-wildcard": "Мына мәтіннен басталытын тақырып аттарын іздеу",
        "showhideselectedlogentries": "Таңдалған журнал енгізілімдерін көрсету/жасыру",
        "allpages": "Барлық беттер",
-       "alphaindexline": "$1 дегеннен $2",
        "nextpage": "Келесі бетке ($1)",
        "prevpage": "Алдыңғы бетке ($1)",
        "allpagesfrom": "Мына беттерден бастап көрсету:",
        "noemailtext": "Бұл қатысушы жарамды е-пошта мекенжайын келтірмеген.",
        "emailusername": "Қатысушы аты:",
        "emailusernamesubmit": "Жіберу",
-       "email-legend": "Басқа{{SITENAME}} қатысушысына хат жіберу",
+       "email-legend": "Басқа {{SITENAME}} қатысушысына хат жіберу",
        "emailfrom": "Кімнен:",
        "emailto": "Кімге:",
        "emailsubject": "Тақырыбы:",
        "blockip": "Қатысушыны бұғаттау",
        "blockip-legend": "Қатысушыны бұғаттау",
        "blockiptext": "Төмендегі форманы жазу рұқсатын белгілі IP мекенжайынан не қатысушы есімінен бұғаттау үшін қолданыңыз.\nБұны тек бұзақылықты болдырмау үшін және де [[{{MediaWiki:Policy-url}}|ережелер]] бойынша атқаруыңыз кажет.\nТөменге тиісті себебін көрсетіңіз (мысалы дәлелге бұзақылықпен өзгертілген беттерді келтіріңіз).",
-       "ipadressorusername": "IP-мекенжайы немесе қатысушы аты:",
+       "ipaddressorusername": "IP-мекенжайы немесе қатысушы аты:",
        "ipbexpiry": "Мерзімі бітпек:",
        "ipbreason": "Себебі:",
        "ipbreason-dropdown": "* Бұғаттаудың жалпы себебтері\n** Жалған мәлімет енгізу\n** Беттердегі мағлұматты аластау\n** Сыртқы сайттар сілтемелерін жаудыру\n** Беттерге мағынасыздық/балдырлау кірістіру\n** Қоқандау/қуғындау мінезқұлық\n** Бірнеше рет тіркеліп қиянаттау\n** Өрескел қатысушы аты",
        "blocklog-showsuppresslog": "Бұл қатысушы ұдайы жасырылып және бұғатталып отырған.\nДерек үшін төменде жасыру журналы берілген:",
        "blocklogentry": "[[$1]] дегенді $2 мерзімге бұғаттады $3",
        "blocklogtext": "Бұл қатысушыларды бұғаттау және бұғаттауынан босату әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар тізімделмеген.\nҚазіргі уақыттағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|бұғаттау тізімінен]] қараңыз.",
-       "unblocklogentry": "$1 бұғаттауынан босатты",
+       "unblocklogentry": "$1 ÐµÑ\81Ñ\96мдÑ\96 Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bнÑ\8b Ð±Ò±Ò\93аÑ\82Ñ\82аÑ\83Ñ\8bнан Ð±Ð¾Ñ\81аÑ\82Ñ\82Ñ\8b",
        "block-log-flags-anononly": "тек аноним қатысушылар",
        "block-log-flags-nocreate": "тіркелу өшірілген",
        "block-log-flags-noautoblock": "автобұғаттау өшірілген",
        "pageinfo-length": "Бет ұзындығы (байтпен)",
        "pageinfo-article-id": "Бет ID-і",
        "pageinfo-language": "Бет мәлімет тілі",
-       "pageinfo-content-model": "Бет мағұлымат қалпы",
+       "pageinfo-content-model": "Бет мағлұмат қалпы",
        "pageinfo-robot-policy": "Индекстеуді робот жүргізеді",
        "pageinfo-robot-index": "Рұқсат берілген",
        "pageinfo-robot-noindex": "Рұқсат етілмеген",
        "imagelisttext": "Төменде $2 сұрыпталған '''$1''' файл тізімі.",
        "newimages-summary": "Бұл арнайы бетте соңғы жүктелген файлдар көрсетіледі",
        "newimages-legend": "Сүзгі",
-       "showhidebots": "(боттарды $1)",
        "noimages": "Көретін ештеңе жоқ.",
        "ilsubmit": "Іздеу",
        "bydate": "күн-айымен",
        "logentry-delete-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-delete-revision": "$1 $3 бетіндегі {{PLURAL:$5|нұсқа|$5 нұсқа}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-suppress-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін құпия түрде {{GENDER:$2|өзгертті}}: $4",
-       "revdelete-content-hid": "мағұлымат жасырылған",
+       "revdelete-content-hid": "мағлұмат жасырылған",
        "revdelete-summary-hid": "өңдеу түйіндемесі жасырылған",
        "revdelete-uname-hid": "қатысушы есімі жасырылған",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
index 2d8ca6f..fa16fff 100644 (file)
        "blockip": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "blockip-legend": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "blockiptext": "សូម​ប្រើប្រាស់​សំណុំ​បែបបទ​ខាងក្រោម​ដើម្បី​ហាមឃាត់ការសរសេរ​ពី​អាសយដ្ឋាន IP ឬ​ឈ្មោះ​អ្នកប្រើប្រាស់ណាមួយ​។\nការ​ធ្វើ​បែបនេះ​គួរតែ​ធ្វើឡើង​ក្នុង​គោលបំណង​បង្ការ​ការប៉ុនប៉ង​បំផ្លាញ(vandalism)ដូច​ដែល​មាន​ចែង​ក្នុង[[{{MediaWiki:Policy-url}}|គោលការណ៍]]។\nសូមបំពេញមូលហេតុច្បាស់លាស់មួយខាងក្រោម (ឧទាហរណ៍៖ រាយឈ្មោះទំព័រនានាដែលត្រូវបានគេបំផ្លាញ)។",
-       "ipadressorusername": "អាសយដ្ឋានIP ឬអត្តនាម៖",
+       "ipaddressorusername": "អាសយដ្ឋានIP ឬអត្តនាម៖",
        "ipbexpiry": "រយៈពេលផុតកំណត់៖",
        "ipbreason": "មូលហេតុ៖",
        "ipbreason-dropdown": "*មូលហេតុហាមឃាត់ជាទូទៅ\n** ដាក់បញ្ចូលព័ត៌មានមិនពិត\n** ដកខ្លឹមទាំងស្រុងពីទំព័រនានា\n** ដាក់តំណភ្ជាប់ស្ប៉ាមតភ្ជាប់ទៅវិបសៃថ៍ខាងក្រៅ\n** បញ្ចូលខ្លឹមសារគ្មានន័យឬខ្លឹមសារមិនអាចយល់បានទៅក្នុងទំព័រនានា\n** អំពើគំរាមកំហែងឬរំលោភបំពានសិទ្ធិមនុស្ស\n** ប្រើប្រាស់គណនីច្រើនក្នុងគោលបំណងមិនល្អ\n** ប្រើប្រាស់ឈ្មោះដែលមិនអាចទទួលយកបាន",
        "newimages-summary": "ទំព័រពិសេសនេះបង្ហាញឯកសារដែលផ្ទុកឡើងចុងក្រោយគេ។",
        "newimages-legend": "តម្រងការពារ",
        "newimages-label": "ឈ្មោះរូបភាព៖",
-       "showhidebots": "($1រូបយន្ត)",
        "noimages": "គ្មានអ្វីសំរាប់មើលទេ។",
        "ilsubmit": "ស្វែងរក",
        "bydate": "តាមកាលបរិច្ឆេទ",
index 8f5ca8d..f11ab2d 100644 (file)
        "permissionserrors": "권한 오류",
        "permissionserrorstext": "해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:",
        "permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
-       "recreate-moveddeleted-warn": "'''경고: 삭제된 적이 있는 문서를 다시 만들고 있습니다.'''\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 이동 기록을 다음과 같이 제공합니다:",
+       "recreate-moveddeleted-warn": "<strong>경고: 삭제된 문서를 다시 만들고 있습니다.</strong>\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 옮기기 기록을 다음과 같이 제공합니다:",
        "moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
        "log-fulllog": "전체 기록 보기",
        "edit-hook-aborted": "훅에 의해 편집이 중단되었습니다.\n아무런 설명도 주어지지 않았습니다.",
        "username": "{{GENDER:$1|사용자 이름}}:",
        "uid": "{{GENDER:$1|사용자}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|소속}} {{PLURAL:$1|그룹}}:",
-       "prefs-registration": "ë\93±ë¡\9d ì\9d¼ì\8b\9c:",
+       "prefs-registration": "ë\93±ë¡\9d ì\8b\9cê°\84:",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "yourvariant": "언어 변종:",
        "right-move": "문서 옮기기",
        "right-move-subpages": "문서와 하위 문서 옮기기",
        "right-move-rootuserpages": "최상위 사용자 문서 옮기기",
+       "right-move-categorypages": "분류 문서 옮기기",
        "right-movefile": "파일 옮기기",
        "right-suppressredirect": "문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "action-move": "이 문서 옮기기",
        "action-move-subpages": "이 문서와 하위 문서를 함께 옮기기",
        "action-move-rootuserpages": "최상위 사용자 문서를 이동할",
+       "action-move-categorypages": "분류 문서 옮기기",
        "action-movefile": "이 파일을 옮기기",
        "action-upload": "이 파일을 올리기",
        "action-reupload": "이미 존재하는 파일 덮어쓰기",
        "upload_directory_missing": "파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.",
        "upload_directory_read_only": "파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.",
        "uploaderror": "올리기 오류",
-       "upload-recreate-warning": "'''경고: ì\9d´ í\8c\8cì\9d¼ë¡\9c ë\90\9c ì\9d´ë¦\84ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\98®ê²¨ì¡\8cì\8aµë\8b\88ë\8b¤.'''\n\nì\9d´ ë¬¸ì\84\9cì\9d\98 ìµ\9cê·¼ ì\82­ì \9c ê¸°ë¡\9dê³¼ ì\9d´ë\8f\99 ê¸°ë¡\9dì\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤:",
+       "upload-recreate-warning": "<strong>경고: í\95´ë\8b¹ ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c í\8c\8cì\9d¼ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\98®ê²¨ì¡\8cì\8aµë\8b\88ë\8b¤.</strong>\n\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\9d´ ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\82­ì \9cì\99\80 ì\98®ê¸°ê¸° ê¸°ë¡\9dì\9d\84 ë\8b¤ì\9d\8cê³¼ ê°\99ì\9d´ ì \9cê³µí\95©ë\8b\88ë\8b¤:",
        "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
        "upload-permitted": "허용하는 파일 확장자: $1",
        "upload-preferred": "권장하는 파일 확장자: $1",
        "empty-file": "올린 파일이 비어 있습니다.",
        "file-too-large": "올리려는 파일이 너무 큽니다.",
        "filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "filetype-banned": "이러한 종류의 파일은 금지되어 있습니다.",
+       "filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "verification-error": "이 파일은 파일 확인 절차를 통과하지 않았습니다.",
        "hookaborted": "수정하려고 한 것이 확장 기능 훅에 의해 중지되었습니다.",
        "illegal-filename": "이 파일 이름은 허용되지 않습니다.",
        "protectedpages-page": "문서",
        "protectedpages-expiry": "만료 기한",
        "protectedpages-performer": "사용자를 보호",
-       "protectedpages-params": "ë³´í\98¸ ë§¤ê°\9cë³\80ì\88\98",
+       "protectedpages-params": "보호 변수",
        "protectedpages-reason": "이유",
        "protectedpages-unknown-timestamp": "알 수 없음",
        "protectedpages-unknown-performer": "알 수 없는 사용자",
        "log-title-wildcard": "다음 글로 시작하는 제목 검색",
        "showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
        "allpages": "모든 문서 목록",
-       "alphaindexline": "$1부터 $2까지",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
        "allpagesfrom": "다음으로 시작하는 문서 보기:",
        "blockip": "사용자 차단",
        "blockip-legend": "사용자 차단",
        "blockiptext": "차단할 IP 주소나 사용자 이름을 아래에 적어 주세요.\n차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.\n차단 이유를 같이 적어주세요(예: 특정 문서 훼손).",
-       "ipadressorusername": "IP 주소 또는 사용자 이름:",
+       "ipaddressorusername": "IP 주소 또는 사용자 이름:",
        "ipbexpiry": "기한:",
        "ipbreason": "이유:",
        "ipbreason-dropdown": "*일반적인 차단 이유\n** 거짓 정보를 넣음\n** 문서 내용을 지움\n** 바깥 사이트의 광고성 링크를 넣음\n** 문서에 장난성 내용을 넣음\n** 협박성 행동\n** 다중 계정 악용\n** 부적절한 사용자 이름",
        "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
        "movearticle": "문서 옮기기:",
        "moveuserpage-warning": "'''경고:''' 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 참고하세요.",
+       "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "movenotallowed": "문서를 옮길 권한이 없습니다.",
        "movenotallowedfile": "파일을 옮길 권한이 없습니다.",
-       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다(하위 문서는 예외).",
-       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다(하위 문서는 예외).",
+       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-category-page": "분류 문서를 옮길 권한이 없습니다.",
+       "cant-move-to-category-page": "문서를 분류 문서로 옮길 권한이 없습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 옮기기",
        "newimages-summary": "이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.",
        "newimages-legend": "필터",
        "newimages-label": "파일 이름 (또는 그 일부분):",
-       "showhidebots": "(봇을 $1)",
+       "newimages-showbots": "봇이 올린 것 보기",
        "noimages": "그림이 없습니다.",
        "ilsubmit": "검색",
        "bydate": "날짜",
        "api-error-fileexists-shared-forbidden": "\"$1\" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.",
        "api-error-file-too-large": "올리려는 파일이 너무 큽니다.",
        "api-error-filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "api-error-filetype-banned": "이런 파일 형식은 올릴 수 없습니다.",
+       "api-error-filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "api-error-filetype-banned-type": "$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.",
        "api-error-filetype-missing": "파일 이름에 확장자가 없습니다.",
        "api-error-hookaborted": "수정하려고 한 것이 확장 기능에 의해 중지되었습니다.",
index 7286e94..69d9f9c 100644 (file)
        "view": "Къарау",
        "view-foreign": "$1 сайтда къара",
        "edit": "Тюрлендир",
+       "edit-local": "Локал айгъакълауну тюрлендириу",
        "create": "Къура",
        "editthispage": "Бу бетни тюрлендир",
        "create-this-page": "Бу бетни къура",
        "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
        "changeemail-submit": "Адресни тюрлендир",
        "changeemail-cancel": "Ызына алыу",
+       "resettokens": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "bold_sample": "Къалын джазыу",
        "bold_tip": "Къалын джазыу",
-       "italic_sample": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
-       "italic_tip": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
+       "italic_sample": "СÑ\91дегей джазыу",
+       "italic_tip": "СÑ\91дегей джазыу",
        "link_sample": "Джибериуню башлыгъы",
        "link_tip": "Ич джибериу",
        "extlink_sample": "http://www.example.com линкни ачыкълауу",
        "fewestrevisions": "Эм аз версиясы болгъан бетле",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|категория}}",
+       "ninterwikis": "$1 {{PLURAL:$1|интервики}}",
        "nlinks": "$1 {{PLURAL:$1|джибериу}}",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|объект}}",
        "nrevisions": "$1 {{PLURAL:$1|версия}}",
        "nviews": "$1 {{PLURAL:$1|къарау}}",
        "nimagelinks": "$1 {{PLURAL:$1|бетде}} хайырланады",
        "logempty": "Журналлагъа келишген билги джокъду.",
        "log-title-wildcard": "Бу символладан башланнган башлыкъланы изле",
        "allpages": "Бютеу бетле",
-       "alphaindexline": "$1 бетден $2 бетге дери",
        "nextpage": "Эндиги бет ($1)",
        "prevpage": "Алдагъы бет ($1)",
        "allpagesfrom": "Мунга башланнган бетлени чыгъар:",
        "blockip": "Бу къошулуучуну блок эт",
        "blockip-legend": "Къошулуучуну блокга салыу",
        "blockiptext": "Тюбюндеги форманы хайырланыб белгили бир IP-ден неда регистрация этилген къошулуучуну тюрлениу этиуюню тыяллыкъсыз. Бу, джангыз вандализмни тыяр ючюн эм [[{{MediaWiki:Policy-url}}|джорукълагъа]] келишиулю этилирге керекди. Тюбюрек тыйыу бла байламлы ангылатыу джазыгъыз. (юлгю: -Бу- бетледе вандализм этилгенди).",
-       "ipadressorusername": "IP-адрес неда къошулуучу ат:",
+       "ipaddressorusername": "IP-адрес неда къошулуучу ат:",
        "ipbexpiry": "Бошаллыкъды (ётсе):",
        "ipbreason": "Чурум:",
        "ipbreason-dropdown": "* Тыйылыуну асламысында тюбеген чурумлары\n** Джалгъан билги къошуу\n** Бетлени ичиндегин кетериу\n** Тыш спам-сайтлагъа джибериу бериу\n** Бетлеге магъанасыз/ангыламсыз джазмала къошуу\n** Къошулуучуланы къоркъутургъа излеу\n** Талай тергеу джазыу къураб аманлыкъгъа хайырланыу\n** Джарамагъан къошулуучу ат",
        "othercontribs": "$1 джанындан этилген ишге тамалланады.",
        "others": "башхала",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
-       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
+       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
        "creditspage": "Бетни кредитлери",
        "nocredits": "Бу къошулуучу ючюн кредит билги джокъду.",
        "spamprotectiontitle": "Спамгъа къаршчы фильтр",
        "pageinfo-article-id": "Бетни идентификатору",
        "pageinfo-language": "Бетни ичиндегисини тили",
        "pageinfo-content-model": "Батни ичиндегисини модели",
-       "pageinfo-robot-policy": "Излеу къуллукъла бла индексация",
+       "pageinfo-robot-policy": "Излеу роботла бла индексация",
        "pageinfo-robot-index": "Эркинлик берилгенди",
        "pageinfo-robot-noindex": "Эркинлик берилмегенди",
        "pageinfo-views": "Къарауланы саны",
        "newimages-summary": "Бу къуллукъ бет, кёб болмай джюкленнген файлланы кёргюзеди.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Файлны аты (неда кесеги):",
-       "showhidebots": "($1 бот)",
        "noimages": "Кёрюр зат джокъду",
        "ilsubmit": "Таб",
        "bydate": "Хронологиягъа кёре",
        "htmlform-no": "Огъай",
        "htmlform-yes": "Хоу",
        "htmlform-chosen-placeholder": "Вариантны сайлагъыз",
+       "htmlform-cloner-create": "Энтда къош",
+       "htmlform-cloner-delete": "Кетер",
        "sqlite-has-fts": "$1 толу текст излеуню хайырландыргъан",
        "sqlite-no-fts": "$1 толу текст излеуню хайырландыра билмеген",
        "logentry-delete-delete": "$3 бетни $1 {{GENDER:$2|кетерди}}",
        "limitreport-title": "Анализаторну билгилери:",
        "limitreport-cputime": "Процессорну заманын хайырлан",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-walltime": "Керти заман режимде хайырланыу",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-ppvisitednodes": "Препроцессор кирген тюйюмчеклени саны",
+       "limitreport-ppgeneratednodes": "Препроцессор чыгъаргъан тюйюмчеклени саны",
+       "limitreport-postexpandincludesize": "Кенгерилген джандырыуланы ёлчеми",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт}}",
        "limitreport-templateargumentsize": "Шаблонну арагументини ёлчеми",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт}}",
+       "limitreport-expansiondepth": "Кенгериуню эм уллу теренлиги",
+       "limitreport-expensivefunctioncount": "Анализаторну «багъа» функцияларыны саны",
        "expandtemplates": "Шаблонланы ачыу",
        "expand_templates_title": "{{FULLPAGENAME}} ючюн контекст башлыкъ эм д. а. к.:",
        "expand_templates_input": "Кириу текст:",
index 180bf1d..7a74c8e 100644 (file)
        "gotaccountlink": "Enlogge",
        "userlogin-resetlink": "Häß De Ding Daate för et Enlogge verjäße?",
        "userlogin-resetpassword-link": "Paßwoot verjäße?",
-       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
+       "userlogin-helplink2": "Hölp mem Enlogge",
+       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
        "userlogin-createanother": "Donn ene zohsäzlejje Zohjang aanlääje",
        "createacct-emailrequired": "Ding Addräß för de <i lang=\"en\">e-mail</i>",
        "createacct-emailoptional": "Ding Addräß för de <i lang=\"en\">e-mail</i>, kann fott bliive",
        "resetpass-abort-generic": "E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.",
        "resetpass-expired": "Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.",
        "resetpass-expired-soft": "Ding Paßwood es afjeloufe un moß neu jesaz wääde. Bes esu jood_un donn e neu Paßwoot ußsöhke, udder jangk op {{int:resetpass-submit-cancel}}, öm et schpääder ze säze.",
+       "resetpass-validity-soft": "Ding Kännwood es nit johd: $1\n\nSöhk Der e neu Kännwood us, udder jangg_op <em>{{int:resetpass-submit-cancel}}</em>, öm dat schpääder ze donn.",
        "passwordreset": "Et Paßwoot zeröck säze",
        "passwordreset-text-one": "Föll dat Fommolaa uß, öm Ding Paßwoot ze ändere.",
        "passwordreset-text-many": "{{PLURAL:$1|Föll ei vun dä Fälder en heh däm Fommolaa uß, öm e Zwesche_Paßwoot ze krijje.}}",
        "edit-gone-missing": "Kunnt di Sigg nit änndere. Se schingk verschwunde un weed fottjeschemeße woode sin.",
        "edit-conflict": "Dubbelt beärbeit.",
        "edit-no-change": "Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.",
+       "postedit-confirmation-created": "Di Sigg es aanjelaat.",
+       "postedit-confirmation-restored": "Der ahle Zohschtand es widder zeröck jehollt.",
        "postedit-confirmation-saved": "Ding Änderunge sin nit faßjehallde.",
        "edit-already-exists": "Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.",
        "defaultmessagetext": "Dä standaadmäßije Tex",
        "revdelete-no-file": "De aanjejovve Dattei jidd_et nit.",
        "revdelete-show-file-confirm": "Beß De sescher, dat De de fottjeschmeße Version vun dä Dattei „<nowiki>$1</nowiki>“ vum $2 oö $3 Uhr aanloore wells?",
        "revdelete-show-file-submit": "Lohß Jonn!",
+       "revdelete-selected-text": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun [[:$2]]:",
+       "revdelete-selected-file": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun dä Dattei [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Dä ußjewählte Logboch-Endrach|De Ußjewählte Logboch-Endrähsch}}:",
+       "revdelete-text-text": "Fottjeschmeße Väsjohne blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-file": "Fottjeschmeße Väsjohne vun Datteije blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "logdelete-text": "Fottjeschmeße Endrääsch en de Logbööscher blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-others": "De Wiki_Kööbeße künne emmer noch drop zohjriefe un künne och wider för alle seeschbaa maache, wat jäz verschtoche es, esu lang kein äxtra Beschränkonge jemaat woodte.",
        "revdelete-confirm": "Bes esu joot un doon dat beschtääteje, un donn domet ongerschriive, dat De dat donn wells, dat De weiß, wat dobei eruß kütt, un dat De dat och noh de [[{{MediaWiki:Policy-url}}|Rääjelle]] deihß.",
        "revdelete-suppress-text": "Dat sullt '''blooß''' jedonn wäde för:\n* onjesäzlesche Aanjaabe\n* unjenehmesch persöhnlesch Daate\n*: ''Aanschreffte, Tellefoon- un ander Nummere, <span lang=\"en\" xml:lang=\"en\">e-mail</span> Adräß, uew.''",
        "revdelete-legend": "Dä öffentlije Zojang enschränke",
        "search-file-match": "(en dä Dattei dren)",
        "search-suggest": "Häß De „$1“ jemeint?",
        "search-interwiki-caption": "Schwesterprojekte",
-       "search-interwiki-default": "$1 hät heh di Träffer jefonge:",
+       "search-interwiki-default": "Op $1 woodte heh di Träffer jefonge:",
        "search-interwiki-more": "(mieh)",
        "search-relatedarticle": "Ähnlesch",
        "searcheverything-enable": "En alle Appachtemangs söhke",
        "right-move": "Sigge ömnenne",
        "right-move-subpages": "Sigge, un ier Ungersigge, zosamme ömnenne",
        "right-move-rootuserpages": "(Houp)-Metmaacher-Sigg Ömnänne",
+       "right-move-categorypages": "Sigge vun Saachjroppe ömbenänne",
        "right-movefile": "Dateie ömnenne",
        "right-suppressredirect": "Kein automatesche Ömleidong aanlääje beim Ömnenne",
        "right-upload": "Dateie huhlade",
        "action-createpage": "di Sigg aanzeläje",
        "action-createtalk": "Klaafsigge aanzeläje",
        "action-createaccount": "hee dä neue Metmaacher aanzemelde",
+       "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "action-minoredit": "hee di Änderung als klein „mini“ ze makkeere",
        "action-move": "di Sigg ömzebenänne",
        "action-move-subpages": "hee di Sigg un ier Ongersigge ömzebenänne",
        "action-move-rootuserpages": "enem Metmaacher sing (Houp)-Metmaacher-Sigg ömzenänne",
+       "action-move-categorypages": "Sigge vun Saachjroppe ömzebenänne",
        "action-movefile": "Die Datei ömnenne",
        "action-upload": "hee di Datei huhzelade",
        "action-reupload": "hee di Datei, di et ald jitt, ußzetuusche",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "listredirects": "Ömleitunge",
        "listduplicatedfiles": "Leß met dubbelte Datteije",
+       "listduplicatedfiles-entry": "Zoh dä Dattei [[:File:$1|$1]] ham_mer [[$3|{{PLURAL:$2|a Dubbel|$2 Dubbelte|kein Dubbelte}}]] jefonge.",
        "unusedtemplates": "Schablone oder Baustein, die nit jebruch wääde",
        "unusedtemplatestext": "Hee sin all de Schablone opjeliss, die em Appachtemeng „{{ns:template}}“ sin, die nit en\nander Sigge enjefüg wääde. Ih De jet dovun fottschmieß, denk dran, se künnte och op en ander Aat jebruch\nwääde, un luur Der der iehr ander Links aan!",
        "unusedtemplateswlh": "ander Links",
        "pageswithprop-submit": "Lohß Jonn!",
        "doubleredirects": "Ömleitunge op Ömleitunge",
        "doubleredirectstext": "Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de\nzweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.\n<del>Ußjeshtreshe</del> Reije sin ald äleedesh.\nMet däm „(Ändere)“-Link kanns De de eetste Sigg tirek aanpacke.\nTipp: Merk Der dä Tittel vun dä Sigg dovör.",
-       "double-redirect-fixed-move": "dubbel Ömleidong nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]",
+       "double-redirect-fixed-move": "Di Sigg [[$1]] es ömjenannt un längk jäz autmattesch öm op di Sigg [[$2]].",
        "double-redirect-fixed-maintenance": "De dubbelte Ömleidong vun [[$1]] noh [[$2]] wood opjelühß.",
        "double-redirect-fixer": "(Opjaveleß)",
        "brokenredirects": "Ömleitunge, die en et Leere jonn",
        "deadendpagestext": "De Atikele hee han kein Links op ander Atikele em Wiki.",
        "protectedpages": "Jeschötzte Sigge",
        "protectedpages-indef": "Nor de Sigge zeije, woh alleins de Wiki-Köbesse draan dörrve",
-       "protectedpages-summary": "He sin Sigge opjeliss, wo jäje Veränderunge un/odde jäje et Ömnenne jeschötz sin, su dat nit einfach Jede jet draan don kann.",
+       "protectedpages-summary": "He sin Sigge opjeließ, wo jäje et Verändere udder jäje et Ömnänne jeschötz sin.\nEn Leß met dä Sigge, di mer nit aanlääje darref, es op dä Sigg [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] ze fenge.",
        "protectedpages-cascade": "Nur Sigge en ener Schotz-Kaskad",
        "protectedpages-noredirect": "Ömleidonge verschteische",
        "protectedpagesempty": "Op di Aat sin jrad kein Sigge jeschötz.",
        "protectedpages-unknown-timestamp": "Onbikannt",
        "protectedpages-unknown-performer": "Onbikannte Metmaacher",
        "protectedtitles": "Verbodde Titele för Sigge",
-       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjelis, unger dä Name ka'mer kein neu Sigge aanläje.",
+       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjeleß. Onger dä Name ka_mer kein neu Sigge aanläje.\nEn Leß met dä Sigge, di jäje et Verändere udder jäje et Ömnenne jeschötz sin, fengk mer op dä Sigg [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.",
        "listusers": "De Metmaacherleß",
        "listusers-editsonly": "Donn nor Metmaacher zeije, di och ens jät jeschrevve han.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "allpages": "All Sigge",
-       "alphaindexline": "$1 … $2",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Name:",
        "listgrouprights-removegroup-self": "Kann sesch sällver {{PLURAL:$2|eruß nämme uß dä Metmaacherjropp:|uß $2 Metmaacherjroppe eruß nämme:|uß kei Metmaacherjropp eruß nämme.}} $1",
        "listgrouprights-addgroup-self-all": "Kann sesch sällver en alle Metmaacherjroppe erenn donn",
        "listgrouprights-removegroup-self-all": "Kann sesch sällver uß alle Metmaacherjroppe eruß nämme",
+       "trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
        "mailnologin": "Keij E-Mail Adress",
        "mailnologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail\nAdress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze\nschecke.",
        "emailuser": "E-mail aan dä Metmaacher",
        "blockip": "Metmaacher sperre",
        "blockip-legend": "Metmaacher ov IP-Adresse Sperre",
        "blockiptext": "Hee kanns De bestemmte Metmaacher oder IP-Adresse sperre, su dat se hee em Wiki nit mieh schrieve und Sigge ändere künne.\nDat sollt nor jedon wääde om sujenannte Vandaale ze bremse. Un mer müsse uns dobei natörlich aan uns [[{{MediaWiki:Policy-url}}|Rejelle]] för esu en Fäll halde.\nDrag bei „Aanlass“ ene möchlichs jenaue Jrund en, wöröm dat Sperre passeet. Nenn un Link op de Sigge wo Einer kapott jemaat hät, zem Beispill.",
-       "ipadressorusername": "<i lang=\"en\">IP</i>-Adress oder Metmaacher Name:",
+       "ipaddressorusername": "<i lang=\"en\">IP</i>-Adress oder Metmaacher Name:",
        "ipbexpiry": "Duur, för wie lang",
        "ipbreason": "Aanlass:",
        "ipbreason-dropdown": "* Alljemein Jrönd för et Sperre\n** hät fekeehte Behouptunge udder Leeje en Atikele jeschrevve\n** hät Sigge fottjeschmesse udder leddig jemaat\n** hält sesch iewesch nit aan de Rejelle övver de Links op anger Websigge un jäje der Link-SPAM\n** hät Sigge met Shtuß udder Kauderwelsch drop aajelaat udder Keu en Sigge jedonn\n** deit Medmaacher bedrohe, beleijije, udder schlääsch maache\n** hät mieh wie eine Metmaachername un deit domet Schmuu maache\n* Op der Name betrocke Jrönd\n** esu ene Metmaacher-Name wolle mer nit\n* Op en IP-Adräß betrocke Jrönd\n** dat es en Proxy-ẞööver övver dänn de Lück zo vill Driß aanjestellt han",
        "newimages-summary": "Heh die Sigg zeig die zoletz huhjeladene Belder un Dateie aan.",
        "newimages-legend": "Ußwähle",
        "newimages-label": "Dä Dattei ier Name udder e Stöck dofun:",
-       "showhidebots": "(Bots $1)",
        "noimages": "Kein Dateie jefunge.",
        "ilsubmit": "Söhk",
        "bydate": "nohm Datum",
index bcfc299..b9b62ad 100644 (file)
        "blockip": "Bikarhêner asteng bike",
        "blockip-legend": "Bikarhêner asteng bike",
        "blockiptext": "Ji bo astengkirina nivîsandinê ya ji navnîşaneke IP'yê an jî ji bikarhênerekî/ê, vê formê bikarbîne.\nDivê ev tenê ji bo sekinandina vandalîzmê were bikaranîn, ku divê li gorî [[{{MediaWiki:Policy-url}}|rêgezê]] be.\n\nSedemekê binivîse!",
-       "ipadressorusername": "adresê IP'yekê ya navekî bikarhênerekî",
+       "ipaddressorusername": "adresê IP'yekê ya navekî bikarhênerekî",
        "ipbexpiry": "Dem:",
        "ipbreason": "Sedem",
        "ipbreason-dropdown": "*Sedemên astengkirinê\n** Vandalîzm\n** Agahiya şaş dikire gotarekê\n** Naveroka rûpelekê vala kir\n** Girêdanên xerab tevlî rûpelan dikir\n** Tiştên tewş tevlî gotaran dikir\n** Heqaretkirin\n** Pir hesab bikaranîn\n** Navekî ku nayê pejirandin",
        "imagelisttext": "Jêr lîsteyek ji $1 file'an heye, duxrekirin $2.",
        "newimages-summary": "Ev rûpela taybet dosyeyên ku herî dawî hatine barkirin, nîşan dide.",
        "newimages-legend": "Parzûn",
-       "showhidebots": "(Bot'an $1)",
        "noimages": "Ne tiştek tê dîtin.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
index 03a80c3..c48b946 100644 (file)
        "blockip": "Usorem obstruere",
        "blockip-legend": "Usorem vel locum IP obstruere",
        "blockiptext": "Forma infera utere ut quendam usorem vel locum IP obstruas ne plus scribere potest.\nHoc non nisi secundum [[{{MediaWiki:Policy-url}}|consilium]] fieri potest.\nRationem certam subscribe (exempli gratia titulos paginarum quas iste usor modo vandalorum recensuit).",
-       "ipadressorusername": "Locus IP aut nomen usoris:",
+       "ipaddressorusername": "Locus IP aut nomen usoris:",
        "ipbexpiry": "Exitus:",
        "ipbreason": "Causa:",
        "ipbreason-dropdown": "*Rationes crebriter adductae\n** Ob scripta falsa\n** Ob textum remotum\n** Ob nexus externos multiplicatos\n** Ob scripta sensu sive et Latinitate carentia\n** Ob scripta inurbana\n** Ob rationes perniciose multiplicatas\n** Ob nomen inurbanum sive inconveniens",
        "newimages-summary": "Haec pagina specialis monstrat fasciculos impositos ultimos.",
        "newimages-legend": "Filtrum",
        "newimages-label": "Nomen fasciculi (vel pars eius):",
-       "showhidebots": "($1 automata)",
        "noimages": "Nullum videndum.",
        "ilsubmit": "Quaerere",
        "bydate": "ex die",
index 02d1033..92fb614 100644 (file)
        "recentchanges-summary": "Op dëser Säit kënnt Dir déi rezent Ännerungen op dëser Wiki gesinn.",
        "recentchanges-noresult": "Keng Ännerunge während der Period déi ugi gouf passen op de Critère.",
        "recentchanges-feed-description": "Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.",
-       "recentchanges-label-newpage": "Dës Ännerung huet eng nei Säit ugeluecht",
+       "recentchanges-label-newpage": "Mat dëser Ännerung gouf eng nei Säit ugeluecht",
        "recentchanges-label-minor": "Dëst ass eng kleng Ännerung",
        "recentchanges-label-bot": "Dës Ännerung gouf vun engem Bot gemaacht",
        "recentchanges-label-unpatrolled": "Dës Ännerung gouf nach net nogekuckt",
        "log-title-wildcard": "Titel fänkt mat dësem Text un",
        "showhideselectedlogentries": "Déi erausgesichte Entréeën am Logbuch weisen/verstoppen",
        "allpages": "All Säiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächst Säit ($1)",
        "prevpage": "Säit viru(n) ($1)",
        "allpagesfrom": "Säite weisen, ugefaange mat:",
        "blockip": "Benotzer spären",
        "blockip-legend": "Benotzer spären",
        "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären. Dëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richlinen]]. Gitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).",
-       "ipadressorusername": "IP-Adress oder Benotzernumm:",
+       "ipaddressorusername": "IP-Adress oder Benotzernumm:",
        "ipbexpiry": "Gültegkeet:",
        "ipbreason": "Grond:",
        "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedréit aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
-       "showhidebots": "($1 Botten)",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "watchlistedit-raw-done": "Är Iwwerwaachungslëscht gouf aktualiséiert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} derbäigesat:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-clear-legend": "Iwwerwaachungslëscht eidelmaachen",
+       "watchlistedit-clear-explain": "All D'Säite gi vun Ärer Iwwerwaachungslëscht erofgeholl",
+       "watchlistedit-clear-titles": "Säiten:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-too-many": "Et sinn ze vill Säite fir se hei ze weisen.",
        "watchlisttools-view": "Iwwerwaachungslëscht: Ännerungen",
        "watchlisttools-edit": "Iwwerwaachungslëscht weisen an änneren",
        "watchlisttools-raw": "Net-formatéiert Iwwerwaachungslëscht änneren",
index d88dd13..4e72533 100644 (file)
        "watchthis": "И ччин гуьзетун",
        "savearticle": "Ччин хуьн",
        "preview": "Сифтедин килигун",
-       "showpreview": "СиÑ\84Ñ\82един ÐºÐ¸Ð»Ð¸Ð³Ñ\83н ÐºÑ\8aалÑ\83Ñ\80ун",
+       "showpreview": "Ð\92иликамаз ÐºÐ¸Ð»Ð¸Ð³ун",
        "showdiff": "МасакIавилер къалурун",
        "anoneditwarning": "'''Дикъет:''' Куьне системадиз жув вуж ятIа лагьанвач. Куь IP-адрес и ччинин масакIавилерин тарихдиз  кхьида.",
        "summary-preview": "Сифте килигун паталди:",
        "booksources-go": "Фин",
        "log": "Журналар",
        "allpages": "Вири ччинар",
-       "alphaindexline": "$1-кай $2 -ди",
        "prevpage": "Алатай чар ($1)",
        "allpagesfrom": "Къалур хъувун,идалай гатIунай:",
        "allpagesto": "Акъудан чарар, куьтягь жезвай:",
index c154aa6..743e9cf 100644 (file)
        "blockip": "Blokkeer dit IP-adres",
        "blockip-legend": "'ne Gebroeker of IP-adres blokkere",
        "blockiptext": "Gebroek 't óngerstjaondj formeleer óm sjrieftoegank van e zeker IP-adres te verbeje. Dit maag allein gedaon weure om vandalisme te veurkómme en in euvereinkóms mitte [[{{MediaWiki:Policy-url}}|beleid]]. Gaef hiejónger de raeje óp (bv. inkel vandaliseerdje paazjes).",
-       "ipadressorusername": "IP-adres of gebroekersnaam",
+       "ipaddressorusername": "IP-adres of gebroekersnaam",
        "ipbexpiry": "Verlöp (maak 'n keuze)",
        "ipbreason": "Reeje:",
        "ipbreason-dropdown": "*Väöl veurkommende rejer veur blokkaazjes\n** Foutieve informatie inveure\n** Verwiedere van informatie oet artikele\n** Spamlinks nao externe websites\n** Inveuge van nonsens in artikele\n** Intimiderend gedraag\n** Misbroek van meerdere gebroekers\n** Onacceptabele gebroekersnaam",
        "newimages-summary": "Op dees speciaal pazjena waere de meis recènt toegevoogde bestenj weergegaeve.",
        "newimages-legend": "Bestandjsnaam",
        "newimages-label": "Bestandjsnaam (of deel daarvan):",
-       "showhidebots": "($1 Bots)",
        "noimages": "Niks te zeen.",
        "ilsubmit": "Zeuk",
        "bydate": "op datum",
index 75a2f1f..a5dd37a 100644 (file)
        "blockip": "Bloca el dovrat",
        "blockip-legend": "Bloca 'l druvadur",
        "blockiptext": "Druvee 'l mòdul chì de suta per blucà l'acess cun dirit de scritüra a un indirizz IP specifegh o a un druvadur registraa.\nEl bloch gh'è de druvàl dumà per evità el vandalism e in acord cun i [[{{MediaWiki:Policy-url}}|regulament de {{SITENAME}}]].\nScrivee chì de suta 'l mutiv specifegh per el bloch (presempi, a pudii scriv i titul di paginn che i henn stat suget a vandalism).",
-       "ipadressorusername": "Indirizz IP o nom del druvdur:",
+       "ipaddressorusername": "Indirizz IP o nom del druvdur:",
        "ipbexpiry": "Fina al:",
        "ipbreason": "Reson:",
        "ipbreason-dropdown": "*Mutiv püssee cumün per i blòch\n** Avè caregaa di infurmazión fals\n** Avè töt via del cuntegnüü dai paginn\n** Avè giuntaa di ereclam a di sit da föra\n** Avè giuntaa de la ratatuja int i paginn\n** Cumpurtament intimidatori\n** Avè druvaa püssee dun cünt in manera abüsiva\n** El nom del druvàt l'è inacetabil",
index 7de45b4..8d9bae3 100644 (file)
        "blockip": "Blokuoti naudotoją",
        "blockip-legend": "Blokuoti naudotoją",
        "blockiptext": "Naudokite šią formą, kad uždraustumėte redagavimo prieigą pasirinktam IP adresui ar naudotojui. Tai turėtų būti atliekama tik tam, kad sustabdytumėte vandalizmą, ir neprieštarauti [[{{MediaWiki:Policy-url}}|projekte galiojančioms taisyklėms]].\nŽemiau pateikite tikslią priežastį (pavyzdžiui, nurodydami sugadintus puslapius).",
-       "ipadressorusername": "IP adresas arba naudotojo vardas",
+       "ipaddressorusername": "IP adresas arba naudotojo vardas",
        "ipbexpiry": "Galiojimo laikas",
        "ipbreason": "Priežastis:",
        "ipbreason-dropdown": "*Bendrosios blokavimo priežastys\n** Klaidingos informacijos įterpimas\n** Turinio šalinimas iš puslapių\n** Kitų svetainių reklamavimas\n** Nesusijusio arba beprasmio teksto įterpimas į puslapius\n** Gąsdinimai/įžeidinėjimai\n** Piktnaudžiavimas keliomis paskyromis\n** Nepriimtinas naudotojo vardas",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
-       "showhidebots": "($1 robotus)",
        "noimages": "Nėra ką parodyti.",
        "ilsubmit": "Ieškoti",
        "bydate": "pagal datą",
index 1bbebf7..781b149 100644 (file)
        "blockip": "Bloķēt lietotāju",
        "blockip-legend": "Bloķēt lietotāju",
        "blockiptext": "Šo veidni izmanto, lai bloķētu kādas IP adreses vai lietotājvārda piekļuvi wiki lapu saglabāšanai. Dari to tikai, lai novērstu vandālismu atbilstoši [[{{MediaWiki:Policy-url}}|noteikumiem]].\nNorādi konkrētu iemeslu (piemēram, linkus uz vandalizētajām lapām).",
-       "ipadressorusername": "IP adrese vai lietotājvārds",
+       "ipaddressorusername": "IP adrese vai lietotājvārds",
        "ipbexpiry": "Termiņš",
        "ipbreason": "Iemesls:",
        "ipbreason-dropdown": "*Biežākie bloķēšanas iemesli\n** Ievieto nepatiesu informāciju\n** Dzēš lapu saturu\n** Spamo ārējās saitēs\n** Ievieto nesakarīgus simbolus sakopojumus\n** Nepieņemama uzvedība un apvainojumi\n** Vairāku kontu ļaunprātīga izmantošana\n** Nepieņemams lietotājvārds",
        "newimages-summary": "Šeit var apskatīties pēdējos šeit augšuplādētos failus.",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
-       "showhidebots": "($1 botus)",
        "noimages": "Nav nekā ko redzēt.",
        "ilsubmit": "Meklēt",
        "bydate": "<b>pēc datuma</b>",
index 19eefa8..cab767d 100644 (file)
        "blockip": "禁簿",
        "blockip-legend": "禁簿",
        "blockiptext": "函下禁纂,簿、址明判;[[{{MediaWiki:Policy-url}}|秉據]]如斯,立法克亂。指罪證行,了冤無憾。",
-       "ipadressorusername": "IP或簿名",
+       "ipaddressorusername": "IP或簿名",
        "ipbexpiry": "限期",
        "ipbreason": "指證",
        "ipbreason-dropdown": "*如下道:\n** 造假報\n** 毀文貌\n** 廣賈告\n** 話胡鬧\n** 恐嚇擾\n** 污名號\n** 名瀆道",
        "newimages-summary": "此奇頁示最後呈上之檔也。",
        "newimages-legend": "濾",
        "newimages-label": "名(或其部):",
-       "showhidebots": "($1僕)",
        "noimages": "無可見。",
        "ilsubmit": "尋檔",
        "bydate": "時序",
index ccb4dbd..2baf3b1 100644 (file)
        "blockip": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "blockip-legend": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "blockiptext": "नीचाँक आवेदनक प्रयोग कोनो खास अनिकेत वा प्रयोक्तानामक लिखैक प्रवेशकेँ प्रतिबन्धित करबा लेल करू।\nई अतत्तः करैबलाक विरुद्ध प्रयुक्त हुअए, आ एकर अनुसार [[{{MediaWiki:Policy-url}}|policy]]।\nनीचाँ स्पष्ट कारण लिखू (जेना, खास पन्नाकेँ देखबैत जतए अतत्तः कएल गेल अछि)।",
-       "ipadressorusername": "अनिकेत संकेत वा प्रयोक्तानाम:",
+       "ipaddressorusername": "अनिकेत संकेत वा प्रयोक्तानाम:",
        "ipbexpiry": "खतम हएत:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*सामान्य प्रतिबन्ध कारण\n** गलत सूचना घुसेनाइ\n** पन्ना सभसँ पाठ हटेनाइ\n** बाहरी जालस्थलक अवांछित लागि\n** फालतू/ अवांछित सामिग्रिक पान्नामे घुसाएब\n** धमकीबला व्यवहार/ तंग करब\n** कएक खाताकेँ गरिआएब\n** अवांछित प्रयोक्तानाम",
        "newimages-summary": "ऐ विशेष पन्नामे उपारोपित संचिका सभ देखाएल गेल अछि।",
        "newimages-legend": "चलनी",
        "newimages-label": "संचिका नाम (वा ओकर अंश):",
-       "showhidebots": "($1 स्वचालक सभ)",
        "noimages": "किछु देखबा योग्य नै |",
        "ilsubmit": "ताकू",
        "bydate": "तारीख सं",
index 91cb2c5..5bc4044 100644 (file)
        "blockip": "Пякстамс тиить",
        "blockip-legend": "Кардамс тиить",
        "blockiptext": "Эряви нолдамс тевс форм ала башка IP адресста эли тиить лем вельде  сёрмадомань сувамать сёлгоманкса.\nТя эряви тиемс аньцек колендемада аралама туфталонкса ди [[{{MediaWiki:Policy-url}}|политик]]-ть коряс.\nПутт туфталть алу (кепотьксонди, лятфнек лопатне конатнень эса колендесть).",
-       "ipadressorusername": "IP адрес эли тиить лемоц:",
+       "ipaddressorusername": "IP адрес эли тиить лемоц:",
        "ipbexpiry": "Сирелгоды:",
        "ipbreason": "Туфтал:",
        "ipbreason-dropdown": "* Кърдань сёлгома туфталхт\n** Аф виде информациень путнема\n** Лопаста сёрматфть нардама\n** Аф виде ушеширень интернет сюлмафкснень макссема\n** Ёньфтома/смузьфтома информациень лопас путнема\n** Кальдяв прянь вятема/сялгодома\n** Лама сёрматфтоматнень покордама\n** Аф пара тиить лемоц",
        "newimages-summary": "Тя башка тевонь лопась няфнесыне мекольце тонкф файлхт.",
        "newimages-legend": "Педяма",
        "newimages-label": "Файллем (эли сонь пакшец):",
-       "showhidebots": "($1 робот програпт)",
        "noimages": "Мезеге аш.",
        "ilsubmit": "Вешендемс",
        "bydate": "ши коряс",
index 0b615fa..bc2ad0f 100644 (file)
        "blockip": "Sakano ny mpikambana",
        "blockip-legend": "Sakano ny mpikambana",
        "blockiptext": "Ampiasao ity formulaire ity hisakanana ny fahazoan-dàlana hanoratra\nananan'ny adiresy IP iray na solonanarana iray.\nTokony ho antony fisorohana ny fisomparana ihany, ary mifanaraka amin'ny [[{{MediaWiki:Policy-url}}|fepetra]]\nihany no hanaovana ny fisakanana.\nFenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).",
-       "ipadressorusername": "Adiresy IP na solonanarana",
+       "ipaddressorusername": "Adiresy IP na solonanarana",
        "ipbexpiry": "Fahataperana",
        "ipbreason": "Antony :",
        "ipb-hardblock": "Hanakana ny mpikambana nisoratra anarana mampiasa ity adiresy IP ity",
        "imagelisttext": "{{PLURAL:}}Eto ambany ny lisitran'ny rakitra $1 milahatra araka ny $2.",
        "newimages-legend": "Anaran-drakitra",
        "newimages-label": "Anaran-drakitra (na singan'izy io) :",
-       "showhidebots": "(rôbô $1)",
        "noimages": "Tsy misy sary ato.",
        "ilsubmit": "Karohy",
        "bydate": "araka ny daty",
index 6d1f3f9..eab1836 100644 (file)
        "previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
        "continue-editing": "Оди на полето за уредување",
        "previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.",
-       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
-       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð³Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
+       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на податоци од седницата.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
+       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ва Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
        "token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''",
        "edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''",
        "editing": "Уредување на $1",
        "right-move": "Преместување страници",
        "right-move-subpages": "Преместување на страници со нивните потстраници",
        "right-move-rootuserpages": "Преместување на основна корисничка страница",
+       "right-move-categorypages": "Преместување на категориски страници",
        "right-movefile": "Преместување на податотеки",
        "right-suppressredirect": "Не прави пренасочување од старото име при преместување на страница",
        "right-upload": "Подигни податотеки",
        "action-move": "преместување на оваа страница",
        "action-move-subpages": "преместување на оваа страница и нејзините потстраници",
        "action-move-rootuserpages": "преместување на основна корисничка страница",
+       "action-move-categorypages": "преместување на категориски страници",
        "action-movefile": "премести ја оваа податотека",
        "action-upload": "подигни ја податотекава",
        "action-reupload": "заменување на оваа постоечка податотека",
        "log-title-wildcard": "Пребарај наслови кои почнуваат со овој текст",
        "showhideselectedlogentries": "Прикажи/скриј одбрани записи",
        "allpages": "Сите страници",
-       "alphaindexline": "од $1 до $2",
        "nextpage": "Следна страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи страници кои започнуваат со:",
        "emailccme": "Испрати ми копија на пораката по е-пошта.",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
-       "emailsenttext": "Ð\92аÑ\88аÑ\82а Ðµ-поÑ\88Ñ\82а Ðµ Ð¿Ñ\80аÑ\82ена.",
+       "emailsenttext": "Ð\9fиÑ\81моÑ\82о Ðµ Ð¸Ñ\81пÑ\80аÑ\82ено.",
        "emailuserfooter": "Оваа е-порака беше пратена од $1 до $2 со помош на функцијата Е-пошта на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
        "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
-       "sessionfailure-title": "Сесијата не успеа",
-       "sessionfailure": "Има проблем со вашата сесија;\nоваа дејство е откажано како превентива против преземање сесии.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
+       "sessionfailure-title": "Седницата не успеа",
+       "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "protectlogpage": "Дневник на заштитувања",
        "protectlogtext": "Подолу има список на измените во заштитата на страницата.\nМоментално заштитените страници ќе ги најдете [[Special:ProtectedPages|овој список]].",
        "protectedarticle": "заштитена „[[$1]]“",
        "blockip": "Блокирај корисник",
        "blockip-legend": "Блокирај корисник",
        "blockiptext": "Користете го долниот образец за да го забраните пристапот за пишување од одредена IP-адреса или корисничко име.\nОва единствено треба да се прави за да се спречи вандализам, во согласност со [[{{MediaWiki:Policy-url}}|правилата на Википедија]].\nИзберете конкретна причина подолу (на пр. наведувајќи ги страниците што биле вандализирани).",
-       "ipadressorusername": "IP-адреса или корисничко име:",
+       "ipaddressorusername": "IP-адреса или корисничко име:",
        "ipbexpiry": "Истек на рокот:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "*Вообичаени причини за блокирање\n** Вметнување лажни информации\n** Бришење на содржини од страниците\n** Спам-врски кон надворешни мрежни места\n** Вметнување глупости во страниците\n** Непристојно однесување\n** Навредување на други корисници\n** Неприфатливо корисничко име",
        "movepagetalktext": "Соодветната страница за разговор, доколку постои, ќе биде автоматски преместена заедно со неа, освен ако:\n*Веќе постои страница за разговор за новиот наслов, или\n*Долното поле е неозначено.\n\nВо овие случаи, ќе треба рачно да се премести или спои ако има потреба.",
        "movearticle": "Премести страница:",
        "moveuserpage-warning": "'''Предупредување:''' На пат сте да преместите корисничка страница. Имајте предвид дека само страницата ќе биде преместена, а самиот корисник ''нема'' да биде преименуван.",
+       "movecategorypage-warning": "<strong>Предупредување:</strong> Преместувате категориска страница. Имајте предвид дека ќе се премести само страницата, а страниците во старата категорија <em>нема</em> да се прекатегоризираат во новата.",
        "movenologintext": "Мора да бидете регистриран корисник и да сте [[Special:UserLogin|најавени]] за да можете да преместувате страници.",
        "movenotallowed": "Немате доволно привилегии за преместување на страници.",
        "movenotallowedfile": "Немате дозвола за преместување податотеки.",
        "cant-move-user-page": "Немате дозвола за преместување на основни кориснички страници (освен потстраници).",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
+       "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
+       "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
        "newtitle": "Кон новиот наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "import-nonewrevisions": "Не увезов ниедна преработка (сите се веќе присутни или изоставени поради грешки)",
        "xml-error-string": "$1 во ред $2, колона $3 (бајт $4): $5",
        "import-upload": "Подигни XML податоци",
-       "import-token-mismatch": "Ð\93Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и. Обидете се повторно.",
+       "import-token-mismatch": "Ð\97агÑ\83бени Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а. Обидете се повторно.",
        "import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
        "import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
        "newimages-summary": "Оваа специјална страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
-       "showhidebots": "($1 ботови)",
+       "newimages-showbots": "Прикажувај подигања од ботови",
        "noimages": "Нема ништо.",
        "ilsubmit": "Барај",
        "bydate": "по датум",
        "exif-subsectime": "Дел од секундата во кој е сликано",
        "exif-subsectimeoriginal": "Дел од секундата во кој е фотографирано",
        "exif-subsectimedigitized": "Дел од секундата во кој е дигитализирано",
-       "exif-exposuretime": "Ð\95кÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuretime": "Ð\92Ñ\80еме Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶ÐµÐ½Ð¾Ñ\81Ñ\82",
        "exif-exposuretime-format": "$1 сек ($2)",
        "exif-fnumber": "F-бр.",
        "exif-fnumber-format": "f/$1",
-       "exif-exposureprogram": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposureprogram": "Ð\9fÑ\80огÑ\80ам Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-spectralsensitivity": "Спектрална осетливост",
        "exif-isospeedratings": "Светлоосетливост по ISO",
        "exif-shutterspeedvalue": "APEX-брзина на затворачот",
        "exif-aperturevalue": "APEX-oтвор",
        "exif-brightnessvalue": "APEX-светлост",
-       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-maxaperturevalue": "Макс. отвореност на блендата",
        "exif-subjectdistance": "Оддалеченост до објектот",
        "exif-meteringmode": "Режим на мерачот",
        "exif-focalplaneyresolution": "Разложеност на жаришната рамнина Y",
        "exif-focalplaneresolutionunit": "Единица за разложеност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
-       "exif-exposureindex": "Ð\98ндекÑ\81 Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposureindex": "Ð\9fоказаÑ\82ел Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-sensingmethod": "Метод на сензорот",
        "exif-filesource": "Извор на податотеката",
        "exif-scenetype": "Тип на сцена",
        "exif-customrendered": "Дополнитела обработка на сликата",
-       "exif-exposuremode": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode": "Режим Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-whitebalance": "Рамнотежа на бело",
        "exif-digitalzoomratio": "Сооднос на дигиталното приближување (зум)",
        "exif-focallengthin35mmfilm": "Жаришно растојание кај 35 мм филм",
        "exif-scenetype-1": "Директно фотографирана слика",
        "exif-customrendered-0": "Нормален процес",
        "exif-customrendered-1": "Нестандарден процес",
-       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ка ÐµÐºÑ\81позиÑ\86иÑ\98а",
-       "exif-exposuremode-1": "РаÑ\87на ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ко Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
+       "exif-exposuremode-1": "РаÑ\87но Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-exposuremode-2": "Автоматски со зададен распон",
        "exif-whitebalance-0": "Автоматска рамнотежа на бело",
        "exif-whitebalance-1": "Рачна рамнотежа на бело",
        "watchlistedit-raw-submit": "Поднови го списокот",
        "watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов беше избришан|$1 наслови беа избришани}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
+       "watchlistedit-clear-title": "Исчистен списокот на набљудувања",
+       "watchlistedit-clear-legend": "Исчисти набљудувани",
+       "watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од списокот на набљудувања",
+       "watchlistedit-clear-titles": "Наслови:",
+       "watchlistedit-clear-submit": "Исчисти ги набљудуваните (Ова е трајно!)",
+       "watchlistedit-clear-done": "Вашиот список на набљудувања е исчистен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
+       "watchlistedit-too-many": "Има премногу страници за да можат тука да се прикажат.",
+       "watchlisttools-clear": "Исчисти ги набљудуваните",
        "watchlisttools-view": "Преглед на релевантни промени",
        "watchlisttools-edit": "Погледај и уреди список на набљудувања",
        "watchlisttools-raw": "Напредно уредување на списокот на набљудувања",
index 20236d3..d52550e 100644 (file)
        "jumptonavigation": "വഴികാട്ടി",
        "jumptosearch": "തിരയൂ",
        "view-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ താൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും താൾ ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.\n\n$1",
+       "generic-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ സ്രോതസ്സുകൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും ഇത് ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.",
        "pool-timeout": "പൂട്ട് മാറാനുള്ള കാത്തിരിപ്പ് സമയം",
        "pool-queuefull": "പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു",
        "pool-errorunknown": "അപരിചിതമായ പിഴവ്",
        "log-title-wildcard": "ഈ വാക്കിൽ തുടങ്ങുന്ന തിരച്ചിൽ ഫലങ്ങൾ",
        "showhideselectedlogentries": "തിരഞ്ഞെടുത്ത രേഖാ വിവരങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക",
        "allpages": "എല്ലാ താളുകളും",
-       "alphaindexline": "$1 മുതൽ $2 വരെ",
        "nextpage": "അടുത്ത താൾ ($1)",
        "prevpage": "മുൻപത്തെ താൾ ($1)",
        "allpagesfrom": "താളുകളുടെ തുടക്കം:",
        "blockip": "ഉപയോക്താവിനെ തടയുക",
        "blockip-legend": "ഉപയോക്താവിനെ തടയുക",
        "blockiptext": "ഏതെങ്കിലും ഐ.പി. വിലാസത്തേയോ ഉപയോക്താവിനേയോ തടയുവാൻ താഴെയുള്ള ഫോം ഉപയോഗിക്കുക.\n[[{{MediaWiki:Policy-url}}|വിക്കിയുടെ നയം]] അനുസരിച്ച് നശീകരണപ്രവർത്തനം തടയാൻ മാത്രമേ ഇതു ചെയ്യാവൂ.\nതടയാനുള്ള വ്യക്തമായ കാരണം (ഏതു താളിലാണു നശീകരണപ്രവർത്തനം നടന്നത് എന്നതടക്കം) താഴെ രേഖപ്പെടുത്തിയിരിക്കണം.",
-       "ipadressorusername": "ഐ.പി. വിലാസം അല്ലെങ്കിൽ ഉപയോക്തൃനാമം:",
+       "ipaddressorusername": "ഐ.പി. വിലാസം അല്ലെങ്കിൽ ഉപയോക്തൃനാമം:",
        "ipbexpiry": "കാലാവധി:",
        "ipbreason": "കാരണം:",
        "ipbreason-dropdown": "*തടയലിനു യോഗ്യമായ കാരണങ്ങൾ\n** തെറ്റായ വിവരങ്ങൾ ചേർക്കുക\n** താളിൽ നിന്നു വിവരങ്ങൾ മായ്ക്കുക\n** പുറം വെബ്ബ്സൈറ്റിലേക്കുള്ള പാഴ് കണ്ണികൾ ചേർക്കൽ\n** അനാവശ്യം/അസംബന്ധം താളിലേക്കു ചേർക്കൽ\n** മാന്യമല്ലാത്ത പെരുമാറ്റം\n** ദുരുദ്ദേശത്തോടെ ഉപയോഗിക്കുന്ന നിരവധി അംഗത്വങ്ങൾ\n** വിക്കിക്കു ചേരാത്ത ഉപയോക്തൃനാമം",
        "newimages-summary": "ചുരുക്കം",
        "newimages-legend": "അരിപ്പ",
        "newimages-label": "പ്രമാണത്തിന്റെ പേര്‌ (അഥവാ പേരിന്റെ ഭാഗം)",
-       "showhidebots": "(യന്ത്രങ്ങളെ $1)",
        "noimages": "ഒന്നും കാണാനില്ല.",
        "ilsubmit": "തിരയൂ",
        "bydate": "ദിനക്രമത്തിൽ",
index 1a7c555..a184e82 100644 (file)
        "blockip": "Хэрэглэгчийг түгжих",
        "blockip-legend": "Хэрэглэгчийг түгжих",
        "blockiptext": "Доорх маягтыг ашиглан тодорхой IP хаяг эсвэл хэрэглэгчийн нэрийг засвар хийхээс түгжинэ үү.\nЭнэ нь зөвхөн вандализм үйлдэх явдлаас сэргийлэхийн тулд, [[{{MediaWiki:Policy-url}}|бодлого, баримтлалын]] дагуу хийгдэх ёстой.\nДоор тодорхой шалтгаанаа бичнэ үү.",
-       "ipadressorusername": "IP хаяг буюу хэрэглэгчийн нэр",
+       "ipaddressorusername": "IP хаяг буюу хэрэглэгчийн нэр",
        "ipbexpiry": "Түгжээ нь нээгдэх хугацаа",
        "ipbreason": "Шалтгаан:",
        "ipbreason-dropdown": "*Ерөнхий түгжих шалтгаанууд\n** Худал мэдээлэл оруулсан\n** Хуудаснуудаас агуулга устгасан\n** Гадны холбоосууд руу линк оруулж спам үйлдсэн\n** Утгагүй зүйл/бувтнал оруулсан\n** Сүрдүүлсэн/зовоосон ааш авиртай\n** Олон бүртгэлийг буруу хэргээр ашигласан\n** Зөвшөөршгүй хэрэглэгчийн нэртэй",
        "newimages-summary": "Энэ тусгай хуудсанд хамгийн сүүлд оруулагдсан файлуудыг үзүүлнэ.",
        "newimages-legend": "Шүүлтүүр",
        "newimages-label": "Файлын нэр (эсвэл түүний нэг хэсэг):",
-       "showhidebots": "(Роботуудыг $1)",
        "noimages": "Харах юмгүй.",
        "ilsubmit": "Хайлт",
        "bydate": "Огноогоор",
index d4d609e..418cbb6 100644 (file)
        "blockip": "हा अंकपत्ता अडवा",
        "blockip-legend": "सदस्यास प्रतिबंध करा",
        "blockiptext": "एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.\nहे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.\nखाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).",
-       "ipadressorusername": "अंकपत्ता किंवा सदस्यनाम:",
+       "ipaddressorusername": "अंकपत्ता किंवा सदस्यनाम:",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*प्रतिबंधनाची सामान्य कारणे\n** चुकीची माहिती भरणे\n** पानांवरील मजकूर काढणे\n** बाह्यसंकेतस्थळाचे चिखलणी(स्पॅमींग) दुवे देणे\n** पानात अटरफटर/वेडगळ भरणे\n** धमकावणारे/उपद्रवी वर्तन\n** असंख्य खात्यांचा गैरवापर\n** अस्वीकार्य सदस्यनाम",
        "newimages-summary": "हे विशेष पान शेवटी चढविलेल्या संचिका दर्शविते.",
        "newimages-legend": "गाळक",
        "newimages-label": "संचिकानाम (किंवा त्याचा भाग):",
-       "showhidebots": "(सांगकामे $1)",
        "noimages": "बघण्यासारखे येथे काही नाही.",
        "ilsubmit": "शोधा",
        "bydate": "तारखेनुसार",
index ced687d..fd9193d 100644 (file)
@@ -23,7 +23,7 @@
        },
        "tog-underline": "Garis bawah pautan:",
        "tog-hideminor": "Sembunyikan suntingan kecil dalam laman perubahan terkini",
-       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini",
+       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada laman perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Perubahan kumpulan mengikut laman dalam perubahan terkini dan senarai pantau",
        "permalink": "Pautan kekal",
        "print": "Cetak",
        "view": "Paparkan",
+       "view-foreign": "Lihat di $1",
        "edit": "Sunting",
+       "edit-local": "Sunting huraian tempatan",
        "create": "Cipta",
+       "create-local": "Isikan huraian tempatan",
        "editthispage": "Sunting laman ini",
        "create-this-page": "Cipta laman ini",
        "delete": "Hapuskan",
        "jumptonavigation": "pandu arah",
        "jumptosearch": "cari",
        "view-pool-error": "Maaf, pelayan terlebih bebanan pada masa ini.\nTerlalu ramai pengguna cuba melihat laman ini.\nSila tunggu sebentar sebelum cuba mencapai laman ini lagi.\n\n$1",
+       "generic-pool-error": "Maaf, semua pelayan terlebih bebanan ketika ini.\n\nTerlalu ramai pengguna yang sedang cuba mengakses sumber ini.\n\nSila tunggu sebentar sebelum cuba mengakses sumber ini semula.",
        "pool-timeout": "Menunggu sebentar untuk dikunci",
        "pool-queuefull": "Giliran kolam telah penuh",
        "pool-errorunknown": "Ralat tak diketahui",
        "edit-gone-missing": "Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.",
        "edit-conflict": "Percanggahan penyuntingan.",
        "edit-no-change": "Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.",
+       "postedit-confirmation-created": "Halaman telah diwujudkan.",
+       "postedit-confirmation-restored": "Halaman telah dipulihkan.",
        "postedit-confirmation-saved": "Suntingan anda telah disimpan.",
        "edit-already-exists": "Tidak dapat mencipta laman baru kerana ia telah wujud.",
        "defaultmessagetext": "Teks mesej asal",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "expensive-parserfunction-category": "Laman yang mengandungi terlalu banyak panggilan fungsi penghurai yang intensif",
        "post-expand-template-inclusion-warning": "Amaran: Saiz penyertaan templat terlalu besar.\nSesetengah templat tidak akan disertakan.",
-       "post-expand-template-inclusion-category": "Laman-laman yang melebihi had saiz penyertaan templat",
+       "post-expand-template-inclusion-category": "Laman yang melebihi had saiz penyertaan templat",
        "post-expand-template-argument-warning": "Amaran: Laman ini mengandungi sekurang-kurangnya satu argumen templat yang mempunyai saiz pengembangan yang terlalu besar.\nArgumen-argumen ini telah ditinggalkan.",
        "post-expand-template-argument-category": "Laman yang mengandungi templat dengan argumen yang tidak lengkap",
        "parser-template-loop-warning": "Gelung templat dikesan: [[$1]]",
        "mergelog": "Log penggabungan",
        "pagemerge-logentry": "menggabungkan [[$1]] ke dalam [[$2]] (semakan sehingga $3)",
        "revertmerge": "Pisahkan",
-       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam lamana yang lain.",
+       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam laman yang lain.",
        "history-title": "Sejarah semakan bagi \"$1\"",
        "difference-title": "Perbezaan antara semakan-semakan \"$1\"",
        "difference-title-multipage": "Perbezaan antara laman \"$1\" dan \"$2\"",
        "action-createpage": "mencipta laman",
        "action-createtalk": "mencipta laman perbincangan",
        "action-createaccount": "mencipta akaun pengguna ini",
+       "action-history": "melihat sejarah halaman ini",
        "action-minoredit": "menanda suntingan ini sebagai suntingan kecil",
        "action-move": "memindahkan laman ini",
        "action-move-subpages": "memindahkan laman ini dan sublaman-sublamannya",
        "recentchanges-label-minor": "Ini ialah suntingan kecil",
        "recentchanges-label-bot": "Suntingan ini dilakukan oleh bot",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
-       "recentchanges-label-plusminus": "Saiz halaman telah berubah sebanyak jumlah bait ini",
+       "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
-       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai halaman baru]])",
+       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
-       "rclistfrom": "Papar perubahan sejak $3 $2",
+       "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Paparkan",
        "rcshowhideminor-hide": "Sorokkan",
        "unusedtemplateswlh": "pautan-pautan lain",
        "randompage": "Laman rawak",
        "randompage-nopages": "Tiada laman dalam {{PLURAL:$2|ruang|ruang-ruang}} nama berikut: $1.",
-       "randomincategory": "Halaman pilihan rawak dalam kategori",
+       "randomincategory": "Laman rawak dalam kategori",
        "randomincategory-invalidcategory": "\"$1\" bukan nama kategori yang sah.",
        "randomincategory-nopages": "Tiada halaman di [[:Category:$1]].",
        "randomincategory-selectcategory": "Dapatkan halaman pilihan rawak dari kategori: $1 $2.",
        "statistics-users-active": "Pengguna aktif",
        "statistics-users-active-desc": "Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}",
        "statistics-mostpopular": "Laman dilihat terbanyak",
-       "pageswithprop": "Halaman dengan sifat halaman",
-       "pageswithprop-legend": "Halaman dengan sifat halaman",
+       "pageswithprop": "Laman dengan sifat laman",
+       "pageswithprop-legend": "Laman dengan sifat laman",
        "pageswithprop-text": "Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.",
        "pageswithprop-prop": "Nama sifat:",
        "pageswithprop-submit": "Pergi",
        "mostlinkedtemplates": "Templat dipaut terbanyak",
        "mostcategories": "Rencana dengan kategori terbanyak",
        "mostimages": "Imej dipaut terbanyak",
-       "mostinterwikis": "Halaman yang paling banyak pautan antara wiki",
+       "mostinterwikis": "Laman yang paling banyak pautan interwiki",
        "mostrevisions": "Rencana dengan semakan terbanyak",
        "prefixindex": "Indeks awalan",
        "prefixindex-namespace": "Semua laman dengan awalan (ruang nama $1)",
        "log-title-wildcard": "Cari semua tajuk yang bermula dengan teks ini",
        "showhideselectedlogentries": "Tunjukkan/sorokkan entri-entri log yang terpilih",
        "allpages": "Semua laman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman berikutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tunjukkan laman bermula pada:",
        "cachedspecial-viewing-cached-ts": "Anda sedang melihat versi dalam cache laman ini yang mungkin tidak lengkap sepenuhnya.",
        "cachedspecial-refresh-now": "Lihat yang terkini.",
        "categories": "Kategori",
-       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman-laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
+       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
        "categoriesfrom": "Paparkan kategori bermula daripada:",
        "special-categories-sort-count": "susun mengikut tertib bilangan",
        "special-categories-sort-abc": "susun mengikut tertib abjad",
        "listgrouprights-removegroup-self": "Keluar daripada {{PLURAL:$2|kumpulan|kumpulan-kumpulan}}: $1",
        "listgrouprights-addgroup-self-all": "Menyertai semua kumpulan",
        "listgrouprights-removegroup-self-all": "Keluar daripada semua kumpulan",
+       "listgrouprights-namespaceprotection-header": "Sekatan ruang nama",
+       "listgrouprights-namespaceprotection-namespace": "Ruang nama",
+       "trackingcategories": "Kategori penjejak",
+       "trackingcategories-msg": "Kategori penjejak",
+       "trackingcategories-name": "Nama pesanan",
+       "trackingcategories-nodesc": "Tiada keterangan tersedia.",
        "mailnologin": "Tiada alamat e-mel",
        "mailnologintext": "Anda perlu [[Special:UserLogin|log masuk]]\nterlebih dahulu dan mempunyai alamat e-mel yang sah dalam\n[[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.",
        "emailuser": "Kirim e-mel kepada pengguna ini",
        "unwatchthispage": "Berhenti memantau",
        "notanarticle": "Bukan laman kandungan",
        "notvisiblerev": "Semakan ini telah dihapuskan",
-       "watchlist-details": "$1 laman dipantau (tidak termasuk laman perbincangan).",
+       "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
        "wlnote2": "Yang berikut adalah perubahan dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} yang lepas, setakat $2, $3.",
        "delete-edit-reasonlist": "Ubah sebab-sebab hapus",
        "delete-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Oleh itu, laman ini dilindungi daripada dihapuskan untuk mengelak kerosakan di {{SITENAME}} yang tidak disengajakan.",
        "delete-warning-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Menghapuskannya boleh mengganggu perjalanan pangkalan data {{SITENAME}}. Sila berhati-hati.",
-       "deleting-backlinks-warning": "'''Amaran:''' Terdapat halaman-halaman lain yang berpaut atau bertransklusi dengan halaman yang hendak anda hapus itu.",
+       "deleting-backlinks-warning": "'''Amaran:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Terdapat laman lain]] yang berpaut atau bertransklusi dengan laman yang hendak anda hapus ini.",
        "rollback": "Undurkan suntingan.",
        "rollback_short": "Undur",
        "rollbacklink": "undur",
        "protect-locked-blocked": "Anda telah disekat, justeru tidak boleh menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-dblock": "Anda tidak boleh menukar peringkat perlindungan kerana pangkalan data sedang dikunci.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-access": "Anda tidak mempunyai keizinan untuk menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
-       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Anda boleh menukar peringkat perlindunan laman ini, akan tetapi ia tidak akan menjejaskan perlindungan melata tersebut.",
+       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Penukaran peringkat perlindungan laman ini tidak akan menjejaskan perlindungan melata tersebut.",
        "protect-default": "Benarkan semua pengguna",
        "protect-fallback": "Benarkan pengguna yang berizin \"$1\" sahaja",
        "protect-level-autoconfirmed": "Benarkan pengguna yang diautosahkan sahaja",
        "contributions-title": "Sumbangan oleh $1",
        "mycontris": "Sumbangan",
        "contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Akaun pengguna \"$1\" tidak berdaftar.",
        "nocontribs": "Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.",
        "uctop": "(terkini)",
        "month": "Sebelum bulan:",
        "sp-contributions-newbies": "Tunjukkan sumbangan daripada akaun baru sahaja",
        "sp-contributions-newbies-sub": "Bagi akaun-akaun baru",
        "sp-contributions-newbies-title": "Sumbangan oleh pengguna baru",
-       "sp-contributions-blocklog": "Log sekatan",
+       "sp-contributions-blocklog": "log sekatan",
        "sp-contributions-deleted": "sumbangan dihapuskan",
        "sp-contributions-uploads": "muat naik",
        "sp-contributions-logs": "log",
        "sp-contributions-search": "Cari sumbangan",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Hanya paparkan suntingan yang merupakan semakan terkini",
+       "sp-contributions-newonly": "Hanya paparkan suntingan yang merupakan ciptaan laman",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pautan ke laman ini",
        "whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
        "blockip": "Sekat pengguna",
        "blockip-legend": "Sekat pengguna",
        "blockiptext": "Gunakan borang di bawah untuk menyekat\npenyuntingan daripada alamat IP atau pengguna tertentu.\nTindakan ini perlu dilakukan untuk menentang vandalisme sahaja dan selaras\ndengan [[{{MediaWiki:Policy-url}}|dasar {{SITENAME}}]].\nSila masukkan sebab sekatan di bawah (umpamannya, sebutkan laman yang telah\ndirosakkan).",
-       "ipadressorusername": "Alamat IP atau nama pengguna:",
+       "ipaddressorusername": "Alamat IP atau nama pengguna:",
        "ipbexpiry": "Tamat:",
        "ipbreason": "Sebab:",
        "ipbreason-dropdown": "*Sebab lazim\n** Memasukkan maklumat palsu\n** Membuang kandungan daripada laman\n** Memasukkan pautan spam ke tapak web luar\n** Memasukkan karut-marut ke dalam laman\n** Mengugut/mengganggu pengguna lain\n** Menyalahgunakan berbilang akaun\n** Nama pengguna yang tidak sesuai",
        "pageinfo-hidden-categories": "Kategori tersembunyi ($1)",
        "pageinfo-templates": "Templat tertransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Halaman|Halaman-halaman}} yang tertransklusi pada ($1)",
-       "pageinfo-toolboxlink": "Maklumat halaman",
+       "pageinfo-toolboxlink": "Maklumat laman",
        "pageinfo-redirectsto": "Melencong ke",
        "pageinfo-redirectsto-info": "maklumat",
        "pageinfo-contentpage": "Dikira sebagai halaman kandungan",
        "newimages-summary": "Laman khas ini memaparkan senarai fail muat naik terakhir.",
        "newimages-legend": "Penapis",
        "newimages-label": "Nama fail (atau sebahagian daripadanya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tiada imej.",
        "ilsubmit": "Cari",
        "bydate": "mengikut tarikh",
        "htmlform-chosen-placeholder": "Pilih satu pilihan",
        "sqlite-has-fts": "$1 dengan sokongan carian teks penuh",
        "sqlite-no-fts": "$1 tanpa sokongan carian teks penuh",
-       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} halaman $3",
-       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} halaman $3",
+       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3",
+       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3",
        "logentry-delete-event": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4",
        "logentry-delete-revision": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4",
        "logentry-delete-event-legacy": "$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3",
        "revdelete-uname-unhid": "nama pengguna terdedah",
        "revdelete-restricted": "mengenakan sekatan pada penyelia",
        "revdelete-unrestricted": "menarik sekatan daripada penyelia",
-       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4",
-       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan",
-       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan",
-       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
+       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4",
+       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 tanpa meninggalkan lencongan",
+       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan",
+       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
        "logentry-patrol-patrol": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda",
        "logentry-patrol-patrol-auto": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik",
        "logentry-newusers-newusers": "Akaun pengguna $1 telah {{GENDER:$2|dibuka}}",
index 67cb82a..0eecd8a 100644 (file)
@@ -7,7 +7,8 @@
                        "Malafaya",
                        "Roderick Mallia",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "CharlieTheCabbie"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
@@ -34,7 +35,7 @@
        "tog-shownumberswatching": "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
        "tog-oldsig": "Firma attwali:",
        "tog-fancysig": "Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)",
-       "tog-uselivepreview": "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
+       "tog-uselivepreview": "Attiva l-funzjoni ''Previżjoni jgħixu'' (bżonn tal-JavaScript; sperimentali)",
        "tog-forceeditsummary": "Nebbaħni meta ndaħħal taqsira tal-modifika vojta",
        "tog-watchlisthideown": "Aħbi l-modifiki tiegħi mil-lista ta' osservazzjoni",
        "tog-watchlisthidebots": "Aħbi l-modifiki tal-bots mil-lista ta' osservazzjoni",
@@ -50,7 +51,7 @@
        "tog-prefershttps": "Dejjem uża l-konnessjoni sigura meta tidħol fil-kont",
        "underline-always": "Dejjem",
        "underline-never": "Qatt",
-       "underline-default": "Żomm l-issettjar tal-browser",
+       "underline-default": "Jżommu tieghek l-issettjar għal tal-browser jew tas-ġilda",
        "editfont-style": "Stil tat-tipa tal-kaxxa tal-editjar:",
        "editfont-default": "Żomm l-issettjar tal-browser",
        "editfont-monospace": "Tipa monospazja",
        "newwindow": "(tinfetaħ f'tieqa ġdida)",
        "cancel": "Annulla",
        "moredotdotdot": "Aktar...",
-       "morenotlisted": "Oħrajn mhux imniżżla...",
+       "morenotlisted": "Oħrajn mhux imniżżla.",
        "mypage": "Paġna",
        "mytalk": "Diskussjoni",
        "anontalk": "Diskussjoni għal dan l-IP",
        "permalink": "Ħolqa permanenti",
        "print": "Ipprintja",
        "view": "Dehra",
+       "view-foreign": "Tara fuq $1",
        "edit": "Editja",
+       "edit-local": "Timmodifika deskrizzjoni lokali",
        "create": "Oħloq",
+       "create-local": "Żid deskrizzjoni lokali",
        "editthispage": "Immodifika din il-paġna",
        "create-this-page": "Oħloq din il-paġna",
        "delete": "Ħassar",
        "log-title-wildcard": "Tfittxija ta' titli li jibdew b'dan it-test",
        "showhideselectedlogentries": "Uri/aħbi d-daħliet magħżula tar-reġistru",
        "allpages": "Il-paġni kollha",
-       "alphaindexline": "minn $1 sa $2",
        "nextpage": "Il-paġna li jmiss ($1)",
        "prevpage": "Il-paġna ta' qabel ($1)",
        "allpagesfrom": "Uri l-paġni li jibdew minn:",
        "blockip": "Imblokka lil utent",
        "blockip-legend": "Imblokka 'l-utent",
        "blockiptext": "Uża l-formola t'hawn taħt sabiex biex tibblokkja l-aċċess tal-kitba lil IP speċifiku jew utent.\nIl-blokk irid ikun użat biss sabiex jitnaqqas iċ-ċans ta' vandaliżmu, u għandu josservja b'mod strett il-[[{{MediaWiki:Policy-url}}|politika ta' {{SITENAME}}]].\nIndika r-raġuni speċifika għalfejn tixtieq tipproċedi bil-blokk (per eżempju, billi turi l-paġni partikolari li ġew ivvandalizzati).",
-       "ipadressorusername": "Indirizz tal-IP jew isem tal-utent:",
+       "ipaddressorusername": "Indirizz tal-IP jew isem tal-utent:",
        "ipbexpiry": "Skadenza tal-imblokk:",
        "ipbreason": "Raġuni:",
        "ipbreason-dropdown": "*Raġunijiet komuni dwar blokki\n** Iddaħħal informazzjoni falza\n** Tneħħi kontenut mill-paġni\n** Links kummerċjali ma' siti esterni\n** Iddaħal kontenut bla sens\n** Komportament intimidanti jew molestiku\n** Abbuż minn aktar minn kont wieħed\n** isem ta' utent mhux aċċettabli",
        "newimages-summary": "Din il-paġna speċjali turi l-aħħar fajls li ġew mtella' riċentament.",
        "newimages-legend": "Filtru",
        "newimages-label": "Isem tal-fajl (jew parti minnu):",
-       "showhidebots": "($1 bots)",
        "noimages": "M'hawn xejn x'tara.",
        "ilsubmit": "Fittex",
        "bydate": "data",
index 83d33d9..e17ea9c 100644 (file)
        "whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
        "blockip": "Tiquitzacuilīz tlatequitiltilīlli",
        "blockip-legend": "Tiquitzacuilīz tlatequitiltilīlli",
-       "ipadressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
+       "ipaddressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
        "ipbexpiry": "Motlamia:",
        "ipbreason": "Īxtlamatiliztli:",
        "ipbsubmit": "Tiquitzacuilīz inīn tlatequitiltilīlli",
        "show-big-image": "Mochi cuallōtl",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
-       "showhidebots": "($1 tepoztlācah)",
        "noimages": "Ahtlein ic tlatta.",
        "ilsubmit": "Tlatēmōz",
        "bydate": "tōnalcopa",
index 38993b7..4e6c076 100644 (file)
        "log-title-wildcard": "Søk i titler som starter med denne teksten",
        "showhideselectedlogentries": "Vis/skjul de valgte logghendelsene",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neste side ($1)",
        "prevpage": "Forrige side ($1)",
        "allpagesfrom": "Vis sider fra og med:",
        "blockip": "Blokker bruker",
        "blockip-legend": "Blokker bruker",
        "blockiptext": "Bruk skjemaet under for å blokkere en IP-adresses tilgang til å redigere artikler. Dette må kun gjøres for å forhindre hærverk, og i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjene]]. Fyll ut en spesiell begrunnelse under.",
-       "ipadressorusername": "IP-adresse eller brukernavn",
+       "ipaddressorusername": "IP-adresse eller brukernavn",
        "ipbexpiry": "Varighet:",
        "ipbreason": "Årsak:",
        "ipbreason-dropdown": "*Vanlige blokkeringsgrunner\n** Legger inn feilinformasjon\n** Fjerner innhold fra sider\n** Lenkespam\n** Legger inn vås\n** Truende oppførsel\n** Misbruk av flere kontoer\n** Uakseptabelt brukernavn",
        "newimages-summary": "Denne spesialsiden viser de sist opplastede filene.",
        "newimages-legend": "Filnavn",
        "newimages-label": "Filnavn (helt eller delvis):",
-       "showhidebots": "($1 roboter)",
        "noimages": "Ingenting å se.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
index 02b902c..a6847b4 100644 (file)
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
+       "rcshowhideminor-show": "Bekieken",
+       "rcshowhideminor-hide": "Verbargen",
        "rcshowhidebots": "$1 botgebrukers",
+       "rcshowhidebots-show": "Bekieken",
+       "rcshowhidebots-hide": "Verbargen",
        "rcshowhideliu": "$1 eregistreerden gebrukers",
+       "rcshowhideliu-show": "Bekieken",
+       "rcshowhideliu-hide": "Verbargen",
        "rcshowhideanons": "$1 anonieme gebrukers",
+       "rcshowhideanons-show": "Bekieken",
+       "rcshowhideanons-hide": "Verbargen",
        "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
+       "rcshowhidepatr-show": "Bekieken",
+       "rcshowhidepatr-hide": "Verbargen",
        "rcshowhidemine": "$1 mien bewarkingen",
+       "rcshowhidemine-show": "Bekieken",
+       "rcshowhidemine-hide": "Verbargen",
        "rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen<br />$3",
        "diff": "wiezig",
        "hist": "gesch",
        "log-title-wildcard": "Zeuk naor titels die beginnen mit disse tekste:",
        "showhideselectedlogentries": "Ekeuzen logboekregels laoten zien of verbargen",
        "allpages": "Alle ziejen",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende zied ($1)",
        "prevpage": "Veurige zied ($1)",
        "allpagesfrom": "Laot ziejen zien vanaof:",
        "blockip": "Gebruker blokkeren",
        "blockip-legend": "n Gebruker of IP-adres blokkeren",
        "blockiptext": "Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. \nt Is bedoeld um vandalisme te veurkoemen en mut akkederen mit t [[{{MediaWiki:Policy-url}}|beleid]]. \nGeef hieronder n reden op (bieveurbeeld op welke ziejen de vandalisme epleegd is).",
-       "ipadressorusername": "IP-adres of gebrukersnaam",
+       "ipaddressorusername": "IP-adres of gebrukersnaam",
        "ipbexpiry": "Verlöp nao",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Algemene redens veur t blokkeren\n** verkeerde informasie invoeren\n** ziejen leegmaken\n** ongewunste verwiezingen plaotsen\n** onzinteksten schrieven\n** targerieje of naor gedrag\n** misbruuk vanaof meerdere profielen\n** ongewunste gebrukersnaam",
        "newimages-summary": "Op disse spesiale zied staon de bestaanden die der as lest bie-ekeumen bin.",
        "newimages-legend": "Bestaandsnaam",
        "newimages-label": "Bestaandsnaam (of deel dervan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks te zien.",
        "ilsubmit": "Zeuk",
        "bydate": "op daotum",
index 108230a..0f9b881 100644 (file)
        "rev-suppressed-text-unhide": "यस पृष्ठको पुनरावलोकन '''दबाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन '''दबिएकोछ'''।\nप्रबन्धकको हैसियतमा हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा विवरण पाउन सकिन्छ]",
-       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किन भनें यस पृष्ठको पुनरावलोकन '''मेटाइएकोछ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
+       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन '''मेटाइएको छ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभनें यसको एउटा संशोधन '''मेटाइएको'''छ।",
        "rev-deleted-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''मेटाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-suppressed-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''दबिएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "revertmerge": "नमिलाउने",
        "mergelogpagetext": "एउटा पृष्ठको इतिहास अर्कोमा भर्खरै मिलाइएको सूची तल दिइन्छ।",
        "history-title": "\"$1\" को पुनरावृत्ति इतिहास",
-       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\81मा भिन्नता)",
+       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\82मा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "showhideselectedversions": "छानिएका पुनरावलोकनहरु देखाउने/लुकाउने",
        "recentchanges-feed-description": "यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्",
        "recentchanges-label-newpage": "यो सम्पादनले नयाँ पृष्ठ निर्माण गरेको छ",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
-       "recentchanges-label-bot": "यो सम्पादन बोट द्वारा गरिएको थियो",
+       "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
        "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "logempty": "लगमा मिल्ने वस्तु भेटिएन ।",
        "log-title-wildcard": "पाठबाट सुरुहुने शीर्षकहरु खोज्नुहोस्",
        "allpages": "सबै पृष्ठहरू",
-       "alphaindexline": "$1 लाई $2 मा",
        "nextpage": "अर्को पृष्ठ ($1)",
        "prevpage": "पहिलो पृष्ठ ($1)",
        "allpagesfrom": "यहाँदेखि शुरु हुने पृष्ठहरू देखाउनुहोस्:",
        "blockip": "प्रयोगकर्तालाइ निषेध गर्ने",
        "blockip-legend": "प्रयोगकर्ता रोक्नुहोस",
        "blockiptext": "विशेष IP ठेगाना अथवा प्रयोगकर्तालाई रोक लगाउन निम्न प्रपत्र (form) प्रयोग गर्नुहोस्।\nयसो गर्नुको कारण [[{{MediaWiki:Policy-url}}|नीति]] अनुरुप विकिमा गरिने बर्बरताका कार्य रोक्नु मात्र हो।\nविशेष कारण देखाउँदै तलको प्रपत्र भर्नुहोस्  (उदाहरण, बर्बरताको कार्य गरिएको पृष्ठ दर्शाउँदै)",
-       "ipadressorusername": " ip ठेगाना या प्रयोगकर्ता नाम :",
+       "ipaddressorusername": " ip ठेगाना या प्रयोगकर्ता नाम :",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*रोक लगाउनुका समान्य कारणहरु\n** झूटो सूचना दिइएको\n** पृष्ठहरुबाट सामाग्रीहरु हटाइएको\n** बाहिरी जालक्षेत्र (sites)सित नचाहिंदो लिङ्क गराइएको \n** पृष्ठहरुमा बकवास/गाली-गलौच हालिएको\n** भय फैलाउने व्यवहार/उत्पीडन (सताउने कार्य)\n** धेरै गलत खाताहरु\n** प्रयोगकर्ता नाम अस्वीकार्य",
        "newimages-summary": "यस विशेष पृष्ठले अन्तिम उर्ध्वभरण गरिका फाइलहरु देखाउँछ ।",
        "newimages-legend": "फिल्टर",
        "newimages-label": "फाइल अथवा (यसको एउटा अंश)को नाम:",
-       "showhidebots": "($1 बोटहरु)",
        "noimages": "हेर्नको लागि केही छैन.",
        "ilsubmit": "खोज्नुहोस्",
        "bydate": "मिति अनुसार",
index 830d2be..2df42db 100644 (file)
        "log-title-wildcard": "Pagina's zoeken die met deze tekens beginnen",
        "showhideselectedlogentries": "Geselecteerde logboekregels weergeven of verbergen",
        "allpages": "Alle pagina's",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende pagina ($1)",
        "prevpage": "Vorige pagina ($1)",
        "allpagesfrom": "Pagina's bekijken vanaf:",
        "blockip": "Gebruiker blokkeren",
        "blockip-legend": "Gebruiker blokkeren",
        "blockiptext": "Gebruik het onderstaande formulier om schrijftoegang voor een gebruiker of IP-adres in te trekken.\nDoe dit alleen als bescherming tegen vandalisme en in overeenstemming met het [[{{MediaWiki:Policy-url}}|beleid]].\nGeef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
-       "ipadressorusername": "IP-adres of gebruikersnaam:",
+       "ipaddressorusername": "IP-adres of gebruikersnaam:",
        "ipbexpiry": "Vervalt (maak een keuze):",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Veelvoorkomende redenen voor blokkades\n** Foutieve informatie invoeren\n** Verwijderen van informatie uit pagina's\n** Spamkoppeling naar externe websites\n** Invoegen van nonsens in pagina's\n** Intimiderend gedrag\n** Misbruik door meerdere gebruikers\n** Onaanvaardbare gebruikersnaam",
        "newimages-summary": "Op deze speciale pagina worden de meest recent toegevoegde bestanden weergegeven.",
        "newimages-legend": "Bestandsnaam",
        "newimages-label": "Bestandsnaam (of deel daarvan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Er is niets te zien.",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
index 5a0d083..73132c3 100644 (file)
        "blockip": "Blokker brukar",
        "blockip-legend": "Blokker brukar",
        "blockiptext": "Bruk skjemaet nedanfor for å blokkere skrivetilgangen frå ei spesifikk IP-adresse eller brukarnamn. Dette bør berre gjerast for å hindre hærverk, og i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].",
-       "ipadressorusername": "IP-adresse eller brukarnamn",
+       "ipaddressorusername": "IP-adresse eller brukarnamn",
        "ipbexpiry": "Opphøyrstid:",
        "ipbreason": "Årsak:",
        "ipbreason-dropdown": "*Vanlege grunnar for blokkering\n** Legg inn usann tekst/tull\n** Fjernar innhald frå sider\n** Legg inn reklamelenkjer til eksterne nettstader\n** Sjikane/plaging av andre brukarar\n** Misbruk ved hjelp av fleire brukarkontoar\n** Uansvarleg brukarnamn",
        "newimages-summary": "Denne spesialsida syner dei sist opplasta filene.",
        "newimages-legend": "Filnamn",
        "newimages-label": "Filnamn (eller ein del av det):",
-       "showhidebots": "($1 robotar)",
        "noimages": "Her er ingen filer som kan visast.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
index 76a9c98..a7dafa9 100644 (file)
        "log-title-wildcard": "Recercar de títols que començan per aqueste tèxte",
        "showhideselectedlogentries": "Afichar/amagar las entradas de jornal seleccionadas",
        "allpages": "Totas las paginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pagina seguenta ($1)",
        "prevpage": "Pagina precedenta ($1)",
        "allpagesfrom": "Afichar las paginas a partir de :",
        "blockip": "Blocar en escritura",
        "blockip-legend": "Blocar en escritura",
        "blockiptext": "Utilizatz lo formulari çaijós per blocar l'accès a las modificacions a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deu pas èsser presa pas que per empachar lo vandalisme e en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).",
-       "ipadressorusername": "Adreça IP o nom d’utilizaire :",
+       "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipbexpiry": "Durada del blocatge :",
        "ipbreason": "Motiu :",
        "ipbreason-dropdown": "* Motius de blocatge mai frequents\n** Vandalisme\n** Insercion d’informacions faussas\n** Supression de contengut sens justificacion\n** Insercion repetida de ligams extèrnes publicitaris (spam)\n** Insercion de contengut sens cap de sens\n** Temptativa d’intimidacion o agarriment\n** Abús d’utilizacion de comptes multiples\n** Nom d’utilizaire inacceptable, injuriós o difamant",
        "newimages-summary": "Aquesta pagina especiala aficha los darrièrs fichièrs importats.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
-       "showhidebots": "($1 bòts)",
        "noimages": "Cap d'imatge d'afichar pas.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
index 667640b..00eb42b 100644 (file)
                ]
        },
        "tog-underline": "ତଳେ ଥିବା ଲିଙ୍କ:",
-       "tog-hideminor": "ଛୋଟ ଛୋଟ ନଗଦ ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
+       "tog-hideminor": "ଛୋଟମୋଟ ନଗଦ ବଦଳସବୁକୁ ଲୁଚାଇବେ",
        "tog-hidepatrolled": "ନଗଦ ବଦଳରେ ଥିବା ଜଗାହୋଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
-       "tog-extendwatchlist": "à¬\95à­\87ବଳ à¬¨à¬\97ଦ à¬¨à­\81ହà­\87à¬\81, à¬¸à¬¬à­\81ଯାà¬\95 à¬¬à¬¦à¬³à¬\95à­\81 à¬¦à­\87à¬\96ାà¬\87ବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାà¬\95à­\81 à¬¬à¬¢à¬¼ାଇବେ",
+       "tog-extendwatchlist": "à¬\95à­\87ବଳ à¬¨à¬\97ଦ à¬¹à¬¿à¬\81 à¬¨à­\81ହà­\87à¬\81, à¬¸à¬¬à­\81ଯାà¬\95 à¬¬à¬¦à¬³à¬\95à­\81 à¬¦à­\87à¬\96ାà¬\87ବା à¬ªà¬¾à¬\87à¬\81 à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାà¬\95à­\81 à¬ªà­\82ରା à¬¦à­\87à¬\96ାଇବେ",
        "tog-usenewrc": "ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା",
        "tog-numberheadings": "ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ",
        "tog-showtoolbar": "ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ",
@@ -41,7 +41,7 @@
        "tog-uselivepreview": "ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବ୍ୟବହାର କରିବେ (ପରୀକ୍ଷାରେ ଅଛି)",
        "tog-forceeditsummary": "ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ",
        "tog-watchlisthideown": "ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ",
-       "tog-watchlisthidebots": "ଦà­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାରà­\87 à¬¬à¬\9f à¬¦à­\87à¬\87 à¬¬à¬¦à¬³ à¬\97à­\81ଡ଼ିà¬\95 ଲୁଚାଇବେ",
+       "tog-watchlisthidebots": "ଦà­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାରà­\87 à¬¸à­\8dà­±à­\9fà¬\82à¬\9aାଳà¬\95 (Bot)ର à¬¸à¬®à­\8dପାଦନାମାନ ଲୁଚାଇବେ",
        "tog-watchlisthideminor": "ଦେଖଣା ତାଲିକାରେ ଛୋଟ ଛୋଟ ବଦଳ ଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthideliu": "ଲଗ ଇନ କରିଥିବା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthideanons": "ଅଜଣା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "pool-errorunknown": "ଅଜଣା ଅସୁବିଧା",
        "aboutsite": "{{SITENAME}} ବାବଦରେ",
        "aboutpage": "Project:ବାବଦରେ",
-       "copyright": "à¬\85ଲà¬\97ା à¬­à¬¾à¬¬à­\87 à¬\89ଲà­\8dଲà­\87à¬\96 à¬¨ à¬\95ରାଯିବ à¬¯à¬¾à¬\8fà¬\81 à¬\8fହା $1 à¬°à­\87 à¬¸à¬°à­\8dବସà­\8dଵତà­\8dଵ à¬¸à¬\82ରà¬\95à­\8dଷିତ",
+       "copyright": "ଯଦି à¬\89ଲà­\8dଲà­\87à¬\96 à¬¹à­\8bà¬\87ନାହିà¬\81 à¬\8fହା $1 à¬\85ଧà­\80ନରà­\87 à¬¬à¬¿à¬¤à¬°à¬¿à¬¤ à¥¤",
        "copyrightpage": "{{ns:project}}:କପିରାଇଟ",
        "currentevents": "ଏବେକାର ଘଟଣା",
        "currentevents-url": "Project:ଏବେକାର ଘଟଣା",
        "toc": "ବିଷୟସୂଚୀ",
        "showtoc": "ଦେଖାଇବେ",
        "hidetoc": "ଲୁଚାନ୍ତୁ",
-       "collapsible-collapse": "à¬\9aାପିଦà­\87ବà­\87",
-       "collapsible-expand": "ବଢ଼ାଇବେ",
+       "collapsible-collapse": "ଲà­\81à¬\9aାà¬\87ବà­\87",
+       "collapsible-expand": "ଦà­\87à¬\96ାଇବେ",
        "thisisdeleted": "$1 କୁ ଦେଖିବେ ଅବା ପୁନସ୍ଥାପନ କରିବେ?",
        "viewdeleted": "ଦେଖିବା $1?",
        "restorelink": "{{PLURAL:$1|ଗୋଟିଏ ଲିଭାଯାଇଥିବା ବଦଳ|$1ଟି ଲିଭାଯାଇଥିବା ବଦଳ}}",
        "last": "ଆଗ",
        "page_first": "ପ୍ରଥମ",
        "page_last": "ଶେଷ",
-       "histlegend": "à¬\85ଲà¬\97ା à¬¬à¬\9bା:ସà¬\99à­\8dà¬\95ଳନ à¬¸à¬¬à­\81ର à¬°à­\87ଡ଼ିà¬\93 à¬¬à¬¾à¬\95à­\8dସà¬\95à­\81 à¬¬à¬¾à¬\9bି à¬¤à­\81ଳନା à¬\95ରନà­\8dତà­\81 à¬\93 à¬\8fଣà­\8dà¬\9fର à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¬¬à¬¾ à¬¤à¬³à­\87 à¬¥à¬¿à¬¬à¬¾ à¬¬à¬\9fନ à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¥¤<br />\nସାରà¬\95ଥା: '''({{int:cur}})''' = à¬¨à¬\97ଦ à¬¸à¬\99à­\8dà¬\95ଳନରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬¤à¬«à¬¾à¬¤, '''({{int:last}})''' = à¬\86à¬\97 à¬¸à¬\99à­\8dà¬\95ଳନ à¬­à¬¿à¬¤à¬°à­\87 à¬¤à¬«à¬¾à¬¤, '''{{int:minoreditletter}}''' = à¬\9fିà¬\95à­\87 à¬¬à¬¦à¬³ ।",
+       "histlegend": "ଭିନà­\8dନ à¬¬à¬\9bା: à¬¬à¬¾à¬\9bିବା à¬ªà¬¾à¬\87à¬\81 à¬\97à­\8bଲ à¬¬à¬¾à¬\9bିବା à¬\98ରà­\87 à¬\95à­\8dଲିà¬\95 à¬\95ରି à¬\8fଣà­\8dà¬\9fର à¬\85ଥବା à¬¤à¬³à­\87 à¬¥à¬¿à¬¬à¬¾ à¬¬à¬\9fନ à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¥¤<br />\nନିରà­\8dଦà­\8dଦà­\87ଶିà¬\95ା: <strong>({{int:cur}})</strong> = à¬\97ତ à¬¸à¬\82ସà­\8dମରଣମାନà¬\99à­\8dà¬\95 à¬®à¬§à­\8dà­\9fରà­\87 à¬¤à¬«à¬¾à¬¤, <strong>({{int:last}})</strong> = à¬\86à¬\97ର à¬¸à¬\82ସà­\8dମରଣମାନà¬\99à­\8dà¬\95 à¬®à¬§à­\8dà­\9fରà­\87 à¬¤à¬«à¬¾à¬¤, <strong>{{int:minoreditletter}}</strong> = à¬\9bà­\8bà¬\9fମà­\8bà¬\9f à¬¸à¬®à­\8dପାଦନା ।",
        "history-fieldset-title": "ଇତିହାସ ଖୋଜିବା",
        "history-show-deleted": "କେବଳ ଲିଭାଯାଇଥିବା",
        "histfirst": "ସବୁଠୁ ପୁରୁଣା",
        "recentchanges-legend": "ଏବେ କରାଯାଇଥିବା ଅଦଳବଦଳ",
        "recentchanges-summary": "ଏହି ପୃଷ୍ଠାରେ ଏହି ଉଇକିରେ ନଗଦ ବଦଳର ନିଘା ରଖିବେ",
        "recentchanges-feed-description": "ଏହି ଉଇକିରେ ଏହି ଫିଡ଼ଟିର ନଗଦ ବଦଳ ଦେଖାଇବେ ।",
-       "recentchanges-label-newpage": "à¬\8fହି à¬¬à¬¦à¬³ à¬¨à­\82à¬\86 à¬«à¬°à¬¦à¬\9fିà¬\8f à¬¤à¬¿à¬\86ରିà¬\95ଲା",
-       "recentchanges-label-minor": "à¬\8fହା à¬\97à­\8bà¬\9fିà¬\8f à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³",
+       "recentchanges-label-newpage": "à¬\8fହି à¬¸à¬®à­\8dପାଦନା à¬¯à­\8bà¬\97à­\81à¬\81 à¬¨à­\82à¬\86 à¬ªà­\83ଷà­\8dଠାà¬\9fିà¬\8f à¬¤à¬¿à¬\86ରି à¬¹à­\87ଲା",
+       "recentchanges-label-minor": "à¬\8fହା à¬\96à­\81ବ à¬¸à¬¾à¬®à¬¾à¬¨à­\8dà­\9f à¬¸à¬®à­\8dପାଦନାà¬\9fିà¬\8f",
        "recentchanges-label-bot": "ଏହି ବଦଳଟି ଜଣେ '''ବଟ'''ଙ୍କ ଦେଇ କରାଯାଇଥିଲା",
        "recentchanges-label-unpatrolled": "ଏହି ବଦଳଟିକୁ ଏ ଯାଏଁ ପରଖା ଯାଇନାହିଁ",
        "rcnotefrom": "'''$2''' ପରର ବଦଳସବୁ ତଳେ ଦିଆଗଲା ('''$1''' ଯାଏଁ ଦେଖାଯାଇଛି) ।",
        "rclistfrom": "$3 $2ରୁ ଆରମ୍ଭ କରି ନୂଆ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
-       "rcshowhideminor": "$1 ଟି ଛୋଟମୋଟ ବଦଳ",
+       "rcshowhideminor": "ଛୋଟମୋଟ ବଦଳ $1",
        "rcshowhideminor-show": "ଦେଖାଇବେ",
        "rcshowhideminor-hide": "ଲୁଚାଇବେ",
-       "rcshowhidebots": "$1 ଜଣ ବଟ",
+       "rcshowhidebots": "ସ୍ୱୟଂଚାଳକ&nbsp;(Bot)&nbsp;ଦ୍ୱାରା&nbsp;ସମ୍ପାଦନା $1",
        "rcshowhidebots-show": "ଦେଖାଇବେ",
        "rcshowhidebots-hide": "ଲୁଚାଇବେ",
-       "rcshowhideliu": "$1 ଜଣ ନାଆଁ ଲେଖାଇଥିବା ବ୍ୟବହାରକାରୀ",
+       "rcshowhideliu": "ପଞ୍ଜୀକୃତ ସଭ୍ୟ $1",
        "rcshowhideliu-show": "ଦେଖାଇବେ",
        "rcshowhideliu-hide": "ଲୁଚାଇବେ",
-       "rcshowhideanons": "$1 ଜଣ ବେନାମି ସଭ୍ୟ",
+       "rcshowhideanons": "ବେନାମି ସଭ୍ୟ $1",
        "rcshowhideanons-show": "ଦେଖାଇବେ",
        "rcshowhideanons-hide": "ଲୁଚାଇବେ",
-       "rcshowhidepatr": "$1ଟି ଜଗାହୋଇଥିବା ବଦଳ",
+       "rcshowhidepatr": "ପରିକ୍ଷୀତ ବଦଳ $1",
        "rcshowhidepatr-show": "ଦେଖାଇବେ",
        "rcshowhidepatr-hide": "ଲୁଚାଇବେ",
-       "rcshowhidemine": "$1 ମୁଁ କରିଥିବା ବଦଳ",
+       "rcshowhidemine": "ମୋର ସମ୍ପାଦନା $1",
        "rcshowhidemine-show": "ଦେଖାଇବେ",
        "rcshowhidemine-hide": "ଲୁଚାଇବେ",
        "rclinks": "ଗଲା $2 ଦିନର $1 ବଦଳଗୁଡ଼ିକୁ ଦେଖାଇବେ<br />$3",
        "rc-enhanced-hide": "ବେଶି କଥାସବୁ ଲୁଚାଇଦିଅ",
        "rc-old-title": "ପ୍ରକୃତରେ \"$1\" ଭାବେ ତିଆରି କରାଯାଇକଥିଲା",
        "recentchangeslinked": "ଏଇମାତ୍ର ବଦଳାଯାଇଥିବା ପୃଷ୍ଠାର ଲିଙ୍କ",
-       "recentchangeslinked-feed": "ଯà­\8bଡ଼ାଥିବା ବଦଳ",
-       "recentchangeslinked-toolbox": "ଯà­\8bଡ଼ାଥିବା ବଦଳ",
-       "recentchangeslinked-title": "\"$1\" à¬¸à¬¾à¬\81à¬\97ରà­\87 à¬\9cà­\8bଡ଼ାଥିବା ବଦଳ",
+       "recentchangeslinked-feed": "ସମà­\8dପରà­\8dà¬\95ିତ ବଦଳ",
+       "recentchangeslinked-toolbox": "ସମà­\8dପରà­\8dà¬\95ିତ ବଦଳ",
+       "recentchangeslinked-title": "\"$1\" à¬¸à¬¹ à¬¸à¬®à­\8dବନà­\8dଧିତ ବଦଳ",
        "recentchangeslinked-summary": "ଏଇଟି କିଛିସମୟ ଆଗରୁ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାରୁ ଲିଙ୍କ ହୋଇଥିବା ଆଉ ବଦଳାଯାଇଥିବା (ଅବା ଗୋଟିଏ ନିର୍ଦ୍ଦିଷ୍ଟ ଶ୍ରେଣୀର) ପୃଷ୍ଠାସବୁର ତାଲିକା ।  [[Special:Watchlist|ମୋର ଦେଖାତାଲିକା]]ର ପୃଷ୍ଠା ସବୁ '''ବୋଲଡ଼'''।",
        "recentchangeslinked-page": "ଫରଦର ନାଆଁ",
-       "recentchangeslinked-to": "ଦିà¬\86ଯାà¬\87ଥିବା à¬«à¬°à¬¦à¬°à­\87 à¬¯à­\8bଡ଼ା à¬¬à¬¾à¬\95ି à¬«à¬°à¬¦à¬®à¬¾à¬¨à¬\99à­\8dà¬\95ର à¬¬à¬¦à¬³ à¬¸à¬¬à­\81 à¬¦à­\87à¬\96ାନà­\8dତà­\81 à¥¤",
+       "recentchangeslinked-to": "à¬\8fହାର à¬¬à¬¦à¬³à¬°à­\87 à¬¦à¬¿à¬\86ଯାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬¸à¬¹ à¬¯à­\8bଡ଼ା à¬¬à¬¾à¬\95ି à¬ªà­\83ଷà­\8dଠାମାନà¬\99à­\8dà¬\95ର à¬¬à¬¦à¬³à¬®à¬¾à¬¨ à¬¦à­\87à¬\96ାନà­\8dତà­\81",
        "upload": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "uploadbtn": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "reuploaddesc": "ଅପଲୋଡ଼କୁ ନାକଚ କରିବେ ଓ ଅପଲୋଡ଼ ଫର୍ମକୁ ଫେରିବେ",
        "listusers": "ବ୍ୟବହାରକାରୀଙ୍କ ତାଲିକା",
        "listusers-editsonly": "କେବଳ କିଛି ସମ୍ପାଦନା କରିଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ",
        "listusers-creationsort": "ତିଆରି ତାରିଖ ଅନୁସାରେ ସଜାଇବେ",
-       "usereditcount": "$1 à¬\9fି {{PLURAL:$1|ବଦଳ}}",
+       "usereditcount": "$1 à¬\97à­\8bà¬\9fି {{PLURAL:$1|ସମà­\8dପାଦନା|ସମà­\8dପାଦନା}}",
        "usercreated": "$1 ତାରିଖ ଦିନ $2 ବେଳେ {{GENDER:$3|ତିଆରି କରାଗଲା}}",
        "newpages": "ନୂଆ ପୃଷ୍ଠା",
        "newpages-username": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:",
        "log-title-wildcard": "ଏହି ଲେଖାରେ ଆରମ୍ଭ ହୋଇଥିବା ଶିରୋନାମାସବୁ ଖୋଜିବେ",
        "showhideselectedlogentries": "ବାଛିଥିବା ତାଲିକାକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ",
        "allpages": "ସବୁ ପୃଷ୍ଠା",
-       "alphaindexline": "$1 ରୁ $2",
        "nextpage": "ପର ପୃଷ୍ଠା ($1)",
        "prevpage": "ଆଗ ପୃଷ୍ଠା ($1)",
        "allpagesfrom": "ଏହି ନାଆଁରେ ଆରମ୍ଭ ହେଉଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଦେଖାଇବେ:",
        "blockip": "ସଭ୍ୟଙ୍କୁ ଅଟକାଇବେ",
        "blockip-legend": "ସଭ୍ୟଙ୍କୁ ବାସନ୍ଦ କରିବେ",
        "blockiptext": "ଏକ ନିର୍ଦିଷ୍ଟ IP ଠିକଣା ବା ବ୍ୟବହାରକାରୀଙ୍କ ଲେଖିବା ସୁବିଧାକୁ ବାରାଁ କରିବା ନିମନ୍ତେ ଏହି ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରନ୍ତୁ ।\nଏହା କେବଳ ଅପବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ କରାଯାଇଥାଏ, ଏହା [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ କରାଯାଇଥାଏ ।\nଏହା ତଳେ ଏକ ନିର୍ଦିଷ୍ଟ କାରଣ ଦିଅନ୍ତୁ (ଯଥା, ଯେଉଁସବୁ ପୃଷ୍ଠାରେ କିଛି ପ୍ରକାରର ଅପବ୍ୟବହାର କରାଯାଇଛି) ।",
-       "ipadressorusername": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
+       "ipaddressorusername": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
        "ipbexpiry": "ମିଆଦ:",
        "ipbreason": "କାରଣ:",
        "ipbreason-dropdown": "*ସାଧାରଣ ଅଟକ କାରଣ\n** ଭୁଲ ବିବରଣୀ ଦେବା\n** ପୃଷ୍ଠାରୁ ବିବରଣୀ କାଢିବା\n** ଅନନୁମୋଦିତ ବାହାର ସାଇଟର ଲିଙ୍କ ସ୍ପାମ କରିବା\n** ଅଯଥା କଥା ପୃଷ୍ଠାରେ ପୁରାଇବା\n** ଧମକାଣି/ଅପମାନ\n** ଏକାଧିକ ଖାତାରେ ଅସଦାଆଚରଣ\n** ଗ୍ରହଣ ଅଯୋଗ୍ୟ ଇଉଜର ନାମ",
        "tooltip-n-mainpage-description": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "tooltip-n-portal": "ଏହି ପ୍ରକଳ୍ପଟିରେ ଖୋଜା ଖୋଜି ପାଇଁ ଆପଣ କେମିତି ସାହାଯ୍ୟ କରିପାରିବେ",
        "tooltip-n-currentevents": "ନଗଦ କାମର ପଛପଟେ ଚାଲିଥିବା କାମର ତଥ୍ୟ",
-       "tooltip-n-recentchanges": "ୱିà¬\95ିରà­\87 à¬\8fହିମାତà­\8dର à¬\95ରାଯାà¬\87ଥିବା à¬\85ଦଳ à¬¬à¬¦à¬³",
+       "tooltip-n-recentchanges": "à¬\89à¬\87à¬\95ିରà­\87 à¬¹à­\8bà¬\87ଥିବା à¬¨à¬\97ଦ à¬¬à¬¦à¬³à¬° à¬¤à¬¾à¬²à¬¿à¬\95ା",
        "tooltip-n-randompage": "ଯାହିତାହି ପୃଷ୍ଠାଟିଏ ଖୋଲ",
        "tooltip-n-help": "ଖୋଜି ପାଇବା ଭଳି ଜାଗା",
        "tooltip-t-whatlinkshere": "ଏଠାରେ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା",
        "tooltip-ca-nstab-template": "ଟେମ୍ପଲେଟଟି ଦେଖିବା",
        "tooltip-ca-nstab-help": "ସହାଯୋଗ ପୃଷ୍ଠାଟି ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-category": "ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିକୁ ଦେଖାଇବେ",
-       "tooltip-minoredit": "à¬\8fହାà¬\95à­\81 à¬\8fà¬\95 à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³ ଭାବେ ଗଣିବେ",
+       "tooltip-minoredit": "à¬\8fହାà¬\95à­\81 à¬\8fà¬\95 à¬¸à¬¾à¬®à¬¾à¬¨à­\8dà­\9f à¬¸à¬®à­\8dପାଦନା ଭାବେ ଗଣିବେ",
        "tooltip-save": "ବଦଳଗୁଡ଼ିକ ସାଇତିବେ",
-       "tooltip-preview": "ସାà¬\87ତିବା à¬\86à¬\97ରà­\81 à¬\95ରିଥିବା à¬¬à¬¦à¬³ ପରଖିନିଅନ୍ତୁ!",
+       "tooltip-preview": "ସାà¬\87ତିବା à¬\86à¬\97ରà­\81 à¬¨à¬¿à¬\9cର à¬¸à¬®à­\8dପାଦନା ପରଖିନିଅନ୍ତୁ!",
        "tooltip-diff": "ଏହି ଲେଖାରେ ଆପଣ କରିଥିବା ବଦଳଗୁଡିକୁ ଦେଖନ୍ତୁ ।",
        "tooltip-compareselectedversions": "ଏହି ଫରଦର ଦୁଇଟି ବଛାଯାଇଥିବା ସଁକଳନକୁ ତଉଲିବା",
        "tooltip-watch": "ଆପଣଙ୍କ ଦେଖାତାଲିକାରେ ଏଇ ପୃଷ୍ଠାଟି ମିଶାଇବେ",
        "tooltip-recreate": "ଏହି ପୃଷ୍ଠାଟି ଲିଭାଇଦିଆଯାଇଥିଲେ ବି ଆଉଥରେ ତିଆରି କରନ୍ତୁ",
        "tooltip-upload": "ଅପଲୋଡ଼ କରନ୍ତୁ",
        "tooltip-rollback": "\"ଫେରିବା\" ଏହି ଫରଦରେ ଶେଷ ଦାତାଙ୍କ ଦେଇ କରାଯାଇଥିବା ସବୁଯାକ ବଦଳକୁ  ଏକାଥରକରେ ପଛକୁ ଫେରାଇଦେବ",
-       "tooltip-undo": "\"à¬\95ରନାହିà¬\81\" à¬\86à¬\97ରà­\81 à¬\95ରାଯାà¬\87ଥିବା à¬¬à¬¦à¬³à¬\9fିà¬\95à­\81 à¬ªà¬\9bà¬\95à­\81 à¬²à­\87à¬\89à¬\9fାà¬\87ଦିà¬\8f à¬\86à¬\89 à¬¬à¬¦à¬³ à¬«à¬°à¬®à¬\9fିà¬\95à­\81 à¬¦à­\87à¬\96ଣା à¬­à¬¾à¬¬à¬°à­\87 à¬\96à­\8bଲà­\87 à¥¤ à¬\8fହା à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬¸à¬¾à¬°à¬\95ଥାରà­\87 à¬\97à­\8bà¬\9fିà¬\8f à¬\95ାରଣ à¬²à­\87à¬\96ିବାà¬\95à­\81 à¬\85ନà­\81ମତି ଦିଏ ।",
+       "tooltip-undo": "\"à¬\95ରନାହିà¬\81\" à¬¦à¬¬à¬¾à¬\87ଲà­\87 à¬\86à¬\97ରà­\81 à¬¹à­\8bà¬\87ଥିବା à¬¸à¬®à­\8dପାଦନାà¬\9fିà¬\8f à¬ªà¬\9bà¬\95à­\81 à¬²à­\87à¬\89à¬\9fିଯାà¬\8f à¬\93 à¬¤à¬¾à¬¹à¬¾ à¬¸à¬®à­\8dପାଦନା à¬ªà­\83ଷà­\8dଠାà¬\9fିà¬\95à­\81 '''ଦà­\87à¬\96ଣା''' à¬­à¬¾à¬¬à­\87 à¬\96à­\8bଲà­\87 à¥¤ à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fହା à¬¸à¬¾à¬°à¬\95ଥାରà­\87 à¬\95ାରଣà¬\9fିà¬\8f à¬²à­\87à¬\96ିବାର à¬¸à­\81ଯà­\8bà¬\97 ଦିଏ ।",
        "tooltip-preferences-save": "ଆପଣା ପସନ୍ଦ ସାଇତିବେ",
        "tooltip-summary": "ଛୋଟ ସାରକଥାଟିଏ ଦିଅନ୍ତୁ",
        "anonymous": "{{SITENAME}}ର ଅଜଣା {{PLURAL:$1|ଜଣ ବ୍ୟବହାରକାରୀ |ଜଣ ବ୍ୟବହାରକାରୀଗଣ}}",
        "newimages-summary": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଶେଷ ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲମାନ ଦେଖାଇଥାଏ ।",
        "newimages-legend": "ଛାଣିବା",
        "newimages-label": "ଫାଇଲ ନାମ (କିମ୍ବା ତାହାର ଏକ ଭାଗ):",
-       "showhidebots": "($1 ଜଣ ବଟ)",
        "noimages": "ଦେଖିବାକୁ କିଛି ନାହିଁ ।",
        "ilsubmit": "ଖୋଜିବା",
        "bydate": "ତାରିଖ ଅନୁସାରେ",
index dcaf88f..3746ad8 100644 (file)
        "unblock": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਲੱਗੀ ਪਾਬੰਦੀ ਹਟਾਓ",
        "blockip": "ਵਰਤੋਂਕਾਰ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "blockip-legend": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
-       "ipadressorusername": "IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:",
+       "ipaddressorusername": "IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:",
        "ipbexpiry": "ਮਿਆਦ:",
        "ipbreason": "ਕਾਰਨ:",
        "ipbcreateaccount": "ਖਾਤਾ ਬਣਾਉਣ 'ਤੇ ਰੋਕ ਲਾਓ",
index 5fe41dd..9b49369 100644 (file)
        "blockip": "Sabatan ya ing talagamit",
        "blockip-legend": "Sabatan ya ing talagamit",
        "blockiptext": "Gamitan me ing form king lalam ba yang sabatan king pamaglub\ning particular a IP address o lagyu ning talagamit (username).\nMalyari mung gawan iti bang milisya king pamanyira (vandalism),\nat agpang king [[{{MediaWiki:Policy-url}}|patakaran]].\nIsulat me ing particular a sangkan king lalam (alimbawa, sabyan\nmu nung sanu retang bulung a sinira da).",
-       "ipadressorusername": "IP Address o lagyungtalagamit (username):",
+       "ipaddressorusername": "IP Address o lagyungtalagamit (username):",
        "ipbexpiry": "Mayari:",
        "ipbreason": "Sangkan:",
        "ipbreason-dropdown": "*Keraklan a sangkan king pamaniabat\n** Mangibiling e tutung impormasiun\n** Maglakong laman kareng bulung\n** Maniuglung spam\n** Manyingit alang kabaldugan a sulat o e dapat misulat kareng bulung\n** Mamatakut o maniaul\n** Mamabusu kareng dakal a account\n** E katanggap-tanggap a lagyungtalagamit (username)",
        "newimages": "Pirinan kareng bayung simpan (new files)",
        "imagelisttext": "Ing makatuki tala yang '''$1''' {{PLURAL:$1|simpan|simpan}} a misamasan $2.",
        "newimages-summary": "Ining bulung a makabukud papakit no reng simpan (file) a tauling milulan.",
-       "showhidebots": "($1 bot)",
        "noimages": "Ala kang akit.",
        "ilsubmit": "Manintun",
        "bydate": "agpang keng aldo",
index 9e2c860..f71ff3b 100644 (file)
        "logdelete-selected": "Zaznaczone {{PLURAL:$1|zdarzenie|zdarzenia}} z rejestru:",
        "revdelete-text-text": "Usunięte wersje będą nadal widoczne w historii strony, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
        "revdelete-text-file": "Usunięte wersje pliku będą nadal widoczne w historii pliku, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "logdelete-text": "Usunięte wpisy rejestru nadal będą widoczne w rejestrze, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "revdelete-text-others": "Pozostali administratorzy {{grammar:genitive|{{SITENAME}}}} nadal będą posiadali dostęp do ukrytej treści i będą w stanie odtworzyć ją ponownie za pomocą tego samego interfejsu, jeśli nie zostaną ustawione dodatkowe ograniczenia.",
        "revdelete-confirm": "Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.",
        "revdelete-suppress-text": "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji:\n* Informacji, która może być zniesławieniem\n* Ujawnienie danych osobowych\n*: ''adres domowy, numer telefonu, numer PESEL itp''",
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "right-move": "Przenoszenie stron",
        "right-move-subpages": "Przenoszenie stron razem z ich podstronami",
        "right-move-rootuserpages": "Przenoszenie stron użytkowników",
+       "right-move-categorypages": "Przenoszenie stron kategorii",
        "right-movefile": "Przenoszenie plików",
        "right-suppressredirect": "Przenoszenie stron bez tworzenia przekierowania w miejscu starej nazwy",
        "right-upload": "Przesyłanie plików na serwer",
        "action-createpage": "tworzenia stron",
        "action-createtalk": "tworzenia stron dyskusji",
        "action-createaccount": "utworzenia tego konta użytkownika",
+       "action-history": "przeglądania historii tej strony",
        "action-minoredit": "do oznaczenia tej edycji jako drobna zmiana",
        "action-move": "przeniesienia tej strony",
        "action-move-subpages": "przeniesienia tej strony oraz jej podstron",
        "action-move-rootuserpages": "przenoszenia stron użytkowników (bez podstron)",
+       "action-move-categorypages": "przenoszenia stron kategorii",
        "action-movefile": "przeniesienia tego pliku",
        "action-upload": "przesłania tego pliku",
        "action-reupload": "nadpisania tego pliku",
        "upload-disallowed-here": "Nie możesz nadpisać tego pliku.",
        "filerevert": "Przywracanie $1",
        "filerevert-legend": "Przywracanie poprzedniej wersji pliku",
-       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [wersji $4 z $3, $2].",
+       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [$4 wersji z $3, $2].",
        "filerevert-comment": "Powód",
        "filerevert-defaultcomment": "Przywrócono wersję z $2, $1",
        "filerevert-submit": "Przywróć",
-       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [wersji $4 z $3, $2].",
+       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
        "filedelete": "Usuwanie „$1”",
        "filedelete-legend": "Usuń plik",
        "pageswithprop-prophidden-binary": "binarna wartość własności ukryta ($1)",
        "doubleredirects": "Podwójne przekierowania",
        "doubleredirectstext": "Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.\nKażdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.\n<del>Skreślenie</del> oznacza naprawienie przekierowania.",
-       "double-redirect-fixed-move": "Naprawa podwójnego przekierowania [[$1]] → [[$2]]",
+       "double-redirect-fixed-move": "Strona [[$1]] została przeniesiona. Przekierowanie wskazujące na stary tytuł zostało automatycznie zaktualizowane i przekierowuje teraz na stronę [[$2]].",
        "double-redirect-fixed-maintenance": "Automatyczna naprawa podwójnego przekierowania podczas prac konserwacyjnych z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Naprawiacz przekierowań",
        "brokenredirects": "Zerwane przekierowania",
        "log-title-wildcard": "Szukaj tytułów zaczynających się od tego tekstu",
        "showhideselectedlogentries": "Pokaż/ukryj zaznaczone wpisy rejestru",
        "allpages": "Wszystkie strony",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Następna strona ($1)",
        "prevpage": "Poprzednia strona ($1)",
        "allpagesfrom": "Strony o tytułach rozpoczynających się od",
        "listgrouprights-namespaceprotection-namespace": "Przestrzeń nazw",
        "listgrouprights-namespaceprotection-restrictedto": "Uprawnienia pozwalające użytkownikom na edytowanie",
        "trackingcategories": "Śledzenie kategorii",
+       "trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
        "trackingcategories-msg": "Śledzenie kategorii",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).",
        "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
        "trackingcategories-nodesc": "Opis nie jest dostępny.",
        "trackingcategories-disabled": "Kategoria jest wyłączona",
        "blockip": "Zablokuj użytkownika",
        "blockip-legend": "Zablokuj użytkownika",
        "blockiptext": "Użyj poniższego formularza do zablokowania możliwości edycji spod określonego adresu IP lub konkretnemu użytkownikowi.\nBlokować należy jedynie po to, by zapobiec wandalizmom, zgodnie z [[{{MediaWiki:Policy-url}}|przyjętymi zasadami]].\nPodaj powód (np. umieszczając nazwy stron, na których dopuszczono się wandalizmu).",
-       "ipadressorusername": "Adres IP lub nazwa użytkownika",
+       "ipaddressorusername": "Adres IP lub nazwa użytkownika",
        "ipbexpiry": "Upływa",
        "ipbreason": "Powód",
        "ipbreason-dropdown": "*Najczęstsze przyczyny blokad\n** Ataki na innych użytkowników\n** Naruszenie praw autorskich\n** Niedozwolona nazwa użytkownika\n** Open proxy lub Tor\n** Spamowanie\n** Usuwanie treści stron\n** Wprowadzanie fałszywych informacji\n** Wulgaryzmy\n** Wypisywanie bzdur na stronach",
        "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
        "movearticle": "Przeniesienie strony",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
+       "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę opisu kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "movenotallowed": "Nie masz uprawnień do przenoszenia stron.",
        "movenotallowedfile": "Nie masz uprawnień do przenoszenia plików.",
        "cant-move-user-page": "Nie masz uprawnień do przenoszenia stron użytkowników (za wyjątkiem podstron).",
        "cant-move-to-user-page": "Nie masz uprawnień do przenoszenia strony do strony użytkownika (za wyjątkiem podstron użytkownika).",
+       "cant-move-category-page": "Nie masz uprawnień do przenoszenia stron kategorii.",
+       "cant-move-to-category-page": "Nie masz uprawnień do przenoszenia strony do strony kategorii.",
        "newtitle": "Nowy tytuł",
        "move-watch": "Obserwuj",
        "movepagebtn": "Przenieś stronę",
        "newimages-summary": "Na tej stronie specjalnej prezentowane są ostatnio przesłane pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment)",
-       "showhidebots": "($1 boty)",
        "noimages": "Brak plików do pokazania.",
        "ilsubmit": "Szukaj",
        "bydate": "według daty",
        "htmlform-no": "Nie",
        "htmlform-yes": "Tak",
        "htmlform-chosen-placeholder": "Wybierz opcję",
+       "htmlform-cloner-create": "Dodaj więcej",
        "htmlform-cloner-delete": "Usuń",
+       "htmlform-cloner-required": "Wymagana jest co najmniej jedna wartość.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
index a007b7f..64e3008 100644 (file)
        "blockip": "Bloché l'utent",
        "blockip-legend": "Bloché l'utent",
        "blockiptext": "Che a deuvra ël mòdulo ëd domanda 'd blocagi ambelessì sota për bloché l'acess con drit dë scritura da chèich adrëssa IP o stranòm.<br />\nËs blocagi-sì as dev dovresse MACH për evité dij comportament vandàlich, ën strèita osservansa ëd tùit ij prinsipi dle [[{{MediaWiki:Policy-url}}|régole ëd {{SITENAME}}]].<br />\nËl blocagi a peul ën gnun-a manera esse dovrà për dle question d'ideologìa.\n\nChe a scriva codì che st'adrëssa IP o së stranòm a dev second chiel esse blocà (pr'esempi, che a buta ij tìtoj ëd pàgine che a l'abio già patì dj'at vandàlich da cost'adrëssa IP o së stranòm).",
-       "ipadressorusername": "Adrëssa IP ò stranòm",
+       "ipaddressorusername": "Adrëssa IP ò stranòm",
        "ipbexpiry": "Fin-a al",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Motiv sòlit për ij blocagi\n** Avej butà d'anformassion fàosse\n** Avej gavà dël contnù da 'nt le pàgine\n** Avèj butà dla rumenta porcherìa coma anliure d'areclam\n** Avèj butà test sensa sust ant le pàgine\n** Avèj un deuit da bërsach con la gent\n** Avèj dovrà vàire cont fòra dij deuit\n** Stranòm ch'as peul nen acetesse",
        "newimages-summary": "Sta pàgina special-sì a la smon j'ùltim archivi carià.",
        "newimages-legend": "Filtror",
        "newimages-label": "Nòm ëd l'archivi (o na soa part):",
-       "showhidebots": "($1 trigomiro)",
        "noimages": "Pa gnente da vëdde.",
        "ilsubmit": "Arserché",
        "bydate": "për data",
index a47a0e0..941ef81 100644 (file)
        "blockip": "اس ورتن والے نو روکو",
        "blockip-legend": "ورتن آلے نوں روکو",
        "blockiptext": "تھلے دتا گیا فارم ورتو کسے خاص آئی پی پتے یا ورتن ناں  نوں لکھن روک لئی۔ ایہ صرف ونڈالزم توں بچن لئی اے، تے [[{{MediaWiki:Policy-url}}|policy]] دے نال اے۔ \nتھلے خاص وجہاں دسو (ادھارن لئی خاص صفیاں دی دس دیو جیہڑے خراب کیتے گۓ۔)",
-       "ipadressorusername": "آئی پی پتہ یا ورتن آلے دا ناں:",
+       "ipaddressorusername": "آئی پی پتہ یا ورتن آلے دا ناں:",
        "ipbexpiry": "انت:",
        "ipbreason": "وجہ:",
        "ipbreason-dropdown": "*روکن دیاں عام وجہاں\n** غلط جانکاری دینا\n** صفیاں توں مواد مٹانا\n** بارلیاں ویب سائٹاں نال غلط جوڑ جوڑنا\n** خراب / احمفانہ مواد صفیاں چ پانا\n** دوجیاں نوں ڈرانا\n** کھاتیاں نوں خراب کرنا\n** ناں منیا جان والا ورتن ناں ورتنا",
        "newimages-summary": "اے خاص صفہ آخری چڑھائیاں فائلاں دسدا اے۔",
        "newimages-legend": "فلٹر",
        "newimages-label": "ففائل ناں (یا ایدا انگ)",
-       "showhidebots": "(بوٹ $1)",
        "noimages": "ویکھن آسطے کج نئیں۔",
        "ilsubmit": "کھوجو",
        "bydate": "تریخ نال",
index 1f37a33..1212ab8 100644 (file)
        "log-title-wildcard": "هغه سرليکونه پلټل چې په دې متن پيلېږي",
        "showhideselectedlogentries": "د ټاکلو يادښتونو ښکارېدنه بدلول",
        "allpages": "ټول مخونه",
-       "alphaindexline": "$1 تر $2",
        "nextpage": "بل مخ ($1)",
        "prevpage": "تېر مخ ($1)",
        "allpagesfrom": "هغه مخونه کتل چې پېلېږي په:",
        "unblock": "کارن له بنديزه وېستل",
        "blockip": "په کارن بنديز لگول",
        "blockip-legend": "په کارن بنديز لگول",
-       "ipadressorusername": "IP پته يا کارن نوم",
+       "ipaddressorusername": "IP پته يا کارن نوم",
        "ipbexpiry": "د پای نېټه:",
        "ipbreason": "سبب:",
        "ipbreason-dropdown": "*د بنديز ټولگړي سببونه\n** د ناسمو مالوماتو خپرول\n** د مخونو د مېنځپانگې ړنگول\n** په مخونو کې د باندنيو وېبځايونو بېکاره سپام تړنې ځايول\n** په مخونو کې بې مانا/چټياټ ځايول\n** په مخونو کې ناندرۍ راپارېدنې/د تاوتريخوالي خپرېدو ته هڅول\n** د گڼ شمېر گڼونونو نه ناوړه گټه اخيستل\n** نه مننونکی کارن-نوم کارول",
        "newimages-summary": "همدا ځانگړی مخ، وروستنۍ پورته شوې دوتنې ښکاره کوي.",
        "newimages-legend": "چاڼگر",
        "newimages-label": "د دوتنې نوم (يا د دې برخه):",
-       "showhidebots": "($1 روباټ)",
        "noimages": "د کتلو لپاره څه نشته.",
        "ilsubmit": "پلټل",
        "bydate": "د نېټې له مخې",
index 924e1a6..82db03b 100644 (file)
        "log-title-wildcard": "Procurar por títulos que sejam iniciados com o seguinte texto",
        "showhideselectedlogentries": "Exibir/ocultar os itens de registros selecionados",
        "allpages": "Todas as páginas",
-       "alphaindexline": "De $1 até $2",
        "nextpage": "Próxima página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Primeira página na listagem:",
        "emailuser": "Enviar-lhe um e-mail",
        "emailuser-title-target": "Enviar e-mail para {{GENDER:$1|este usuário|esta usuária}}",
        "emailuser-title-notarget": "Enviar e-mail",
-       "emailpage": "Contactar usuário",
+       "emailpage": "Enviar e-mail ao usuário",
        "emailpagetext": "Você pode usar o formulário a seguir para enviar um e-mail para {{GENDER:$1|este usuário|esta usuária}}.\nO endereço de e-mail que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, com o destinatário podendo responder diretamente para você.",
        "defemailsubject": "E-mail do usuário \"$1\" da {{SITENAME}}",
        "usermaildisabled": "O e-mail do usuário foi desativado",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"contactar usuário\" da {{SITENAME}}.",
+       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"enviar e-mail ao usuário\" da {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "blockip": "Bloquear usuário",
        "blockip-legend": "Bloquear usuário",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário.\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).",
-       "ipadressorusername": "Endereço de IP ou nome de usuário:",
+       "ipaddressorusername": "Endereço de IP ou nome de usuário:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserindo informações falsas\n** Removendo o conteúdo de páginas\n** Fazendo \"spam\" de sítios externos\n** Inserindo conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de usuário inaceitável",
        "blockipsuccesssub": "Bloqueio bem sucedido",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]].",
        "ipb-blockingself": "Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?",
-       "ipb-confirmhideuser": "Você está prestes a bloquear um utilizador com \"Ocultar nome de utilizador/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
+       "ipb-confirmhideuser": "Você está prestes a bloquear um usuário com \"Ocultar nome de usuário/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
        "ipb-confirmaction": "Se você tem certeza que realmente quer fazer isto, por favor verifique o campo \"{{int:ipb-confirm}}\" no final.",
        "ipb-edit-dropdown": "Editar motivos de bloqueio",
        "ipb-unblock-addr": "Desbloquear $1",
        "modern.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */",
        "vector.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */",
        "anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
-       "siteuser": "{{GENDER:$2|um utilizador|uma utilizadora|um utilizador}} da {{SITENAME}} ($1)",
+       "siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
        "anonuser": "usuário anônimo $1 da {{SITENAME}}",
        "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
-       "showhidebots": "($1 robôs)",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "compare-revision-not-exists": "A revisão que você especificou não existe.",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
-       "dberr-info": "(Não foi possível contactar o servidor de base de dados: $1)",
+       "dberr-info": "(Não foi possível contatar o servidor de base de dados: $1)",
        "dberr-info-hidden": "(Não foi possível contatar o banco de dados do servidor)",
        "dberr-usegoogle": "Você pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
index 35fa6d6..24dfaf4 100644 (file)
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "returnto": "Voltar para $1.",
-       "tagline": "Da {{SITENAME}}",
+       "tagline": "De {{SITENAME}}",
        "help": "Ajuda",
        "search": "Pesquisa",
        "searchbutton": "Pesquisar",
        "viewhelppage": "Ver página de ajuda",
        "categorypage": "Ver página da categoria",
        "viewtalkpage": "Ver discussão",
-       "otherlanguages": "Noutras línguas",
+       "otherlanguages": "Noutros idiomas",
        "redirectedfrom": "(Redireccionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
        "nosuchaction": "Operação não existe",
-       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido um link incorreto.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
+       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "nospecialpagetext": "<strong>Solicitou uma página especial inválida.</strong>\n\nEncontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erro",
        "readonly": "Base de dados bloqueada (limitada a leituras)",
        "enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
        "readonlytext": "A base de dados está bloqueada para impedir a inserção e modificação de dados, provavelmente para uma manutenção de rotina, após a qual a situação será normalizada.\n\nO administrador que a bloqueou deu a seguinte explicação: $1",
-       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar um link para diferenças desatualizado ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
+       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar numa ligação para diferenças desatualizada ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
        "missingarticle-rev": "(revisão#: $1)",
        "missingarticle-diff": "(Dif.: $1, $2)",
        "readonly_lag": "A base de dados foi automaticamente bloqueada enquanto os servidores secundários se sincronizam com o primário",
        "delete-hook-aborted": "A eliminação foi cancelada por um \"hook\".\nNão foi dada nenhuma explicação.",
        "no-null-revision": "Não foi possível criar uma nova revisão nula para a página \"$1\"",
        "badtitle": "Título inválido",
-       "badtitletext": "O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
+       "badtitletext": "O título de página solicitado era inválido, vazio, ou a ligação interlínguas estava incorreta.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
        "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
        "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. No máximo {{PLURAL:$4|um resultado está disponível|$4 resultados estão disponíveis}} na ''cache''.",
        "querypage-no-updates": "As atualizações estão presentemente desativadas para esta página.\nPor enquanto, os dados aqui presentes não poderão ser atualizados.",
        "passwordremindertitle": "Nova palavra-chave temporária na {{SITENAME}}",
        "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-chave temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-chave nova.\nA palavra-chave temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-chave e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-chave antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
-       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido",
+       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
        "passwordsent": "Foi enviada uma palavra-chave nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a autenticar-se após recebê-la, por favor.",
        "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.",
        "eauthentsent": "Foi enviada uma mensagem de confirmação para o endereço de correio eletrónico que especificou.\nAntes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.",
        "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-chave.",
        "changeemail-no-info": "Tem de autenticar-se para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
-       "changeemail-newemail": "Correio eletrónico novo:",
+       "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua senha na wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "bold_tip": "Texto a negrito",
        "italic_sample": "Texto em itálico",
        "italic_tip": "Texto em itálico",
-       "link_sample": "Título do link",
-       "link_tip": "Link interno",
-       "extlink_sample": "http://www.example.com link externo",
-       "extlink_tip": "Link externo (lembre-se do prefixo http://)",
+       "link_sample": "Título da ligação",
+       "link_tip": "Ligação interna",
+       "extlink_sample": "http://www.example.com ligação externa",
+       "extlink_tip": "Ligação externa (lembre-se do prefixo http://)",
        "headline_sample": "Texto do cabeçalho",
        "headline_tip": "Seção de nível 2",
        "nowiki_sample": "Inserir texto não-formatado aqui",
        "image_sample": "Exemplo.jpg",
        "image_tip": "Ficheiro incorporado",
        "media_sample": "Exemplo.ogg",
-       "media_tip": "Link para ficheiro",
+       "media_tip": "Ligação para ficheiro",
        "sig_tip": "A sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (utilize moderadamente)",
        "summary": "Resumo:",
        "accmailtitle": "Palavra-chave enviada.",
        "accmailtext": "Uma palavra-chave gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.",
        "newarticle": "(Nova)",
-       "newarticletext": "Seguiu um link para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
+       "newarticletext": "Seguiu uma ligação para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu navegador.",
        "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
        "noarticletext": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.",
-       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
        "sectioneditnotsupported-title": "Edição de seções não é suportada",
        "sectioneditnotsupported-text": "A edição de seções não é suportada nesta página de edição.",
-       "permissionserrors": "Erros de permissões",
+       "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "post-expand-template-argument-category": "Páginas com omissão de argumentos para predefinições",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
        "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
-       "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
+       "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "node-count-exceeded-warning": "A página excedeu o total de nós",
        "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
        "mergehistory-from": "Página de origem:",
        "mergehistory-into": "Página de destino:",
        "mergehistory-list": "Histórico de edições fundíveis",
-       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar os links de navegação, os botões de opção voltarão aos valores originais.",
+       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar as ligações de navegação, os botões de opção voltarão aos valores originais.",
        "mergehistory-go": "Mostrar edições que podem ser fundidas",
        "mergehistory-submit": "Fundir edições",
        "mergehistory-empty": "Não existem revisões fundíveis.",
        "diff-multi-sameuser": "(Há {{PLURAL:$1|uma edição intermédia|$1 edições intermédias}} do mesmo utilizador que não estão a ser apresentadas)",
        "diff-multi-otherusers": "(Há {{PLURAL:$1|uma revisão intermédia|$1 revisões intermédias}} de {{PLURAL:$2|outro utilizador|$2 utilizadores}} que não {{PLURAL:$1|está a ser apresentada|estão a ser apresentadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})",
-       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
        "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Links para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se elas ocuparem menos de (bytes):",
+       "stub-threshold": "Ligações para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se ocuparem menos de (bytes):",
        "stub-threshold-disabled": "Desativado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-chave caso esqueça a antiga.",
-       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
+       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
        "email-address-validity-valid": "Parece válido",
        "email-address-validity-invalid": "Endereço válido necessário!",
-       "userrights": "Privilégios dos utilizadores",
+       "userrights": "Gestão de privilégios do utilizador",
        "userrights-lookup-user": "Gerir grupos de utilizadores",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "editusergroup": "Editar grupos do utilizador",
        "right-move": "Mover páginas",
        "right-move-subpages": "Mover páginas com as suas subpáginas",
        "right-move-rootuserpages": "Mover páginas raiz de utilizadores",
+       "right-move-categorypages": "Mover categorias",
        "right-movefile": "Mover ficheiros",
        "right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
        "right-upload": "Carregar ficheiros",
        "action-createpage": "criar páginas",
        "action-createtalk": "criar páginas de discussão",
        "action-createaccount": "criar esta conta de utilizador",
+       "action-history": "ver histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
        "action-move-subpages": "mover esta página e as respectivas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de utilizadores",
+       "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload": "enviar este ficheiro",
        "action-reupload": "sobrepor este ficheiro existente",
        "recentchangeslinked-feed": "Alterações relacionadas",
        "recentchangeslinked-toolbox": "Alterações relacionadas",
        "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
-       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém links (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
+       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
-       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm links para esta",
+       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "upload_directory_read_only": "O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
        "uploaderror": "Erro ao carregar",
        "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
-       "uploadtext": "Utilize o formulário abaixo para fazer upload de ficheiros novos.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira um link com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link direto para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
+       "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
        "upload-permitted": "Tipos de ficheiro permitidos: $1.",
        "upload-preferred": "Tipos de ficheiro preferidos: $1.",
        "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
        "filehist-filesize": "Tamanho do ficheiro",
        "filehist-comment": "Comentário",
        "imagelinks": "Uso do ficheiro",
-       "linkstoimage": "{{PLURAL:$1|A seguinte página contém|As seguintes $1 páginas contêm}} links para este ficheiro:",
-       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém|$1 páginas contêm}} links para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
-       "nolinkstoimage": "Nenhuma página contém links para este ficheiro.",
-       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm links para este ficheiro.",
+       "linkstoimage": "{{PLURAL:$1|A seguinte página contém ligação|As seguintes $1 páginas contêm ligações}} para este ficheiro:",
+       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém ligação|$1 páginas contêm ligações}} para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
+       "nolinkstoimage": "Nenhuma página contém ligação para este ficheiro.",
+       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm ligações para este ficheiro.",
        "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):",
        "sharedupload": "Este ficheiro provém de $1 e pode ser usado por outros projetos.",
        "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja suas versões mais recentes são duplicatas da versão mais recente de outros ficheiros. Somente os ficheiros locais são considerados.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] possui [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
        "unusedtemplates": "Predefinições não utilizadas",
-       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outros links para as predefinições, antes de eliminá-las.",
-       "unusedtemplateswlh": "outros links",
+       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
+       "unusedtemplateswlh": "outras ligações",
        "randompage": "Página aleatória",
        "randompage-nopages": "Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.",
        "randomincategory": "Página aleatória na categoria",
        "pageswithprop-prophidden-long": "foi ocultado o valor da propriedade por ser um texto muito longo ($1)",
        "pageswithprop-prophidden-binary": "foi ocultado o valor da propriedade por ser binário ($1)",
        "doubleredirects": "Redirecionamentos duplos",
-       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém links para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
+       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém ligações para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
        "double-redirect-fixed-move": "[[$1]] foi movida.\nEla foi actualizada automaticamente e agora redirecciona para [[$2]].",
        "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]], em um trabalho de manutenção.",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
-       "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
+       "brokenredirectstext": "Os seguintes redirecionamentos contêm ligações para páginas inexistentes:",
        "brokenredirects-edit": "editar",
        "brokenredirects-delete": "eliminar",
-       "withoutinterwiki": "Páginas sem links interlínguas",
-       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutras línguas.",
+       "withoutinterwiki": "Páginas sem ligações interlínguas",
+       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutros idiomas.",
        "withoutinterwiki-legend": "Prefixo",
        "withoutinterwiki-submit": "Mostrar",
        "fewestrevisions": "Páginas com menos revisões",
        "ntransclusions": "usada {{PLURAL:$1|numa página|em $1 páginas}}",
        "specialpage-empty": "Não existem dados para apresentar.",
        "lonelypages": "Páginas órfãs",
-       "lonelypagestext": "As seguintes páginas não são destino de links nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
+       "lonelypagestext": "As seguintes páginas não são destino de ligação nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
        "uncategorizedpages": "Páginas não categorizadas",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "deadendpages": "Páginas sem saída",
-       "deadendpagestext": "As seguintes páginas não contêm links para outras páginas na {{SITENAME}}.",
+       "deadendpagestext": "As seguintes páginas não contêm ligações para outras páginas em {{SITENAME}}.",
        "protectedpages": "Páginas protegidas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
-       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sites na internet podem ter links para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
+       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sítios na Internet podem ter ligação para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
        "unusedcategoriestext": "As seguintes categorias existem, embora nenhuma página ou categoria faça uso delas.",
        "notargettitle": "Sem alvo",
        "notargettext": "Especifique sobre que página alvo ou utilizador pretende executar esta função.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-go": "Prosseguir",
-       "booksources-text": "É apresentada abaixo uma lista de links para outros sites na internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
+       "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Alvo (página ou utilizador):",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "allpages": "Todas as páginas",
-       "alphaindexline": "$1 até $2",
        "nextpage": "Página seguinte ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Apresentar páginas desde:",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Prosseguir",
        "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).",
-       "linksearch-line": "Link para $1 na página $2",
+       "linksearch-line": "Ligação para $1 na página $2",
        "linksearch-error": "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar utilizadores começando por:",
        "listusers-submit": "Mostrar",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão",
+       "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde o estatuto é permitido.",
        "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desactivada.",
        "mailnologin": "Não existe endereço de envio",
        "undeleterevdel": "O restauro não será efetuado se resulta na remoção parcial da versão mais recente da página ou ficheiro.\nNestes casos, deverá desmarcar ou revelar a versão eliminada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no sumário abaixo, junto dos detalhes do utilizador que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
-       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado um link incorreto ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
+       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado uma ligação incorreta ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "gestão de privilégios de utilizador",
+       "sp-contributions-userrights": "gestão de privilégios do utilizador",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
-       "whatlinkshere-title": "Páginas que têm links para \"$1\"",
+       "whatlinkshere-title": "Páginas que têm ligações para \"$1\"",
        "whatlinkshere-page": "Página:",
        "linkshere": "As seguintes páginas têm ligação a '''[[:$1]]''':",
        "nolinkshere": "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.",
-       "nolinkshere-ns": "Não existem links para '''[[:$1]]''' no espaço nominal selecionado.",
+       "nolinkshere-ns": "Não existem ligações para '''[[:$1]]''' no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
-       "isimage": "link para o ficheiro",
+       "isimage": "ligação para ficheiro",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "whatlinkshere-next": "{{PLURAL:$1|próximo|próximos $1}}",
-       "whatlinkshere-links": "← links",
+       "whatlinkshere-links": "← ligações",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 links",
-       "whatlinkshere-hideimages": "$1 links para ficheiros",
+       "whatlinkshere-hidelinks": "$1 ligações",
+       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "autoblockid": "Bloqueio automático nº$1",
        "block": "Bloquear utilizador",
        "blockip": "Bloquear utilizador",
        "blockip-legend": "Bloquear utilizador",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
-       "ipadressorusername": "Endereço IP ou nome de utilizador:",
+       "ipaddressorusername": "Endereço IP ou nome de utilizador:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sites externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
+       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "ipbcreateaccount": "Impedir criação de contas de utilizador",
        "ipbemailban": "Impedir utilizador de enviar correio eletrónico",
        "anononlyblock": "apenas anón.",
        "noautoblockblock": "bloqueio automático desativado",
        "createaccountblock": "criação de conta bloqueada",
-       "emailblock": "correio eletrónico bloqueado",
+       "emailblock": "correio electrónico desactivado",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "block-log-flags-anononly": "apenas utilizadores anónimos",
        "block-log-flags-nocreate": "criação de contas impossibilitada",
        "block-log-flags-noautoblock": "bloqueio automático desativado",
-       "block-log-flags-noemail": "correio eletrónico bloqueado",
+       "block-log-flags-noemail": "correio electrónico desactivado",
        "block-log-flags-nousertalk": "impossibilitado de editar a própria página de discussão",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
-       "block-log-flags-hiddenname": "nome de utilizador ocultado",
+       "block-log-flags-hiddenname": "nome de usuário ocultado",
        "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IPs está desativada.",
        "ipb_expiry_invalid": "Tempo de expiração inválido.",
        "ipb_expiry_temp": "Bloqueios com nome de utilizador ocultado devem ser permanentes.",
        "lockedbyandtime": "(por $1 em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
-       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que os links continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
-       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que os links continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
+       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
+       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que as ligações continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
        "movepagetalktext": "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''\n*já exista uma página de discussão com o novo título que não esteja vazia, ou\n*desmarque a correspondente caixa de seleção abaixo.\n\nNestes casos, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
        "movearticle": "Mover página",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
+       "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
        "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
        "movenotallowed": "Não tem permissão para mover páginas.",
        "movenotallowedfile": "Não possui permissão para mover ficheiros.",
        "cant-move-user-page": "Não tem permissão para mover páginas de utilizador (pode mover sub-páginas).",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
+       "cant-move-category-page": "Não possui permissão para mover categorias.",
+       "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
        "newtitle": "Para novo título",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "selfmove": "Os títulos de origem e destino são iguais;\nnão é possível mover uma página para ela mesma.",
        "immobile-source-namespace": "Não é possível mover páginas no espaço nominal \"$1\"",
        "immobile-target-namespace": "Não é possível mover páginas para o espaço nominal \"$1\"",
-       "immobile-target-namespace-iw": "Um link interwikis não é um destino válido para uma movimentação de página.",
+       "immobile-target-namespace-iw": "Uma ligação interlíngua não é um destino válido para uma movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.",
        "importfailed": "A importação falhou: $1",
        "importunknownsource": "Tipo da fonte de importação desconhecido",
        "importcantopen": "Não foi possível abrir o ficheiro a importar",
-       "importbadinterwiki": "Link interwikis incorrecto",
+       "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas fontes de importação transwikis e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Nenhum ficheiro de importação foi carregado.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
        "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
-       "import-error-interwiki": "A página \"$1\" não pode ser importada pois seu nome está reservado para um link externo (interwiki).",
+       "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.",
        "import-error-invalid": "A página \"$1\" não pode ser importada porque seu nome é inválido.",
        "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
        "tooltip-n-recentchanges": "A lista de mudanças recentes nesta wiki.",
        "tooltip-n-randompage": "Carregar página aleatória",
        "tooltip-n-help": "Um local reservado para auxílio.",
-       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm links para esta",
-       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém links",
+       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm ligações para esta",
+       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém ligação",
        "tooltip-feed-rss": "''Feed'' RSS desta página",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições deste utilizador",
        "tooltip-t-upload": "Upload de ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
-       "tooltip-t-permalink": "Link permanente para esta versão desta página",
+       "tooltip-t-permalink": "Ligação permanente para esta versão desta página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
+       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
        "spamprotectionmatch": "O seguinte texto activou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
-       "spam_reverting": "A reverter para a última revisão que não contém links para $1",
-       "spam_blanking": "Todas as revisões continham links para $1; a esvaziar",
-       "spam_deleting": "Todas as revisões continham links para $1; a eliminar",
+       "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
+       "spam_blanking": "Todas as revisões continham ligações para $1; a esvaziar",
+       "spam_deleting": "Todas as revisões continham ligações para $1; a eliminar",
        "simpleantispam-label": "Verificação contra spam.\n<strong>NÃO</strong> preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe, é impossível fornecer esta informação para revisões antigas.",
        "newimages-summary": "Esta página especial mostra os ficheiros mais recentemente enviados.",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de ficheiro (ou parte dele):",
-       "showhidebots": "($1 robôs)",
+       "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "saturday-at": "Sábado às $1",
        "sunday-at": "Domingo às $1",
        "yesterday-at": "Ontem às $1",
-       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outros links nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
+       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outras ligações nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
        "metadata": "Metadados",
        "metadata-help": "Este ficheiro contém informação adicional, provavelmente acrescentada pela câmara digital ou pelo digitalizador usados para criá-lo.\nCaso o ficheiro tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
        "metadata-expand": "Mostrar detalhes adicionais",
        "exif-originaldocumentid": "Identificação exclusiva do documento original",
        "exif-licenseurl": "URL da licença",
        "exif-morepermissionsurl": "Informações para licenciamento alternativo",
-       "exif-attributionurl": "Ao reutilizar esta obra, coloque um link para",
+       "exif-attributionurl": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-preferredattributionname": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-pngfilecomment": "Comentário de ficheiro PNG",
        "exif-disclaimer": "Exoneração de responsabilidade",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de correio eletrónico",
        "confirmemail_noemail": "Não tem um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências de utilizador]].",
-       "confirmemail_text": "A {{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu browser para confirmar que o seu endereço de correio eletrónico é válido.",
+       "confirmemail_text": "{{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu navegador para confirmar que o seu endereço de correio eletrónico é válido.",
        "confirmemail_pending": "Um código de confirmação já lhe foi enviado;\ncaso tenha criado a conta recentemente, é recomendado que aguarde alguns minutos até o receber antes de tentar pedir um novo código.",
        "confirmemail_send": "Enviar código de confirmação",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "confirmemail_subject": "Confirmação de endereço de correio eletrónico da {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nSe a conta *não* é sua, abra o seguinte link para cancelar\na confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio electrónico em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e activar\nas funcionalidades de correio electrónico em {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio electrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra o seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
        "scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
        "watchlistedit-raw-done": "A sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionada uma página|Foram adicionadas $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removida uma página|Foram removidas $1 páginas}}:",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
+       "watchlistedit-clear-legend": "Limpar lista de páginas vigiadas",
+       "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas.",
+       "watchlistedit-clear-titles": "Páginas:",
+       "watchlistedit-clear-submit": "Limpar páginas vigiadas (isto é permanente!)",
+       "watchlistedit-clear-done": "A sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 página foi removida|$1 páginas foram removidas}}:",
+       "watchlistedit-too-many": "Existem demasiadas páginas para exibir.",
+       "watchlisttools-clear": "Limpar lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "specialpages-group-spam": "Ferramentas anti-spam",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
-       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URLs das imagens externas (com link direto)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
+       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URL das imagens externas (com ligação direta)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
        "tags": "Etiquetas de modificação válidas",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
        "htmlform-no": "Não",
        "htmlform-yes": "Sim",
        "htmlform-chosen-placeholder": "Selecione uma opção",
+       "htmlform-cloner-create": "Adicionar mais",
+       "htmlform-cloner-delete": "Remover",
+       "htmlform-cloner-required": "Pelo menos um valor é necessário.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
index 6183506..a19a71e 100644 (file)
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
+       "node-count-exceeded-category-desc": "Node count exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "node-count-exceeded-warning": "Error message shown when a page exceeded the node-count limit of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the node-count limit\n* $2 - (Unused) the value of the max node-count limit\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "expansion-depth-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [[meta:Help:Expansion_depth|expansion depth]] of the preprocessor exceeds the limit.",
+       "expansion-depth-exceeded-category-desc": "Expansion depth exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "expansion-depth-exceeded-warning": "Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the depth limit\n* $2 - (Unused) the value of the max depth limit\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "parser-unstrip-loop-warning": "{{Doc-important|Do not translate function name <code>unstrip</code>.}}\nThis error is shown when a parser extension tag such as <code><nowiki><pre></nowiki></code> includes a reference to itself in its own output.\n\nThe reference must be to the exact same invocation of the tag at the same location in the source, merely writing <code><nowiki><pre><pre></pre></pre></nowiki></code> will not do it.\n\nThis is usually impossible and unlikely to happen by accident, so translation is not essential.\n\n\"Unstrip\" refers to the internal function of the parser, called \"unstrip\", which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n*{{msg-mw|Parser-unstrip-recursion-limit}}",
        "parser-unstrip-recursion-limit": "{{doc-important|Do not translate function name <code>unstrip</code>.}}\nThis message is shown when the recursion limit for nested parser extension tags is exceeded.\n\nThis warning may be encountered due to input text like <code><nowiki><ref><ref><ref>...</ref></ref></ref></nowiki></code>.\n\nParameters:\n* $1 - the depth limit\n\n\"Unstrip\" refers to the internal function of the parser, called 'unstrip', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n* {{msg-mw|Parser-unstrip-loop-warning}}",
        "right-move": "{{doc-right|move}}\nThe right to move any page that is not protected from moving.\n{{Identical|Move page}}",
        "right-move-subpages": "{{doc-right|move-subpages}}",
        "right-move-rootuserpages": "{{doc-right|move-rootuserpages}}",
+       "right-move-categorypages": "{{doc-right|move-categorypages}}",
        "right-movefile": "{{doc-right|movefile}}",
        "right-suppressredirect": "{{doc-right|suppressredirect}}",
        "right-upload": "{{doc-right|upload}}\nThe right to [[Special:Upload|upload]] a file (this includes images, media, audio, ...).\n{{Identical|Upload file}}",
        "action-move": "{{Doc-action|move}}",
        "action-move-subpages": "{{Doc-action|move-subpages}}",
        "action-move-rootuserpages": "{{Doc-action|move-rootuserpages}}",
+       "action-move-categorypages": "{{Doc-action|move-categorypages}}",
        "action-movefile": "{{doc-action|movefile}}",
        "action-upload": "{{Doc-action|upload}}",
        "action-reupload": "{{Doc-action|reupload}}",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
-       "alphaindexline": "Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. \"from page $1 to page $2\". $1 is the source page name. $1 is the target page name.",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
        "prevpage": "Second part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Nextpage}}.\n\n{{Identical|Previous page}}",
        "allpagesfrom": "Option in [[Special:AllPages]].\n\nSee also:\n* {{msg-mw|allpagesto}}",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
        "movearticle": "The text before the name of the page that you are moving. Can be translated as \"Page that is going to be moved\". Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
-       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
-       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
-       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
+       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
+       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
+       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
        "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
+       "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "revertmove": "{{Identical|Revert}}",
        "delete_and_move": "Button text on the move page when the target page already exists.",
        "delete_and_move_text": "Used when moving a page, but the destination page already exists and needs deletion.\n\nThis message is to confirm that you really want to delete the page.\n\nParameters:\n* $1 - the destination page title\n\nSee also:\n* {{msg-mw|Delete and move confirm}}",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
-       "showhidebots": "This is shown on the special page [[Special:NewImages]]. The format is \"{{int:showhidebots|[[MediaWiki:Hide/{{SUBPAGENAME}}|{{int:hide}}]]}}\" or \"{{int:showhidebots|[[MediaWiki:Show/{{SUBPAGENAME}}|{{int:show}}]]}}\"\n\n{{Identical|$1 bots}}",
+       "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "variantname-shi-tfng": "{{optional}}",
        "variantname-shi-latn": "{{optional}}",
        "variantname-shi": "{{optional}}",
+       "variantname-uz": "{{optional}}",
+       "variantname-uz-latn": "{{optional}}",
+       "variantname-uz-cyrl": "{{optional}}",
        "metadata": "The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].\n{{Identical|Metadata}}",
        "metadata-help": "This message is followed by a table with metadata.",
        "metadata-expand": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.",
        "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
        "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
        "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
-       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.",
+       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
        "exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
        "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "descending_abbrev": "Abbreviation of descending order.\nSee also:\n* {{msg-mw|Ascending abbrev}}\n* {{msg-mw|Descending abbrev}}",
        "table_pager_next": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Next page}}",
        "table_pager_prev": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Previous page}}",
-       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
-       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
+       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|First page}}",
+       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Last page}}",
        "table_pager_limit": "Do not use PLURAL in this message, because ''$1'' is not the actual number. ''$1'' is a limit selector drop-down list.",
        "table_pager_limit_label": "Used as label for input field.",
        "table_pager_limit_submit": "{{Identical|Go}}",
        "watchlistedit-raw-done": "A message which appears after the raw watchlist has been updated using [[Special:Watchlist/raw]].",
        "watchlistedit-raw-added": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is added to the raw watchlist.\n\nFollowed by list of page titles which are added.\n\nParameters:\n* $1 - number of page titles which are added\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-removed}}",
        "watchlistedit-raw-removed": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is deleted from the raw watchlist.\n\nFollowed by list of page titles which are removed.\n\nParameters:\n* $1 - number of page titles which are removed\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-added}}",
+       "watchlistedit-clear-title": "Used as page title in [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-legend": "Heading of dialog box on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
+       "watchlistedit-clear-explain": "Used as intro text on [[Special:Watchlist/clear]].\n\nPreceded by the fieldset label {{msg-mw|Watchlistedit-clear-legend}}.\n\nFollowed by the button {{msg-mw|Watchlistedit-clear-submit}}.",
+       "watchlistedit-clear-titles": "Text above edit box containing items being watched on [[Special:Watchlist/clear]].\n{{Identical|Title}}",
+       "watchlistedit-clear-submit": "Text of submit button on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
+       "watchlistedit-clear-done": "A message which appears after the watchlist has been cleared using [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-removed": "Message on [[Special:EditWatchlist/clear]].\n\nThe message appears once the watchlist has been cleared.",
+       "watchlistedit-too-many": "Message on [[Special:EditWatchlist]] that is used when there are too many titles to display.\n\nShown instead of list of the pages.",
+       "watchlisttools-clear": "[[Special:Watchlist]]: Navigation link under the title.\n{{Identical|Clear watchlist}}",
        "watchlisttools-view": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-edit}}\n* {{msg-mw|watchlisttools-raw}}",
        "watchlisttools-edit": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|Watchlisttools-view}}\n* {{msg-mw|Watchlisttools-raw}}",
        "watchlisttools-raw": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-view}}\n* {{msg-mw|watchlisttools-edit}}\n{{Identical|Edit raw watchlist}}",
index 74f39af..e15433a 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "The Evil IP address",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "T'inkikunata uranpi sikwiy",
        "edit-gone-missing": "Manam atirqanichu p'anqata musuqchayta.\nQullusqachá.",
        "edit-conflict": "Tuylla llamk'apuymanta sasachakuy.",
        "edit-no-change": "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
+       "postedit-confirmation-created": "P'anqaqa kamarisqañam.",
+       "postedit-confirmation-restored": "P'anqaqa musuqmanta kamarisqañam.",
        "postedit-confirmation-saved": "Llamk'apusqaykiqa waqaychasqañam.",
        "edit-already-exists": "Manam atinichu musuq p'anqata kamariyta.\nKachkañam.",
        "defaultmessagetext": "Ñawpaq qillqa",
        "pagemerge-logentry": "[[$1]]-ta [[$2]]-man huñusqa (llamk'apusqakuna $3-kama)",
        "revertmerge": "Huñusqata kutichiy",
        "mergelogpagetext": "Kay qatiqpiqa aswan ñaqha huk p'anqa wiñay kawsaymanta huk p'anqa wiñay kawsayman huñusqakunatam rikunki.",
-       "history-title": "\"$1\" p'anqata hukchasqakunap wiñay kawsaynin",
+       "history-title": "«$1» p’anqata hukchasqakunap wiñay kawsaynin",
        "difference-title": "$1 nisqapaq musuqchasqapura wakin kaynin",
        "difference-title-multipage": "$1, $2 sutiyuq willañiqipura wakin kaynin",
        "difference-multipage": "(P'anqakunaqa manam kaqllachu)",
        "log-title-wildcard": "Kaywan qallariq p'anqa sutikunata maskay",
        "showhideselectedlogentries": "Akllasqa hallch'asqakunata rikuchiy/pakay",
        "allpages": "Tukuy p'anqakuna",
-       "alphaindexline": "$1-ta $2-man",
        "nextpage": "Qatiq p'anqa ($1)",
        "prevpage": "Ñawpaq p'anqa ($1)",
        "allpagesfrom": "Rikuchiy kaywan qallariq p'anqakunata:",
        "blockip": "Ruraqta hark'ay",
        "blockip-legend": "Ruraqta hark'ay",
        "blockiptext": "Kay qatiq hunt'ana p'anqata llamk'achiy huk sapaq IP huchhamanta icha ruraqpa rakiqunanmanta qillqay atiyta hark'anapaq.\nKayqa rurasqa kachun wandalismullatam hark'anapaq, [[{{MediaWiki:Policy-url}}|{{SITENAME}}pa kawpayninkamallam]].\nWillariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta willaspa).",
-       "ipadressorusername": "IP huchha icha ruraqpa sutin",
+       "ipaddressorusername": "IP huchha icha ruraqpa sutin",
        "ipbexpiry": "Hark'ay kaykama:",
        "ipbreason": "Kayrayku:",
        "ipbreason-dropdown": "*Hark'anapaq sapsi raykukuna\n** Llulla willayta qillqamuy\n** P'anqata samiqninmanta ch'usaqchay\n** ''Spam'' nisqa millay t'inkikunata yapay\n** Q'upata, mana ima chaniyuqtapas yapay\n** Huk ruraqkunata manchachiy icha k'amiy\n** Achka rakiqunakunawan millayta ruray\n** Mana chaskinalla ruraqpa sutin",
        "newimages-summary": "Kay sapaq p'anqapiqa ñaqha churkusqa willañiqikunatam rikunki.",
        "newimages-legend": "Ch'illchina",
        "newimages-label": "Willañiqip sutin (icha sutinpa rakin):",
-       "showhidebots": "($1 rurana antacha)",
        "noimages": "Manam ima rikunallapas kanchu.",
        "ilsubmit": "Maskay",
        "bydate": "p'unchawkama",
index e068ec9..b1b19df 100644 (file)
        "blockip": "Bloccar l'utilisader",
        "blockip-legend": "Bloccar l'utilisader",
        "blockiptext": "Utilisescha il formular sutvart per bloccar ina adressa IP u in utilisader uschia ch'el na po betg pli far midadas.\nTi duessas be far quai per impedir vandalissem e en ina moda confurma a las [[{{MediaWiki:Policy-url}}|directivas]].\nInditgescha sutvart in motiv (per exempel pos ti inditgar paginas ch'èn vegnidas destruidas).",
-       "ipadressorusername": "Adressa IP u num d'utilisader:",
+       "ipaddressorusername": "Adressa IP u num d'utilisader:",
        "ipbexpiry": "Bloccà enfin:",
        "ipbreason": "Motiv:",
        "ipbreason-dropdown": "*Motivs generals per bloccar\n** Inserir infurmaziuns faussas\n** Stizzar cuntegn da paginas\n** Inserir colliaziuns da spam a paginas externas\n** Inserir nonsens en paginas\n** Sedepurtar nunconvegnent u mulestant\n** Abus da plirs contos\n** Num d'utilisader nunacceptabel",
        "newimages-summary": "Questa pagina speziala mussa las davosas datotecas ch'èn vegnidas chargiadas si.",
        "newimages-legend": "Filter",
        "newimages-label": "Num da la datoteca (u ina part da quel):",
-       "showhidebots": "($1 bots)",
        "noimages": "Chattà naginas datotecas.",
        "ilsubmit": "Tschertgar",
        "bydate": "tenor data",
index 1974690..c60b2b6 100644 (file)
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
        "pool-queuefull": "Coada de așteptare este plină",
        "pool-errorunknown": "Eroare necunoscută",
+       "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
        "aboutsite": "Despre {{SITENAME}}",
        "aboutpage": "Project:Despre",
        "copyright": "Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.",
        "search-result-size": "$1 ({{PLURAL:$2|1 cuvânt|$2 cuvinte}})",
        "search-result-category-size": "$1 {{PLURAL:$1|element|elemente}} ($2 {{PLURAL:$2|categorie|categorii}}, $3 {{PLURAL:$3|fișier|fișiere}})",
        "search-result-score": "Relevanță: $1%",
-       "search-redirect": "(redirecționare către $1)",
+       "search-redirect": "(redirecționare de la $1)",
        "search-section": "(secțiunea $1)",
        "search-file-match": "(se regăsește în conținutul fișierului)",
        "search-suggest": "V-ați referit la: $1",
        "prefs-watchlist": "Listă de urmărire",
        "prefs-watchlist-days": "Numărul de zile care apar în lista paginilor urmărite:",
        "prefs-watchlist-days-max": "Maxim $1 {{PLURAL:$1|zi|zile}}",
-       "prefs-watchlist-edits": "Numărul de editări care apar în lista extinsă a paginilor urmărite:",
+       "prefs-watchlist-edits": "Numărul de modificări care apar în lista extinsă a paginilor urmărite:",
        "prefs-watchlist-edits-max": "Număr maxim: 1000",
        "prefs-watchlist-token": "Jeton pentru lista de pagini urmărite:",
        "prefs-misc": "Parametri diverși",
        "right-move": "Redenumește paginile",
        "right-move-subpages": "Redenumește paginile cu tot cu subpagini",
        "right-move-rootuserpages": "Redenumește pagina principală a unui utilizator",
+       "right-move-categorypages": "Redenumește paginile categoriilor",
        "right-movefile": "Redenumește fișiere",
        "right-suppressredirect": "Nu creează o redirecționare de la vechiul nume atunci când redenumește o pagină",
        "right-upload": "Încarcă fișiere",
        "action-move": "redenumiți această pagină",
        "action-move-subpages": "redenumiți această pagină și subpaginile sale",
        "action-move-rootuserpages": "redenumiți pagina principală a unui utilizator",
+       "action-move-categorypages": "redenumiți paginile categoriilor",
        "action-movefile": "redenumiți acest fișier",
        "action-upload": "încărcați acest fișier",
        "action-reupload": "suprascrieți fișierul existent",
        "recentchanges-legend-newpage": "(vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $3 $2",
+       "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
        "log-title-wildcard": "Caută titluri care încep cu acest text",
        "showhideselectedlogentries": "Arată/ascunde intrările selectate din jurnal",
        "allpages": "Toate paginile",
-       "alphaindexline": "$1 către $2",
        "nextpage": "Pagina următoare ($1)",
        "prevpage": "Pagina anterioară ($1)",
        "allpagesfrom": "Afișează paginile pornind de la:",
        "listgrouprights-namespaceprotection-namespace": "Spațiu de nume",
        "listgrouprights-namespaceprotection-restrictedto": "Drept(uri) care permit(e) utilizatorului modificări",
        "trackingcategories": "Categorii de urmărire",
-       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se pot schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
+       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se poate schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
        "trackingcategories-msg": "Categorie de urmărire",
        "trackingcategories-name": "Numele mesajului",
        "trackingcategories-desc": "Criteriile de includere în categorie",
        "noindex-category-desc": "Pagina conține cuvântul magic <code><nowiki>__NOINDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, drept urmare, nu este indexată de roboți.",
        "index-category-desc": "Pagina conține cuvântul magic <code><nowiki>__INDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, ca urmare, este indexată de roboți, deși în mod normal acest lucru nu s-ar fi întâmplat.",
        "post-expand-template-inclusion-category-desc": "După extinderea tuturor formatelor, dimensiunea paginii a depășit <code>$wgMaxArticleSize</code>, astfel că anumite formate nu au fost extinse.",
-       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}})</code>, pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}}</code>), pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Prea multe funcții costisitoare de analiză (precum <code>#ifexist</code>) incluse într-o pagină. Vedeți [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Categorie adăugată dacă pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).",
        "hidden-category-category-desc": "Această categorie conține <code><nowiki>__HIDDENCAT__</nowiki></code>, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.",
        "trackingcategories-nodesc": "Nicio descriere disponibilă.",
        "blockip": "Blocare utilizator",
        "blockip-legend": "Blocare utilizator/adresă IP",
        "blockiptext": "Pentru a bloca un utilizator completați rubricile de mai jos.<br />\n'''Respectați [[{{MediaWiki:Policy-url}}|politica de blocare]].'''<br />\nPrecizați motivul blocării; de exemplu indicați paginile vandalizate de acest utilizator.",
-       "ipadressorusername": "Adresă IP sau nume de utilizator",
+       "ipaddressorusername": "Adresă IP sau nume de utilizator",
        "ipbexpiry": "Expiră",
        "ipbreason": "Motiv:",
        "ipbreason-dropdown": "*Motivele cele mai frecvente\n** Introducere de informații false\n** Ștergere conținut fără explicații\n** Introducere de legături externe de publicitate (spam)\n** Creare pagini fără sens\n** Tentative de intimidare\n** Abuz utilizare conturi multiple\n** Nume de utilizator inacceptabil",
        "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
        "movearticle": "Pagina de redenumit:",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
+       "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "movenotallowed": "Nu aveți permisiunea de a redenumi pagini.",
        "movenotallowedfile": "Nu aveți permisiunea de a redenumi fișiere.",
        "cant-move-user-page": "Nu aveți permisiunea de a redenumi pagini de utilizator (cu excepția subpaginilor).",
        "cant-move-to-user-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).",
+       "cant-move-category-page": "Nu aveți permisiunea de a redenumi paginile categoriilor.",
+       "cant-move-to-category-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină a unei categorii.",
        "newtitle": "Titlul nou",
        "move-watch": "Urmărește această pagină",
        "movepagebtn": "Redenumește pagina",
        "newimages-summary": "Această pagină specială arată ultimele fișiere încărcate.",
        "newimages-legend": "Filtru",
        "newimages-label": "Numele fișierului (sau parte din el):",
-       "showhidebots": "($1 roboți)",
+       "newimages-showbots": "Arată încărcările roboților",
        "noimages": "Nimic de văzut.",
        "ilsubmit": "Caută",
        "bydate": "după dată",
        "watchlistedit-raw-done": "Lista paginilor urmărite a fost actualizată.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titlu a fost adăugat|$1 titluri au fost adăugate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titlu a fost șters|$1 titluri au fost șterse}}:",
+       "watchlistedit-clear-title": "Listă de pagini urmărite golită",
+       "watchlistedit-clear-legend": "Golire listă de pagini urmărite",
+       "watchlistedit-clear-explain": "Toate titlurile vor fi înlăturate din lista dumnevoastră de pagini urmărite",
+       "watchlistedit-clear-titles": "Titluri:",
+       "watchlistedit-clear-submit": "Golește lista de pagini urmărite (ireversibil!)",
+       "watchlistedit-clear-done": "Lista dumnevoastră de pagini urmărite a fost golită.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titlu a|$1 titlu au|$1 de titluri au}} fost înlăturat{{PLURAL:$1||e|e}}:",
+       "watchlistedit-too-many": "Sunt prea multe pagini care trebuie afișate aici.",
+       "watchlisttools-clear": "Golește lista de pagini urmărite",
        "watchlisttools-view": "Vizualizează schimbările relevante",
        "watchlisttools-edit": "Vezi și modifică lista paginilor urmărite",
        "watchlisttools-raw": "Modifică lista brută a paginilor urmărite",
index 2a72fef..dca8ad2 100644 (file)
        "blockip": "Blocche l'utende",
        "blockip-legend": "Bluecche l'utende",
        "blockiptext": "Ause 'a schermata de sotte pe bloccà l'accesse in scritture de 'nu specifiche indirizze IP o utende.\nQuiste avessa essere fatte sulamende pe prevenìe 'u vandalisme e in accorde cu [[{{MediaWiki:Policy-url}}|le reghele]].\nMitte pure 'nu mutive specifiche aqquà sotte (pe esembije, nnomene 'a pàgene addò è acchiate 'u vandalisme).",
-       "ipadressorusername": "Indirizze IP o nome de l'utende:",
+       "ipaddressorusername": "Indirizze IP o nome de l'utende:",
        "ipbexpiry": "More:",
        "ipbreason": "Mutive:",
        "ipbreason-dropdown": "*Mutive comune de blocche\n** Inzerimende de 'mbormaziune fause\n** Scangellamende de condenute da le vôsce\n** Collegaminde pubblecetarie a site fore de Uicchipèdie\n** Inzerimende de studecarie jndr'à le vôsce\n** Menacce e intimidaziune\n** Abbuse de cunde utende multiple\n** Nome de l'utende inaccettabbele",
        "newimages-summary": "Sta pàgena speciale face vedè l'urteme file carecate.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nome d'u fail (o 'nu stuezze de jidde):",
-       "showhidebots": "($1 bot)",
        "noimages": "Non ge stè ninde da vedè.",
        "ilsubmit": "Cirche",
        "bydate": "pe date",
index d0279cf..2019562 100644 (file)
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
+       "right-move-categorypages": "Переименование страниц категорий",
        "right-movefile": "переименование файлов",
        "right-suppressredirect": "не создавать перенаправление со старого имени при переименовании страницы",
        "right-upload": "загрузка файлов",
        "action-move": "переименование этой страницы",
        "action-move-subpages": "переименование этой страницы со всеми её подстраницами",
        "action-move-rootuserpages": "переименование корневых страниц участников",
+       "action-move-categorypages": "переименование страниц категорий",
        "action-movefile": "переименовать этот файл",
        "action-upload": "загрузку этого файла",
        "action-reupload": "перезапись существующего файла",
        "log-title-wildcard": "Найти заголовки, начинающиеся с данных символов",
        "showhideselectedlogentries": "Показать/скрыть выбранные записи журнала",
        "allpages": "Все страницы",
-       "alphaindexline": "от $1 до $2",
        "nextpage": "Следующая страница ($1)",
        "prevpage": "Предыдущая страница ($1)",
        "allpagesfrom": "Вывести страницы, начинающиеся на:",
        "blockip": "Заблокировать",
        "blockip-legend": "Блокировка участника",
        "blockiptext": "Используйте форму ниже, чтобы заблокировать возможность записи с определённого IP-адреса.\nЭто может быть сделано только для предотвращения вандализма и только в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].\nНиже укажите конкретную причину (к примеру, процитируйте некоторые страницы с признаками вандализма).",
-       "ipadressorusername": "IP-адрес или имя участника:",
+       "ipaddressorusername": "IP-адрес или имя участника:",
        "ipbexpiry": "Закончится через:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Стандартные причины блокировок\n** Вставка ложной информации\n** Удаление содержимого страниц\n** Спам-ссылки на внешние сайты\n** Добавление бессмысленного текста/мусора\n** Угрозы, преследование участников\n** Злоупотребление несколькими учётными записями\n** Неприемлемое имя участника",
        "movenotallowedfile": "У вас нет разрешения переименовывать файлы.",
        "cant-move-user-page": "У вас нет разрешения переименовывать основные страницы участников.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
+       "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
+       "cant-move-to-category-page": "У вас нет разрешения переименовывание страницы в страницу категории.",
        "newtitle": "Новое название",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Имя файла (или его часть):",
-       "showhidebots": "($1 ботов)",
+       "newimages-showbots": "Показать загрузки ботов",
        "noimages": "Изображения отсутствуют.",
        "ilsubmit": "Найти",
        "bydate": "по дате",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Была добавлена|Было добавлено|Были добавлены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-clear-title": "Очищенный список наблюдения",
+       "watchlistedit-clear-legend": "Очистить список наблюдения",
+       "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
+       "watchlistedit-clear-titles": "Заголовок:",
+       "watchlistedit-clear-submit": "Очистить список наблюдения (это необратимо!)",
+       "watchlistedit-clear-done": "Ваш список наблюдения очищен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-too-many": "Слишком много страниц для того, чтобы показать их здесь.",
+       "watchlisttools-clear": "Очистить список наблюдения",
        "watchlisttools-view": "Изменения на страницах из списка",
        "watchlisttools-edit": "Смотреть и редактировать список",
        "watchlisttools-raw": "Редактировать как обычный текст",
index cb26cef..4fdf3dc 100644 (file)
        "blockip": "Заблоковати хоснователя",
        "blockip-legend": "Блокованя хоснователя",
        "blockiptext": "Тот формуларь служыть про заблокованя едітованя з конкретной IP адресы або мена хоснователя.\nТото бы мало быти хосноване лем в згодї з [[{{MediaWiki:Policy-url}}|правилами]].\nЗадайте причіну ниже (наприклад вкажте, котры сторінкы были пошкоджены).",
-       "ipadressorusername": "IP-адреса або мено хоснователя:",
+       "ipaddressorusername": "IP-адреса або мено хоснователя:",
        "ipbexpiry": "Кінчіть:",
        "ipbreason": "Причіна:",
        "ipbreason-dropdown": "*Часты причіны блокованя\n** Вкладаня неправдивых інформацій\n** Одстранёваня обсягу сторінок\n** Вкладаня рекламных екстерных одказів\n** Вкладаня незмыслїв\n** Застрашованя або выгрожованя\n** Знеужываня веце конт\n** Невгодне мено хоснователя",
        "newimages-summary": "На тій шпеціалній сторінцї ся зображують остатнї наладованы файлы.",
        "newimages-legend": "Філтер",
        "newimages-label": "Назва файлу (або єй часть):",
-       "showhidebots": "($1 ботів)",
        "noimages": "Не є што зобразити.",
        "ilsubmit": "Глядати",
        "bydate": "за датумом",
index 4e7543d..6c3eb9a 100644 (file)
        "jumptonavigation": "सञ्चरणं",
        "jumptosearch": "अन्वेषणम्",
        "view-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् । $1",
+       "generic-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् ।",
        "pool-timeout": "संरक्षणार्थं कालावधिः समाप्ता",
        "pool-queuefull": "Pool इति पङ्कतिः पूर्णा अस्ति ।",
        "pool-errorunknown": "अज्ञातदोषः",
        "edit-gone-missing": "अस्मिन् पृष्ठे परिवर्तनं नाभूत् ।\nएतत् पृष्ठं पुरा एव केनापि अपाकृतम् इति भाति ।",
        "edit-conflict": "सम्पादनयोः अन्तर्विरोधः ।",
        "edit-no-change": "भवता/भवत्या कृतं सम्पादम् अवगणितम् । कारणं लेखे न किमपि परिवर्तनं जातमस्ति ।",
+       "postedit-confirmation-created": "नूतनपृष्ठस्य रचना अभवत् ।",
+       "postedit-confirmation-restored": "एतत् पृष्ठं पुनः सङ्ग्रहितम् ।",
        "postedit-confirmation-saved": "सम्पादनं रक्षितम् ।",
        "edit-already-exists": "नूतनपृष्ठस्य निर्माणं नाभूत् ।\nपूर्वस्मादेव एतत् पृष्ठं विद्यते ।",
        "defaultmessagetext": "मूलसन्देशः",
        "content-failed-to-parse": "$1 कृते $2 इत्यस्य विभाजनं विफलम् अभवत् । दोषः : $3",
        "invalid-content-data": "अयोग्यः लेखः",
-       "content-not-allowed-here": "[[$2]] à¤ªà¥\83षà¥\8dठà¥\87 \"$1\" à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\85नà¥\81मता नास्ति",
+       "content-not-allowed-here": "[[$2]] à¤ªà¥\83षà¥\8dठà¥\87 \"$1\" à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¸à¥\8dथापितà¥\81मà¥\8d à¤\85नà¥\81मतिà¤\83 नास्ति",
        "editwarning-warning": "एतत् पृष्ठं त्यक्तवा यदि गमिष्यति, तर्हि भवता/भवत्या कृतस्य सम्पादनस्य रक्षणं न भविष्यति ।\n\nभवता/भवत्या यदि प्रवेशः प्राप्तः अस्ति, तर्हि एषा सूचना अत्र \"{{int:prefs-editing}}\" निगूढितुं शक्यते ।",
        "editpage-notsupportedcontentformat-title": "लेखस्य प्रारूपम् अयोग्यम्",
        "editpage-notsupportedcontentformat-text": "लेखस्य सामग्र्याः $1 इति प्रारूपं $2 सामग्री-उदाहरणानुगुणं नास्ति ।",
        "diff-multi-sameuser": "(अनेन योजकेनैव {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
        "diff-multi-otherusers": "({{PLURAL:$2|एकेन अन्ययोजकेन|$2 योजकैः}} {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
        "diff-multi-manyusers": "{{PLURAL:$2|एकेन योजकेन कृतं|$2 योजकैः कृतानि}} ({{PLURAL:$1|मध्यस्थम् एकं संस्करणं न प्रदर्शितम् ।|मध्यस्थानि $1 परिवर्तनानि न प्रदर्शितानि ।}})",
-       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।\nकारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "difference-missing-revision": "एतस्य भेदस्य {{PLURAL:$2|एकं संस्करणं|$2 संस्करणानि}} ($1) न {{PLURAL:$2|प्राप्तम्|प्राप्तानि}} ।\n\nअपाकृतानां पृष्ठानां संस्करणानाम् अन्वेषणकाले प्रायशः एतादृशं भवति । अधिकं ज्ञातुं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलि)] पश्यतु ।",
        "searchresults": "अन्वेषणपरिणामाः",
        "searchresults-title": "\"$1\" कृते अन्वेषणपरिणामाः",
-       "toomanymatches": "à¤\85तà¥\8dयधिà¤\95ाà¤\83 à¤®à¥\87लाà¤\83 à¤ªà¥\8dरतà¥\8dयाà¤\97ताà¤\83 à¥¤ à¤\85नà¥\8dयपà¥\8dरशà¥\8dनà¥\87न à¤¯à¤¤à¤¤à¤¾à¤®à¥\8d à¥¤",
-       "titlematches": "पà¥\81à¤\9fशà¥\80रà¥\8dषिà¤\95ामà¥\87लाà¤\83 à¥¤",
-       "textmatches": "पà¥\81à¤\9fपाठसà¥\8dय à¤®à¥\87लाà¤\83",
-       "notextmatches": "न à¤\95सà¥\8dयापि à¤ªà¥\83षà¥\8dठसà¥\8dय à¤ªà¤¾à¤ à¤\83 à¤\85सà¥\8dय à¤¸à¤®à¤®à¤¸à¥\8dति",
+       "toomanymatches": "बहवà¤\83 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¾à¤\83 à¤ªà¥\8dरापà¥\8dताà¤\83, à¤\95à¥\83पया à¤¶à¤¬à¥\8dदà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dय à¤ªà¥\81नà¤\83 à¤\85नà¥\8dविषà¥\8dयतामà¥\8d",
+       "titlematches": "पà¥\83षà¥\8dठशà¥\80रà¥\8dषà¤\95à¤\82 à¤®à¥\87लà¤\83 (matches)",
+       "textmatches": "पà¥\83षà¥\8dठपाठà¤\83 à¤®à¥\87लà¤\83 (matches)",
+       "notextmatches": "à¤\8fषà¤\83 à¤¶à¤¬à¥\8dदà¤\83 à¤¨ à¤\95सà¥\8dमिà¤\82शà¥\8dà¤\9aिदपि à¤ªà¥\83षà¥\8dठà¥\87 à¤\85नà¥\8dतरà¥\8dभवति à¥¤",
        "prevn": "पूर्वतनम् {{PLURAL:$1|$1}}",
        "nextn": "अग्रिमम् {{PLURAL:$1|$1}}",
        "prevn-title": "पूर्वतन{{PLURAL:$1|परिणामः|परिणामाः}}",
        "nextn-title": "अग्रिम{{PLURAL:$1|परिणामः|परिणामाः}}",
-       "shown-title": "पà¥\8dरतà¥\8dयà¥\87à¤\95सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 $1 {{PLURAL:$1|फलितमà¥\8d|फलितानि}} à¤¦à¤°à¥\8dशà¥\8dयतामà¥\8d",
+       "shown-title": "पà¥\8dरतà¥\8dयà¥\87à¤\95सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 $1 {{PLURAL:$1|परिणामà¤\83 à¤¦à¥\83शà¥\8dयतामà¥\8d|परिणामाà¤\83 à¤¦à¥\83शà¥\8dयनà¥\8dतामà¥\8d}}",
        "viewprevnext": "दृश्यताम् ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>अस्मिन् विकि-जालस्थाने \"[[:$1]]\" नामकं पृष्ठं विद्यते ।</strong> {{PLURAL:$2|0=|अन्यपरिणामाः दृश्यन्ताम्}}",
-       "searchmenu-new": "<strong> अस्मिन् विकिजालस्थाने \"[[:$1]]\" इदं पृष्ठं सृज्यताम् ।\n</strong>\n{{PLURAL:$2|0=|तव अन्वेषणस्य परिणामोऽपि दृश्यताम् ।|तव अन्वेषणस्य परिणामाः अपि दृश्यन्ताम्}}",
+       "searchmenu-new": "<strong> अस्मिन् विकि-जालस्थाने \"[[:$1]]\" इदं पृष्ठं सृज्यताम् ।\n</strong>\n{{PLURAL:$2|0=|तव अन्वेषणस्य परिणामोऽपि दृश्यताम् ।|तव अन्वेषणस्य परिणामाः अपि दृश्यन्ताम्}}",
        "searchprofile-articles": "विषयसहितानि पृष्ठानि",
        "searchprofile-project": "साहाय्यं, प्रकल्पपृष्ठानि च",
        "searchprofile-images": "माध्यमसमुच्चयः",
        "searchprofile-advanced-tooltip": "नामाकाशेषु अन्विष्यताम्",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})",
        "search-result-category-size": "{{PLURAL:$1|1 योजकः|$1 योजकाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
-       "search-result-score": "सम्बन्धः $1% ।",
+       "search-result-score": "सम्बन्धः : $1%",
        "search-redirect": "($1 तः अनुप्रेषितम्)",
        "search-section": "(विभागः $1)",
+       "search-file-match": "(सञ्चिकापाठेन सह मेलः अस्ति)",
        "search-suggest": "किं भवतः/भवत्याः आशयः एवमस्ति : $1",
        "search-interwiki-caption": "बन्धु-प्रकल्पाः",
-       "search-interwiki-default": "$1 परिणामाः :",
+       "search-interwiki-default": "$1 à¤¤à¤\83 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¾à¤\83 :",
        "search-interwiki-more": "(अधिकानि)",
-       "search-relatedarticle": "सम्बद्धानि ।",
-       "searcheverything-enable": "सरà¥\8dवनामावà¤\95ाशà¥\87 à¤\85नà¥\8dविषतà¥\81 à¥¤",
+       "search-relatedarticle": "सम्बद्धानि",
+       "searcheverything-enable": "सरà¥\8dवसà¥\8dमिनà¥\8d à¤¨à¤¾à¤®à¤¾à¤\95ाशà¥\87 à¤\85नà¥\8dविषà¥\8dयतामà¥\8d",
        "searchrelated": "सम्बद्धानि",
        "searchall": "सर्वाणि",
-       "showingresults": "निम्नगतक्रमाङ्कस्य '''$2''' तः आरभ्य अधिकतमं परिणामः'''$1''' {{PLURAL:$1| दर्शितः}}।",
-       "showingresultsnum": "निम्नगतक्रमाङ्क'''$2'''तः आरभ्य अधिकतमः '''$3''' परिणामः {{PLURAL:$3|दर्शितः}}।",
+       "showingresults": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsinrange": "#'''$2''' क्रमाङ्कात् आरभ्य #'''$3''' क्रमाङ्कपर्यन्तं {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsnum": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$3|'''1''' परिणामः अधः प्रदर्शितः|'''$3''' परिणामाः अधः प्रदर्शिताः}}।",
        "showingresultsheader": "'''$4''' इत्येतस्मै {{PLURAL:$5|'''$1''' परिणामः '''$3''' इत्येषु|'''$1 - $2''' परिणामाः '''$3''' इत्येषु}}",
        "search-nonefound": "भवतः/भवत्याः अपेक्षानुगुणं परिणामः न विद्यते ।",
        "powersearch-legend": "प्रगतम् अन्वेषणम्",
-       "powersearch-ns": "नामाकाशेषु अन्विष्यताम्:",
-       "powersearch-togglelabel": "à¤\86यà¥\80à¤\95ा:",
+       "powersearch-ns": "नामाकाशेषु अन्विष्यताम् :",
+       "powersearch-togglelabel": "परà¥\80à¤\95à¥\8dषà¥\8dयतामà¥\8d :",
        "powersearch-toggleall": "सर्वम्",
-       "powersearch-togglenone": "नासà¥\8dति",
+       "powersearch-togglenone": "नà¥\88à¤\95मपि",
        "search-external": "बाह्यान्वेषणम्",
-       "searchdisabled": "{{SITENAME}} अन्वेषणं निष्क्रियम्\nअश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति\nस्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।",
+       "searchdisabled": "{{SITENAME}} इत्यत्र अन्वेषणं कर्तुं न शक्यते ।\nतावता गुगल-माध्यमेन अन्वेषणं कर्तुं शक्यते ।\n'''पूर्वसूचना'''गुगल-जालस्थाने {{SITENAME}} इत्यस्य पुरातना सूचना भवितुम् अर्हति ।",
+       "search-error": "$1 इति अन्वेषणकाले दोषः प्राप्तः :",
        "preferences": "इष्टतमानि",
        "mypreferences": "इष्टतमानि",
        "prefs-edits": "सम्पादनानां सख्याः",
+       "prefsnologintext2": "स्वस्य इष्टतमानि परिवर्तितुं कृपया $1 इत्येनं नुदतु ।",
        "prefs-skin": "त्वक्",
        "skin-preview": "प्राग्दृश्यम्",
-       "datedefault": "वरà¥\80याà¤\82सि à¤¨à¤¾à¤¸्ति",
-       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालालà¤\95à¥\8dषणानि à¥¤",
-       "prefs-user-pages": "यà¥\8bà¤\9cà¤\95पà¥\81à¤\9fानि à¥¤",
-       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤°à¥\82परà¥\87à¤\96ा",
+       "datedefault": "à¤\87षà¥\8dà¤\9fतमानि à¤¨ à¤¸à¤¨्ति",
+       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालावà¥\88शिषà¥\8dà¤\9fà¥\8dयमà¥\8d",
+       "prefs-user-pages": "यà¥\8bà¤\9cतपà¥\83षà¥\8dठानि",
+       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d",
        "prefs-rc": "सद्यो जातानि परिवर्तनानि",
-       "prefs-watchlist": "निरà¥\80à¤\95à¥\8dषासà¥\82à¤\9aà¥\80",
-       "prefs-watchlist-days": "दà¥\83षà¥\8dà¤\9fि à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤°à¥\8dशनारà¥\8dथà¥\87  à¤¦à¤¿à¤µà¤¸à¤¾à¤¨à¤¿",
-       "prefs-watchlist-days-max": "अधिकतमानि $1 {{PLURAL:$1|दिनानि}}",
-       "prefs-watchlist-edits": "विसà¥\8dतà¥\83तावलà¥\8bà¤\95नावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81मà¥\8d à¤\85तà¥\8dयधिà¤\95परिवरà¥\8dतनानि à¥¤",
-       "prefs-watchlist-edits-max": "अधिकतम संख्या: १०००",
-       "prefs-watchlist-token": "à¤\85वलà¥\8bà¤\95नावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83 à¥¤",
-       "prefs-misc": "विविधà¤\83",
+       "prefs-watchlist": "à¤\85वà¥\87à¤\95à¥\8dषणावलिà¤\83",
+       "prefs-watchlist-days": "à¤\85नà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤¦à¤°à¥\8dशनियानि à¤¦à¤¿à¤¨à¤¾à¤¨à¤¿ :",
+       "prefs-watchlist-days-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "prefs-watchlist-edits": "à¤\85सà¥\8dयाà¤\82 à¤µà¤¿à¤¸à¥\8dतà¥\83त-à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81à¤\82 à¤®à¤¹à¤¤à¥\8dतमपरिवरà¥\8dतनानाà¤\82 à¤¸à¤\99à¥\8dà¤\96à¥\8dया :",
+       "prefs-watchlist-edits-max": "अधिकतमसङ्ख्याः : १०००",
+       "prefs-watchlist-token": "à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83",
+       "prefs-misc": "विविधमà¥\8d",
        "prefs-resetpass": "कूटशब्दः परिवर्त्यताम्",
-       "prefs-changeemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयतà¥\81 à¥¤",
-       "prefs-setemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤¯à¥\8bà¤\9cयतà¥\81 à¥¤",
-       "prefs-email": "à¤\87मà¥\87ल à¤µà¥\88à¤\95लà¥\8dपिà¤\95ाः",
+       "prefs-changeemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dयतामà¥\8d",
+       "prefs-setemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤²à¤¿à¤\96à¥\8dयतामà¥\8d",
+       "prefs-email": "à¤\88पतà¥\8dर-विà¤\95लà¥\8dपाः",
        "prefs-rendering": "स्वरूपम्",
-       "saveprefs": "सà¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
-       "restoreprefs": "समà¤\97à¥\8dराà¤\83 à¤µà¥\8dयवसà¥\8dथादय à¤µà¥\8dयवसà¥\8dथानà¥\81सारà¤\82 à¤ªà¥\81नà¤\83 à¤¸à¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
+       "saveprefs": "रक्ष्यताम्",
+       "restoreprefs": "मà¥\82लवà¥\8dयवसà¥\8dथापनानà¥\81à¤\97à¥\81णà¤\82 (default settings) à¤¸à¤°à¥\8dवà¥\87 à¤µà¤¿à¤\95लà¥\8dपाà¤\83 à¤­à¤µà¤¨à¥\8dतà¥\81 (सरà¥\8dवà¥\87षà¥\81 à¤µà¤¿à¤­à¤¾à¤\97à¥\87षà¥\81)",
        "prefs-editing": "सम्पादनम्",
-       "rows": "पà¤\82à¤\95à¥\8dति",
-       "columns": "à¤\85ध: à¤ªà¤\82à¤\95à¥\8dतà¥\8dयाà¤\83",
+       "rows": "पà¤\99à¥\8dà¤\95तयà¤\83 :",
+       "columns": "सà¥\8dतमà¥\8dभाà¤\83 :",
        "searchresultshead": "अन्वेषणम्",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">आधारानुबन्धानां </a>अधिकतमाकारः ।",
+       "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> इत्यस्य प्रारूपणस्य (formatting) कृते प्रारम्भिकसोपान formatting (bytes):",
        "stub-threshold-disabled": "निष्क्रियः",
-       "recentchangesdays": "दिवसानि पर्यन्तो सद्यावधि-परिवर्तनानि दृश्यतु:",
-       "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}",
-       "recentchangescount": "सम्पादन संख्यकानि व्यवस्थानुसारेण दृश्यतु:",
-       "prefs-help-recentchangescount": "अत्र सद्यः परिवर्तनानि, पुटेतिहासाः, प्रवेशाः च अन्तर्गताः ।",
-       "savedprefs": "आद्यताः संरक्षिताः ।",
-       "timezonelegend": "समय मण्डल:",
-       "localtime": "स्थानीय समय:",
-       "timezoneuseserverdefault": "विकिनिश्चितं ($1) उपयुज्यताम् ।",
-       "timezoneuseoffset": "अन्ये (समयान्तरं निर्दिशतु )",
-       "servertime": "वितारकसमयः ।",
-       "guesstimezone": "जालदर्शिकातः पूरयतु ।",
-       "timezoneregion-africa": "कालद्वीप",
+       "recentchangesdays": "नूतनपरिवर्तनेषु प्रदर्शनीयानि दिनानि :",
+       "recentchangesdays-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "recentchangescount": "फलकेषु सामान्यतया यानि परिवर्तनानि अभवन्, तेषां सङ्ख्या :",
+       "prefs-help-recentchangescount": "अत्र नूतनपरिवर्तनानि, पृष्ठेतिहासः, संरक्षितावल्यश्च अन्तर्भवन्ति ।",
+       "prefs-help-watchlist-token2": "भवतः/भवत्याः अवेक्षणावल्याः वेब-करस्य (web feed) गुप्तकुञ्चिका अस्त्येषा । \nएषा कुञ्चिका यस्य पार्श्वे भविष्यति, सः तव अवेक्षणावलिं द्रष्टुं प्रभविष्यति । अतः एनां गुप्ततया स्थाप्यताम् ।\n[[Special:ResetTokens|गुप्तकुञ्चिकां परिवर्तयितुम् अत्र नुद्यताम् ।]]।",
+       "savedprefs": "भवतः/भवत्याः इष्टतमानि रक्षितानि ।",
+       "timezonelegend": "समयवलयः (time zone) :",
+       "localtime": "स्थानीयसमय:",
+       "timezoneuseserverdefault": "विकि-मूलविकल्पान् स्थापयन्तु ($1)",
+       "timezoneuseoffset": "अन्यम् (समयान्तरं निर्दिशतु )",
+       "servertime": "वितरकसमयः :",
+       "guesstimezone": "गवेक्षणे पूरयतु",
+       "timezoneregion-africa": "कालद्वीपः",
        "timezoneregion-america": "अमेरिका",
-       "timezoneregion-antarctica": "à¤\85à¤\82टार्कटिका",
+       "timezoneregion-antarctica": "à¤\85णà¥\8dटार्कटिका",
        "timezoneregion-arctic": "आर्कटिक",
-       "timezoneregion-asia": "जम्बुमहाद्वीप",
-       "timezoneregion-atlantic": "à¤\8fà¤\9fलाà¤\82à¤\9fिà¤\95 à¤®à¤¹à¤¾à¤¸à¤¾à¤\97र",
+       "timezoneregion-asia": "जम्बुमहाद्वीप",
+       "timezoneregion-atlantic": "à¤\8fà¤\9fलाणà¥\8dà¤\9fिà¤\95-महासाà¤\97रà¤\83",
        "timezoneregion-australia": "ऑस्ट्रेलिया",
        "timezoneregion-europe": "यूरोप",
-       "timezoneregion-indian": "हिà¤\82द à¤®à¤¹à¤¾à¤¸à¤¾à¤\97र",
-       "timezoneregion-pacific": "पà¥\8dरशाà¤\82त à¤®à¤¹à¤¾à¤¸à¤¾à¤\97र",
-       "allowemail": "à¤\85नà¥\8dयà¥\8bपयà¥\8bà¤\9cà¤\95ानाà¤\82 à¤µà¤¿à¤¦à¥\8dयà¥\81नà¥\8dमानसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤¨à¤¿à¤·à¥\8dà¤\95ियà¤\82 à¤\95रà¥\8bतà¥\81 à¥¤",
-       "prefs-searchoptions": "à¤\85नà¥\8dवà¥\87षणविà¤\95लà¥\8dपाà¤\83",
-       "prefs-namespaces": "नामाà¤\95ाशà¤\83 :",
-       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु ",
-       "default": "यदभावà¥\87",
-       "prefs-files": "सञ्चिका",
-       "prefs-custom-css": "सि.à¤\8fसà¥\8d.à¤\8fसà¥\8d.रà¤\9aयतà¥\81 à¥¤",
-       "prefs-custom-js": "à¤\9cावालिपिà¤\82 à¤°à¤\9aयतà¥\81 à¥¤",
-       "prefs-common-css-js": "सरà¥\8dवावरणानाà¤\82 à¤\95à¥\83तà¥\87 à¤µà¤¿à¤­à¤\95à¥\8dत à¤¸à¤¿.à¤\8fसà¥\8d.à¤\8fसà¥\8d./ à¤\9cावालिपिà¤\83 à¥¤",
-       "prefs-reset-intro": "à¤\86दà¥\8dयतानाà¤\82 à¤ªà¥\81नरà¥\8dनिदà¥\87शारà¥\8dथमà¥\8d à¤\8fततà¥\8dपà¥\81à¤\9fमà¥\8d à¤\89पयà¥\8bà¤\95à¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8bति à¥¤ à¤\8fततà¥\8d à¤\85à¤\95à¥\83तà¤\82 à¤¨ à¤­à¤µति ।",
-       "prefs-emailconfirm-label": "विदà¥\8dयà¥\81नà¥\8dमानसà¤\99à¥\8dà¤\95à¥\87तसà¥\8dय à¤¦à¥\83ढà¥\80à¤\95रणमà¥\8d à¥¤",
-       "youremail": "ई-पत्रसङ्केतः",
-       "username": "योजकनामन्:",
-       "uid": "प्रयोक्तृ-क्रमांकः :",
-       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}}  सदस्यः:",
-       "prefs-registration": "पà¤\82à¤\9cà¥\80à¤\95रण à¤\95ालà¤\83:",
-       "yourrealname": "वास्तविकनाम:",
-       "yourlanguage": "भाषा:",
-       "yourvariant": "भाषासामà¤\97à¥\8dरà¥\80णाà¤\82 à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d à¥¤",
+       "timezoneregion-indian": "हिनà¥\8dद-महासाà¤\97रà¤\83",
+       "timezoneregion-pacific": "पà¥\8dरशानà¥\8dत-महासाà¤\97रà¤\83",
+       "allowemail": "à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95à¥\88à¤\83 à¤ªà¥\8dरà¥\87षितानि à¤\88-पतà¥\8dराणि à¤\85नà¥\81मतिà¤\82 à¤¦à¤¦à¤¾à¤¤à¥\81",
+       "prefs-searchoptions": "à¤\85नà¥\8dविषà¥\8dयतामà¥\8d",
+       "prefs-namespaces": "नामाà¤\95ाशाà¤\83",
+       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु :",
+       "default": "पà¥\82रà¥\8dवनिरà¥\8dदिषà¥\8dà¤\9fमà¥\8d",
+       "prefs-files": "सञ्चिका:",
+       "prefs-custom-css": "सà¥\8dवानà¥\81à¤\95à¥\81लसमà¥\8dपादितà¤\82 CSS",
+       "prefs-custom-js": "सà¥\8dवानà¥\81à¤\95à¥\81लसमà¥\8dपादितà¤\82 JavaScript",
+       "prefs-common-css-js": "सरà¥\8dवासाà¤\82 à¤¤à¥\8dवà¤\9aाà¤\82 (of skins) à¤\95à¥\83तà¥\87 CSS/JavaScript:",
+       "prefs-reset-intro": "भवानà¥\8d/भवतà¥\80 à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dयà¥\87न à¤¸à¥\8dवसà¥\8dय à¤\87षà¥\8dà¤\9fतमविà¤\95लà¥\8dपानà¥\8d à¤®à¥\82लविà¤\95ि-विà¤\95लà¥\8dपसदà¥\83शà¤\82 à¤¸à¥\8dथापयितà¥\81à¤\82 (à¤\95रà¥\8dतà¥\81à¤\82) à¤¶à¤\95à¥\8dनà¥\8bति à¥¤\nपरनà¥\8dतà¥\81 à¤¤à¤¤à¤\83 à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤ªà¥\82रà¥\8dववतà¥\8d à¤¸à¥\8dथितिà¤\82 à¤ªà¥\8dरापà¥\8dतà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dषà¥\8dयति ।",
+       "prefs-emailconfirm-label": "à¤\88-पतà¥\8dरà¤\82 à¤¦à¥\83ढà¥\80à¤\95à¥\8dरियतामà¥\8d :",
+       "youremail": "ई-पत्रसङ्केतः :",
+       "username": "{{GENDER:$1|योजकनाम}} :",
+       "uid": "{{GENDER:$1|प्रयोकतृनाम}} :",
+       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}} {{GENDER:$2|सदस्यः/सदस्याः}} :",
+       "prefs-registration": "पà¤\9eà¥\8dà¤\9cà¥\80à¤\95रणसà¥\8dय à¤\95ालà¤\83 :",
+       "yourrealname": "वास्तविकनाम :",
+       "yourlanguage": "भाषा :",
+       "yourvariant": "भाषायाà¤\83 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80वà¥\88विधà¥\8dयमà¥\8d :",
        "prefs-help-variant": " विक्यां प्रदर्शितुं भवति ।",
-       "yournick": "नà¥\82तनाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83:",
-       "prefs-help-signature": "सà¤\82भाषणपà¥\83षà¥\8dठà¤\97ताà¤\83 à¤¸à¤\82वादाà¤\83 \"<nowiki>~~~~</nowiki>\" à¤\87ति à¤²à¤¿à¤\96ितà¥\8dवा à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\8bपà¥\87ताà¤\83 à¤\95रà¥\8dतà¥\8dतवà¥\8dयाà¤\83। à¤\8fतानि à¤\9aिहà¥\8dनानि à¤ªà¥\83षà¥\8dठरà¤\95à¥\8dषणपशà¥\8dà¤\9aातà¥\8d à¤­à¤µà¤¤à¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरानà¥\8d à¤¸à¤®à¤¯à¤®à¥\81दà¥\8dराà¤\82 à¤\9a à¤ªà¥\8dरदरà¥\8dशयिषà¥\8dयनà¥\8dति।",
-       "badsig": "à¤\85मानà¥\8dयाà¤\83 (तà¥\8dरà¥\81à¤\9fिपà¥\82रà¥\8dणाà¤\83) à¤¹à¤¿ à¤\8fतà¥\87 à¤\85पà¤\95à¥\8dवाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83।\nà¤\8fà¤\9aà¤\9fà¥\80à¤\8fमà¤\8fलà¥\8d-à¤\9fà¥\88à¤\97 à¤\87तà¥\8dयà¥\87तानि à¤ªà¥\81नरà¥\80à¤\95à¥\8dषितवà¥\8dयानि à¤­à¤µà¤¤à¤¾।",
-       "badsiglength": "भवतà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83 à¤¤à¥\81 à¤\85तà¥\80व à¤¦à¥\80रà¥\8dà¤\98ाà¤\83।\nà¤\8fतà¥\87 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98ाà¤\83 à¤¨ à¤­à¤µà¤¿à¤¤à¤µà¥\8dयाà¤\83।",
-       "yourgender": "लिà¤\82à¤\97मà¥\8d (Gender):",
-       "gender-unknown": "à¤\85निरà¥\8dदिषà¥\8dà¤\9fमà¥\8d",
-       "gender-male": "पà¥\81रà¥\81ष",
-       "gender-female": "सà¥\8dतà¥\8dरà¥\80",
-       "prefs-help-gender": "वà¥\88à¤\95लà¥\8dपिà¤\95à¤\83 : à¤\85यà¤\82 à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¤\83 à¤²à¤¿à¤\99à¥\8dà¤\97ानà¥\81सारसमà¥\8dबà¥\8bधनसà¥\8dय à¤\89पयà¥\8bà¤\9cà¤\95à¤\83 ।",
-       "email": "विदà¥\8dयà¥\81तà¥\8dपतà¥\8dरवà¥\8dयवसà¥\8dथा",
-       "prefs-help-realname": "निà¤\9cनामधà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤\86वशà¥\8dयà¤\95à¤\83 à¤¨à¤¾à¤¸à¥\8dति à¥¤ \nयदि à¤¦à¤¦à¤¾à¤¤à¤¿ à¤¤à¤°à¥\8dहि à¤\85सà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤\83 à¤¯à¥\8bà¤\97दानारà¥\8dथà¤\82 à¤­à¤µà¤¤à¥\87 à¤¶à¥\8dरà¥\87यà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\89पयà¥\81à¤\95à¥\8dतà¤\83 à¤­à¤µति ।",
+       "yournick": "नà¥\82तनहसà¥\8dताà¤\95à¥\8dषरमà¥\8d :",
+       "prefs-help-signature": "समà¥\8dभाषणपà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9fिपà¥\8dपणà¥\80à¤\82 à¤²à¤¿à¤\96ितà¥\8dवा à¤\85नà¥\8dतà¥\87 \"<nowiki>~~~~</nowiki>\" à¤²à¤¿à¤\96तà¥\81 à¥¤ à¤\85नà¥\87न à¤¸à¥\8dवसà¥\8dय à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\87ण à¤¸à¤¹ à¤\9fिपà¥\8dपणà¥\80लà¥\87à¤\96नà¤\95ालसà¥\8dयापि à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "badsig": "à¤\85यà¥\8bà¤\97à¥\8dयà¤\82 à¤ªà¥\8dरारà¥\82परहितà¤\82 (raw) à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरमà¥\8d à¥¤\nHTML à¤\9aिहà¥\8dनà¤\82 à¤ªà¤¶à¥\8dयतà¥\81 ।",
+       "badsiglength": "हसà¥\8dताà¤\95à¥\8dषरà¤\82 à¤¬à¤¹à¥\81लमà¥\8dबमानमà¥\8d à¤\85सà¥\8dति à¥¤\nहसà¥\8dताà¤\95à¥\8dषरà¤\82 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98à¤\82 à¤¨ à¤­à¤µà¥\87तà¥\8d ।",
+       "yourgender": "सà¥\8dवपरिà¤\9aयà¤\82 à¤\95थà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\87à¤\9aà¥\8dà¤\9bति ?",
+       "gender-unknown": "सà¥\8dवपरिà¤\9aयà¤\82 à¤¦à¤¾à¤¤à¥\81à¤\82 à¤¨à¥\87à¤\9aà¥\8dà¤\9bामि",
+       "gender-male": "सà¤\83 à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "gender-female": "सा à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "prefs-help-gender": "à¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\90à¤\9aà¥\8dà¤\9bिà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤\8fतसà¥\8dमिनà¥\8d à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¥\87\nलिà¤\99à¥\8dà¤\97ाधारà¥\87ण à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dबà¥\8bधनारà¥\8dथमà¥\8d à¤\85सà¥\8dयà¥\8bपयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤¿ à¥¤\nà¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤\82 à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95à¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "email": "à¤\88-पतà¥\8dरमà¥\8d",
+       "prefs-help-realname": "वासà¥\8dतविà¤\95नाम à¤\90à¤\9aà¥\8dà¤\9bà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤\8fनà¤\82 à¤µà¤¿à¤\95लà¥\8dपà¤\82 à¤¸à¤®à¤°à¥\8dथयति à¤\9aà¥\87तà¥\8d, à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\97दानशà¥\8dरà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96समयà¥\87 à¤\85सà¥\8dय à¤\89पयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
        "prefs-help-email": "ई-पत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत् तस्य परिवर्तनाय आवश्यकः भवति ।",
        "prefs-help-email-others": "योजकपृष्ठ-सम्भाषणपृष्ठयोः माध्यमेन,  ई-पत्रमाध्यमेन वा अन्ये योजकाः भवतः/भवत्याः सम्पर्कं कर्तुं शक्नुयुः ।\nसम्पर्केऽस्मिन् भवतः/भवत्याः ई-पत्रसङ्केतम् अन्ययोजकाः ज्ञातुं न प्रभवतन्ति ।",
-       "prefs-help-email-required": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\86वशà¥\8dयà¤\95ः ।",
+       "prefs-help-email-required": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85निवारà¥\8dयः ।",
        "prefs-info": "मूलसूचनाः",
-       "prefs-i18n": "अन्ताराष्ट्रिकरणम् ।",
-       "prefs-signature": "हस्ताक्षर",
+       "prefs-i18n": "अन्ताराष्ट्रिकरणम्",
+       "prefs-signature": "हस्ताक्षरम्",
        "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
-       "prefs-timeoffset": "समयान्तरम् ।",
-       "prefs-advancedediting": "उन्नतविकल्पाः",
-       "prefs-advancedrc": "उन्नतविकल्पाः",
-       "prefs-advancedrendering": "उन्नतविकल्पाः",
-       "prefs-advancedsearchoptions": "उन्नतविकल्पाः",
-       "prefs-advancedwatchlist": "उन्नतविकल्पाः",
-       "prefs-displayrc": "प्रदर्शनविकल्पाः",
-       "prefs-displaywatchlist": "प्रदर्शनविकल्पाः",
+       "prefs-timeoffset": "समयान्तरम्",
+       "prefs-advancedediting": "सामान्यविकल्पाः",
+       "prefs-editor": "योजकः",
+       "prefs-preview": "प्राग्दृश्यम्",
+       "prefs-advancedrc": "विशेषविकल्पाः",
+       "prefs-advancedrendering": "विशेषविकल्पाः",
+       "prefs-advancedsearchoptions": "विशेषविकल्पाः",
+       "prefs-advancedwatchlist": "विशेषविकल्पाः",
+       "prefs-displayrc": "प्रदर्शन-विकल्पाः",
+       "prefs-displaywatchlist": "प्रदर्शन-विकल्पाः",
+       "prefs-tokenwatchlist": "स्तोकम् (token)",
        "prefs-diffs": "अन्तरम्",
-       "email-address-validity-valid": "प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।",
-       "email-address-validity-invalid": "मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।",
-       "userrights": "योजकाधिकारस्य प्रबन्धनम् ।",
-       "userrights-lookup-user": "योजकसमूहं प्रबन्धयतु ।",
-       "userrights-user-editname": "योजकनाम योजयतु ।",
-       "editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "editinguser": "'''[[User:$1|$1]]''' $2 इति योजकस्य योजकाधिकारः परिवर्त्यते ।",
-       "userrights-editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "saveusergroups": "योजकसमूहं संरक्षतु ।",
-       "userrights-groupsmember": "अस्य सदस्यः  ।",
-       "userrights-groupsmember-auto": "अस्य निश्चितसदस्यः ।",
-       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* मञ्जूषा अङ्किता चेत् योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* मञ्जूषा अनङ्किता चेत् योजकः अस्य समूहस्य सदस्यः न \n* कदाचित् भवता समूहः योजितः चेत् अपनेतुं नैव शक्नोति इति * चिह्नं सूचयति ।",
+       "prefs-help-prefershttps": "आगामिप्रेवेशकाले एतत् परिवर्तनं सक्रियं भवष्यति ।",
+       "prefs-tabs-navigation-hint": "परामर्शः : पट्टीकयोः (tabs) मध्ये गमनागमनं कर्तुं भवान्/भवती वामतीरकुड्मलस्य, दक्षिणतीरकुण्मलस्य च उपयोगं कर्तुं शक्नोति ।",
+       "email-address-validity-valid": "ई-पत्रसङ्केतः मान्यः अस्ति इति प्रतियते",
+       "email-address-validity-invalid": "मान्यः ई-पत्रसङ्केतः लिख्यताम्",
+       "userrights": "योजकाधिकारस्य प्रबन्धनम्",
+       "userrights-lookup-user": "योजकसमूहस्य प्रबन्धनं करोतु",
+       "userrights-user-editname": "प्रयोक्तृनाम दीयताम्",
+       "editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "editinguser": "'''[[User:$1|$1]]''' इत्यस्य योजकस्य योजकाधिकारः परिवर्त्यते । $2",
+       "userrights-editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "saveusergroups": "योजकसमूहः रक्ष्यताम्",
+       "userrights-groupsmember": "अस्य सदस्यः :",
+       "userrights-groupsmember-auto": "निम्न{{PLURAL:$1|समूहस्य|समूहानाम्}} अन्तर्निहिः सदस्यः :",
+       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* अङ्कनपेटिका (check box) अङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
        "userrights-reason": "कारणम् :",
-       "userrights-no-interwiki": "अन्यविकिषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
-       "userrights-nodatabase": "$1 मूलपाठाः न सन्ति अथवा स्थानीयाः ।",
-       "userrights-nologin": "[[Special:UserLogin|log in]] प्रशासकस्थानेन प्रविश्य योजकाधिकारान् निर्देष्टुं शक्नोति ।",
-       "userrights-notallowed": "योजकाधिकारान् अपनेतुं ते स्थानस्य अनुमतिः नास्ति ।",
-       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः ।",
-       "userrights-unchangeable-col": "परिवर्तनार्हाः समूहाः ।",
+       "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
+       "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते । अथवा तु सः स्थानीयः नास्ति ।",
+       "userrights-nologin": "योजकान् अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
+       "userrights-notallowed": "योजकेभ्यः अधिकारं दातम्, अपाकर्तुं च ते अनुमतिः नास्ति ।",
+       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
+       "userrights-unchangeable-col": "परिवर्तनम् अनर्हाः समूहाः",
+       "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यताम् ।",
+       "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
-       "group-user": "योजकः",
-       "group-autoconfirmed": "स्वदृढितयोजकाः ।",
-       "group-bot": "सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियाà¤\83 à¥¤",
-       "group-sysop": "पà¥\8dरबà¤\82धकाः",
-       "group-bureaucrat": "सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारिणà¤\83 à¥¤",
-       "group-suppress": "अलक्ष्यम् ।",
+       "group-user": "यà¥\8bà¤\9cà¤\95ाà¤\83",
+       "group-autoconfirmed": "स्वदृढितयोजकाः",
+       "group-bot": "बà¥\8bà¤\9fà¥\8dसà¥\8d",
+       "group-sysop": "पà¥\8dरबनà¥\8dधकाः",
+       "group-bureaucrat": "à¤\85धिà¤\95ारिणà¤\83",
+       "group-suppress": "अलक्ष्यम्",
        "group-all": "(सर्वे)",
        "group-user-member": "{{GENDER:$1|योजक}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवसà¥\8dथानदà¥\83ढितà¤\83 योजकः}}",
-       "group-bot-member": "{{GENDER:$1|सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियà¤\83}}",
-       "group-sysop-member": "{{GENDER:$1|पà¥\8dरशासकः}}",
-       "group-bureaucrat-member": "{{GENDER:$1|सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारà¥\80}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवदà¥\83ढितयोजकः}}",
+       "group-bot-member": "{{GENDER:$1|बà¥\89à¤\9fà¥\8d}}",
+       "group-sysop-member": "{{GENDER:$1|पà¥\8dरबनà¥\8dधकः}}",
+       "group-bureaucrat-member": "{{GENDER:$1|अधिकारी}}",
        "group-suppress-member": "{{GENDER:$1|अलक्ष्यम्}}",
-       "grouppage-user": "{{ns:project}}:योजक",
-       "grouppage-autoconfirmed": "{{ns:project}}: स्वयंदृढितयोजकाः ।",
-       "grouppage-bot": "{{ns:project}}: स्वयंसक्रियाः।",
-       "grouppage-sysop": "{{ns:project}}:प्रचालकाः",
-       "grouppage-bureaucrat": "{{ns:project}}: स्वयम् अधिकारिणः ।",
-       "grouppage-suppress": "{{ns:project}}: अक्ष्यम् ।",
-       "right-read": "पुटानि पठतु ।",
-       "right-edit": "पुटसम्पादनं करोतु ।",
-       "right-createpage": "पुटनिर्माणं करोतु ।(यानि चर्च्यानि न सन्ति)",
-       "right-createtalk": "चर्च्यपुटानां निर्माणं करोतु ।",
-       "right-createaccount": "नूतनयोजकस्थानं निर्मातु ।",
-       "right-minoredit": "सम्पादनं लघुचिह्नया निर्दिशतु ।",
-       "right-move": "पुटं चालयतु ।",
-       "right-move-subpages": "उपपुटैः सह पुटं चालयतु ।",
-       "right-move-rootuserpages": "मूलयोजकपुटानि चालयतु ।",
-       "right-movefile": "सञ्चिकाः चालयतु ।",
-       "right-suppressredirect": "पुटचालनावसरे मूलपुटेभ्यः पुनर्निदेशं न सृजतु ।",
-       "right-upload": "सञ्चिकाः उत्तारयतु ।",
-       "right-reupload": "स्थितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-own": "एकेन उत्तारितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-shared": "विभक्तमाध्यमकोशगतसञ्चिकाः अतिसञ्चरतु ।",
-       "right-upload_by_url": "अन्तर्जालस्थानात् सञ्चिकाः उत्तारयतु ।",
-       "right-purge": "दृढतारहितपुटस्य क्षेत्राधारं पुनातु ।",
+       "grouppage-user": "{{ns:project}}:योजकाः",
+       "grouppage-autoconfirmed": "{{ns:project}}:स्वदृढितयोजकाः",
+       "grouppage-bot": "{{ns:project}}:बॉट्स्",
+       "grouppage-sysop": "{{ns:project}}:प्रबन्धकाः",
+       "grouppage-bureaucrat": "{{ns:project}}:अधिकारिणः",
+       "grouppage-suppress": "{{ns:project}}:अक्ष्यम्",
+       "right-read": "पृष्ठानि पठ्यताम्",
+       "right-edit": "पृष्ठानि सम्पाद्यताम्",
+       "right-createpage": "पृष्ठानि निर्मियताम् ।(येषां सम्भाषणपृष्ठं न स्यात् ।)",
+       "right-createtalk": "सम्भाषणपृष्ठानि निर्मियताम्",
+       "right-createaccount": "नूतनप्रयोक्तृवृत्तान्तं रच्यताम्",
+       "right-minoredit": "लघुसम्पादनत्वेन अङ्कितं करोतु",
+       "right-move": "पृष्ठं चाल्यताम्",
+       "right-move-subpages": "उपपृष्ठैः सह पृष्ठं चालयतु",
+       "right-move-rootuserpages": "मूलयोजकपुष्ठानि चाल्यताम्",
+       "right-move-categorypages": "वर्गपृष्ठानि चाल्यताम्",
+       "right-movefile": "सञ्चिकाः चाल्यताम्",
+       "right-suppressredirect": "पृष्ठं यदा चालयति, तदा मूलपृष्ठात् प्रतिप्रषणं मास्तु ।",
+       "right-upload": "उपारोहण(upload)सञ्चिकाः",
+       "right-reupload": "वर्तमानसञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम्",
+       "right-reupload-own": "अन्येन उपारोहिताः (upload) सञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम",
+       "right-reupload-shared": "विभक्तमाध्यमेन (shared media) स्थानिय-उपारोहिताः सञ्चिकाः नवीनसञ्चाकाभिः परिवर्त्यताम्",
+       "right-upload_by_url": "सर्वासङ्केतात् (URL) उपारोहिताः सञ्चिकाः",
+       "right-purge": "पृष्ठस्य उपस्मृतिं (cache) रिक्तीक्रियताम्",
        "right-autoconfirmed": "अल्परक्षितपुटनि सम्पादयतु ।",
-       "right-bot": "सà¥\8dवà¤\9aालितपà¥\8dरà¤\95à¥\8dरियाà¤\83 à¤\87व à¤\89पà¤\9aारितà¤\83 à¤­à¤µतु ।",
+       "right-bot": "à¤\8fताà¤\82 à¤¸à¥\8dवसà¤\9eà¥\8dà¤\9aालितपà¥\8dरणालितà¥\8dवà¥\87न à¤¸à¥\8dवà¥\80à¤\95रà¥\8bतु ।",
        "right-nominornewtalk": "चर्चापुटानां लघुसम्पादनं न भवतु । नूतनसन्देशान् चोदयतु ।",
        "right-apihighlimits": "API प्रश्नेषु उन्नतसीमम् उपयोजयतु ।",
        "right-writeapi": "श्वेतं API उपयोगः ।",
        "log-title-wildcard": "अनेन पाठेन आरब्धानि शीर्षकानि अन्विषतु ।",
        "showhideselectedlogentries": "चितप्रवेशावलीः प्रदर्शयतु/गोपयतु ।",
        "allpages": "सर्वाणि पृष्ठानि",
-       "alphaindexline": "$1 तः $2 पर्यन्तम्",
        "nextpage": "($1)अग्रिमपुटम् ।",
        "prevpage": "पूर्वपृष्ठम् ($1)",
        "allpagesfrom": "इत्यस्मात् आरभ्यमाणानि पृष्ठानि दर्श्यन्ताम्:",
        "blockip": "प्रयोक्तारं निरुध्नातु",
        "blockip-legend": "योजकम् अवरुणद्धु ।",
        "blockiptext": "विशिष्टं  IP सङ्केतम् अथवा योजकनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
-       "ipadressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
+       "ipaddressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
        "ipbexpiry": "समाप्तिः :",
        "ipbreason": "कारणम् :",
        "ipbreason-dropdown": "* अवरोधस्य सामान्यानि कारणानि ।  \n** मिथ्या योजकनाम । \n** एकाधिकयोजकस्थानं निर्मीय तेषां दुरुपयोगः । \n** असत्यविषयानाम् उत्तारणम् । \n** पुटेषु अवकरपूरणम् । \n** पुटेभ्यः पदार्थान् अपनयनम् । \n** बाह्यजालस्थानाम् असम्बद्धानुबन्धानाम् संयोजनम् । \n** योजकानां पीडनम् ।",
        "newimages-summary": "एतत् विशेषपुटम् सद्यः उत्तारितसञ्चिकाः दर्शयति ।",
        "newimages-legend": "शोधनी ।",
        "newimages-label": "सञ्चिकानाम (अथवा अस्य भागः)",
-       "showhidebots": "(स्वयं चालकः $1)",
        "noimages": "शून्यदर्शनम् ।",
        "ilsubmit": "अन्वेषणम्",
        "bydate": "दिनाङ्कानुगुणम्",
index 7088a93..8276865 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "ЫйÑ\8bннÑ\8cÑ\8bкÑ\82аÑ\80Ñ\8b аннынан тардыы:",
+       "tog-underline": "СигÑ\8dлÑ\8dÑ\80и аннынан тардыы:",
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
-       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
+       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
-       "tog-numberheadings": "Ð\91аÑ\81 Ñ\82Ñ\8bллаÑ\80Ñ\8b нүөмэрдээ",
-       "tog-showtoolbar": "Көннөрүү үстүрүмүөннэрин көрдөр",
-       "tog-editondblclick": "ХоһÑ\83лаÑ\82ан Ð¸ÐºÐºÐ¸Ñ\82Ñ\8d Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\80Ñ\8dйи Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
-       "tog-editsectiononrightclick": "СиÑ\8dкÑ\81ийÑ\8d Ð±Ð°Ò»Ñ\8bгаÑ\80 Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\8dкÑ\81ийÑ\8dни ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯",
+       "tog-numberheadings": "ТүһүмÑ\8dÑ\85Ñ\82Ñ\8dÑ\80 Ð°Ð°Ñ\82Ñ\82аÑ\80Ñ\8bн нүөмэрдээ",
+       "tog-showtoolbar": "Көннөрүү хапталын көрдөр",
+       "tog-editondblclick": "Хоһулатан баттаан сирэйи уларытыы",
+       "tog-editsectiononrightclick": "ТүһүмÑ\8dÑ\85 Ð±Ð°Ò»Ñ\8bн Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\82үһүмÑ\8dÒ\95и Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
        "tog-watchcreations": "Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис",
        "tog-watchdefault": "Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
-       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү испииһэгэр киллэрэн ис",
+       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchdeletion": "Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-minordefault": "Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ",
        "tog-previewontop": "Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр",
        "tog-enotifminoredits": "Кыра да уларытыы киирдэҕинэ эл. почтанан биллэрээр",
        "tog-enotifrevealaddr": "Мин почтам аадырыһын биллэриилэргэ көрдөр",
        "tog-shownumberswatching": "Сирэйи кэтээн көрөр дьон ахсаанын көрдөр",
-       "tog-oldsig": "Ð\91ааÑ\80 илии баттааһын:",
-       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\8bйÑ\8bннÑ\8cÑ\8bга суох)",
+       "tog-oldsig": "Ð\91илиҥҥи илии баттааһын:",
+       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\81игÑ\8dÑ\82Ñ\8d суох)",
        "tog-uselivepreview": "Хайдах буолуохтааҕын тутатына эрдэ көрүү (тургутуу быһыытынан)",
        "tog-forceeditsummary": "Тугу уларыппытым туһунан суруйбатахпына сэрэт",
-       "tog-watchlisthideown": "Кэтээн көрүү испииһэгэр бэйэм уларытыыларбын көрдөрүмэ",
-       "tog-watchlisthidebots": "Кэтээн көрүү испииһэгэр робот уларытыытын көрдөрүмэ",
+       "tog-watchlisthideown": "Кэтээн көрүү тиһигэр бэйэм уларытыыларбын көрдөрүмэ",
+       "tog-watchlisthidebots": "Кэтээн көрүү тиһигэр робот уларытыытын көрдөрүмэ",
        "tog-watchlisthideminor": "Кыра уларытыылары кэтээмэ",
-       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир испииһэккэ көрдөрүмэ",
+       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
        "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин испииһэгэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "category-article-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт субкатегориялаах.|$2 категорияттан {{PLURAL:$1|субкатегорията|$1 субкатегориялара}} көрдөрүлүннүлэр.}}",
        "category-article-count-limited": "Бу категорияҕа {{PLURAL:$1|1 эрэ сирэй|$1 сирэй}} баар.",
        "category-file-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт билэлээх.|$2 категорияттан {{PLURAL:$1|билэтэ|$1 билэлэрэ}} көрдөрүлүннүлэр.}}",
-       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|биир билэ|$1 билэ}} баар.",
+       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|соҕотох билэ|$1 билэ}} баар.",
        "listingcontinuesabbrev": "(салгыыта)",
-       "index-category": "Индекстаммыт сирэйдэр",
+       "index-category": "Индекстэммит сирэйдэр",
        "noindex-category": "Индексктаммыт сирэйдэр суохтар",
        "broken-file-category": "Билэҕэ сигэлэрэ алҕастаах сирэйдэр",
        "about": "Бу туһунан",
        "talkpagelinktext": "Ырытыы",
        "specialpage": "Анал сирэй",
        "personaltools": "Тус бэйэ туттар туруоруулара",
-       "postcomment": "Саҥа Ñ\81алаа",
+       "postcomment": "Саҥа Ñ\82үһүмÑ\8dÑ\85",
        "articlepage": "Ыстатыйаны көр",
        "talk": "Ырытыы",
        "views": "Көрүүлэр",
        "jumptonavigation": "навигация",
        "jumptosearch": "көрдөөһүн",
        "view-pool-error": "Балаама, билигин бары сиэрбэрдэр туолан тураллар.\nБу сирэйи наһаа элбэх киһи көрүөн баҕарбыт.\nБука диэн, кэтэһэ түһэн баран өссө боруобалаар.\n\n$1",
+       "generic-pool-error": "Балаама, билигин бары сиэрбэрдэр туолан тураллар.\nБу сирэйи наһаа элбэх киһи көрө сатыыр.\nБука диэн, кэтэһэ түһэн баран өссө киирэн көрөөр.",
        "pool-timeout": "Хааччахтааһыны кэтэһии болдьоҕо ааста",
        "pool-queuefull": "Көрдөбүллэри хомуйуу туолбут",
        "pool-errorunknown": "Биллибэт алҕас",
        "badaccess": "Сатаан киирбэтэ",
        "badaccess-group0": "Эн бу дьайыыны оҥорор кыаҕыҥ суох.",
        "badaccess-groups": "Дьайыыны $1 {{PLURAL:$2|бөлөххө|бөлөхтөртөн биирдэстэригэр}} киирэр кыттааччыларылар эрэ оҥорор кыахтаахтар.",
-       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð¸Ñ\8dÑ\80Ñ\81ийÑ\8dÑ\82Ñ\8d Ð½Ð°Ð°Ð´Ð°",
+       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð°Ñ\80Ñ\8bла Ð¸Ñ\80дÑ\8dнÑ\8dÑ\80",
        "versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
        "ok": "Сөп",
        "retrievedfrom": "\"$1\" -н кэллэ",
        "edit-gone-missing": "Сирэйи саҥардар кыах суох.\nАрааһа сотуллубут быһыылаах.",
        "edit-conflict": "Көннөрүүлэр утарсыылара.",
        "edit-no-change": "Эн көннөрүүҥ киирбэтэ, тоҕо диэтэххэ тугу да уларыппатаххын.",
+       "postedit-confirmation-created": "Сирэй оҥоһулунна.",
+       "postedit-confirmation-restored": "Сирэй сөргүтүлүннэ.",
        "postedit-confirmation-saved": "Көннөрүүҥ бигэргэннэ.",
        "edit-already-exists": "Саҥа сирэйи оҥорор табыллыбат.\nМаннык сирэй баар эбит.",
        "defaultmessagetext": "Туспа этиллибэтэҕинэ суруллар тиэкис",
        "action-createpage": "сирэйдэри оҥоруу",
        "action-createtalk": "ырытыы сирэйдэрин оҥоруу",
        "action-createaccount": "кыттааччы бу бэлиэтэнэр аатын оҥоруу",
+       "action-history": "сирэй устуоруйатын көрүү",
        "action-minoredit": "бу уларытыыны суолтата суох курдук бэлиэтээ",
        "action-move": "бу сирэй аатын уларытыы",
        "action-move-subpages": "бу сирэй уонна кини аннынааҕы сирэйдэр ааттарын уларытыы",
        "pageswithprop-prophidden-binary": "бинаар суолта кистэммит ($1)",
        "doubleredirects": "Хос көһөрөөһүн",
        "doubleredirectstext": "Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.\nХас устуруока аайы бастакы уонна иккис утаарыга сигэ баар, ону таһынан иккис утаарыыга баар сирэй аадырыһа (аата) баар, ол аата бастакы утаарыы дьиҥинэн ханна утаарыахтааҕа көстөр.\n<del>Сотуллубут</del> суруктар көннөрүллүбүттэр.",
-       "double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт, билигин манна утаарар [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт.\nАптамаатынан саҥардыллыбыт уонна бу сирэйгэ утаарар [[$2]].",
        "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү.",
        "double-redirect-fixer": "Утаарыылары көннөрөөччү",
        "brokenredirects": "Быстыбыт көһөрүүлэр",
        "log-title-wildcard": "Бу сурук бэлиэлэриттэн (буукубалартан) саҕаланар ааттары бул",
        "showhideselectedlogentries": "Талыллыбыт суруктары кистээ/көрдөр",
        "allpages": "Сирэйдэр барыта",
-       "alphaindexline": "мантан $1 маныаха дылы $2",
        "nextpage": "Аныгыскы сирэй ($1)",
        "prevpage": "Бу иннинээҕи сирэй ($1)",
        "allpagesfrom": "Мантан саҕаланар сирэйдэри көрдөр:",
        "blockip": "IP аадырыстан киириини бобуу",
        "blockip-legend": "Кыттааччыны хааччахтааһын",
        "blockiptext": "Ханнык эмит IP-ттан суруйары манна баар форманы туһанан боп.\nВандализмы утаран уонна [[{{MediaWiki:Policy-url}}]]\nбыраабылалрын тутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, вандализм баар сирэйдэриттэн\nбыһа тардан манна көрдөр).",
-       "ipadressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
+       "ipaddressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
        "ipbexpiry": "Түмүктэниэ:",
        "ipbreason": "Төрүөтэ:",
        "ipbreason-dropdown": "* Бобуу сүрүн биричиинэлэрэ\n** Сымыйаны суруйуу\n** Сирэй иһинээҕитин суох оҥоруу\n** Тас саайтарга спам-ыйынньыктары олордуу\n** Туох да суолтата суох тиэкиһи суруйуу\n** Кыттааччыларга суоһурҕаныы, күөмчүлээһин\n** Хас да аатынан киирэн куһаҕаны оҥоруу\n** Бүрүкүтэ суох ааттаныы",
        "change-blocklink": "хааччахтааһыны уларытыы",
        "contribslink": "вклад",
        "emaillink": "суругу ыыт",
-       "autoblocker": "Эн IP-ҥ \"[[User:$1|$1]]\" кыттааччыны кытта биир буолан, эн эмиэ хааччахтаныыга түбэстиҥ. Кини хааччахтаммыт төрүөтэ: \"$2\"",
+       "autoblocker": "Эн IP-гын \"[[User:$1|$1]]\" кыттааччы туһаммыт буолан, эн эмиэ хааччахтаныыга түбэспиккин. \n$1 хааччахтаныытын төрүөтэ: \"$2\"",
        "blocklogpage": "Хааччахтааһын/бобуу сурунаала",
        "blocklog-showlog": "Бу кыттааччы бэлиэр хааччахтаммыт. Хааччах сурунаала аллара көстөр:",
        "blocklog-showsuppresslog": "Бу кыттааччы бэлиэр хааччахтаммыт уонна аата кистэммит. Аат кистээһин сурунаала аллара көстөр:",
        "spam_reverting": "Манна: $1 ыйынньыга суох бүтэһик торуму сөргүтүү (төннөрүү)",
        "spam_blanking": "Бары торумнар манна \"$1\" ыйынньыктаахтар, барытын суох оҥоруу",
        "spam_deleting": "Бары барыллар манна \"$1\" сигэнэллэр эит, сотуу бара турар",
-       "simpleantispam-label": "Анти-спам бэрэбиэркэтэ.\nМаны '''толорумаҥ'''!",
+       "simpleantispam-label": "Анти-спам бэрэбиэркэтэ.\nМаны <strong>толорума</strong>!",
        "pageinfo-title": "\"$1\" туһунан",
        "pageinfo-not-current": "Баалаама, эргэ барылларга манныгы көрдөрөр сатаммат эбит.",
        "pageinfo-header-basic": "Сүрүн сибидиэнньэлэр",
        "newimages-summary": "Бу анал сирэй киллэриллибит билэлэр испииһэктэрин көрдөрөр.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Билэ аата (эбэтэр сорҕото):",
-       "showhidebots": "($1 робот)",
        "noimages": "Ойуу суох.",
        "ilsubmit": "Көрдөт",
        "bydate": "айыллыбыт кэминэн",
        "htmlform-no": "Суох",
        "htmlform-yes": "Сөп",
        "htmlform-chosen-placeholder": "Барылы тал",
+       "htmlform-cloner-create": "Өссө эп",
+       "htmlform-cloner-delete": "Сот",
+       "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
        "sqlite-has-fts": "$1 толору тиэкистээх көрдөөһүнү өйүүр",
        "sqlite-no-fts": "$1 толору тиэкистээх көрдөөһүнү өйөөбөт",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
index 4e3c799..3cbd84d 100644 (file)
        "blockip": "Blocca l'utenti",
        "blockip-legend": "Blocca l'utenti",
        "blockiptext": "Usa lu mòdulu cassutta pi bluccari la pussibbilità di scrìviri pi n'utenti o pi nu ndirizzu IP spicìficu. Chistu s'havi a fari sulu pi privèniri lu vannalismu e secunnu la [[{{MediaWiki:Policy-url}}|pulìtica di {{SITENAME}}]]. Scrivi na raggiùni valida ccà sutta (pi asempiu, cita li pàggini chi foru vannalizzati).",
-       "ipadressorusername": "Ndirizzu IP o nomu utenti:",
+       "ipaddressorusername": "Ndirizzu IP o nomu utenti:",
        "ipbexpiry": "Durata dû bloccu:",
        "ipbreason": "Mutivu:",
        "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzerimentu di nformazziuni falsi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumozziunalu a siti sterni\n** Nzserimentu di cuntinuti privi di sensu\n** Cumportamenti ntimidatori o molestie\n** Usu ndebitu di cchiù cunti\n** Nomu utenti nun accittabbili",
        "newimages-summary": "Sta pàggina spiciali ammustra li file caricati di cchiù picca tempu.",
        "newimages-legend": "Nomu file",
        "newimages-label": "Nomu file (o nu pezzu d'iddu):",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nenti a vìdiri.",
        "ilsubmit": "Va' cerca",
        "bydate": "pi data",
index e02ec51..9ee5020 100644 (file)
        "uploadstash-refresh": "Refresh the leet o files",
        "invalid-chunk-offset": "Onvalid chunk affset",
        "img-auth-accessdenied": "Access denied.",
-       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server isna set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server is no set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Requested path isna in the confeegured uplaid directerie.",
        "img-auth-badtitle": "Onable tae cræft ae valid title fae \"$1\".",
        "img-auth-nologinnWL": "Ye'r naw loggit in n \"$1\" isna in the whiteleet.",
        "log-title-wildcard": "Rake titles stairtin wi this tex",
        "showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
        "allpages": "Aw pages",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neis page ($1)",
        "prevpage": "Aforegaun page ($1)",
        "allpagesfrom": "Shaw pages stairtin at:",
        "enotif_lastvisited": "Hae ae leuk at $1 fer aa chynges sin yer laist veesit.",
        "enotif_lastdiff": "See $1 tae see this chynge.",
        "enotif_anon_editor": "anonymoos uiser $1",
-       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTaae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n$HELPPAGE",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n$HELPPAGE",
        "created": "cræftit",
        "changed": "chynged",
        "deletepage": "Delyte page",
        "blockip": "Block uiser",
        "blockip-legend": "Block uiser",
        "blockiptext": "Uise the form ablo tae block write access fae ae speceefic IP address or uisername. This shid be dun juist tae hinder vandaleesm, n in accord wi [[{{MediaWiki:Policy-url}}|policie]]. Fil in ae speceefic raison ablo (fer exemplar, citin parteecular pages that were vandalised).",
-       "ipadressorusername": "IP address or uisername:",
+       "ipaddressorusername": "IP address or uisername:",
        "ipbexpiry": "Expirie:",
        "ipbreason": "Raison:",
        "ipbreason-dropdown": "*Commyn block raisons\n** Insertin false information\n** Remuivin content fae pages\n** Spammin airtins til ootby steids\n** Insertin nonsense/gibberish intil pages\n** Inteemidatin behavier/harassment\n** Abuisin multiple accoonts\n** Onacceptable uisername",
index 0a41379..67d9eab 100644 (file)
        "whatlinkshere-hideimages": "$1 liadduri a file",
        "whatlinkshere-filters": "Filthri",
        "blockip": "Brocca utenti",
-       "ipadressorusername": "Indirizzu IP o innòmu utenti:",
+       "ipaddressorusername": "Indirizzu IP o innòmu utenti:",
        "ipbexpiry": "Ischadènzia di lu broccu:",
        "ipbreason": "Mutibu di lu broccu:",
        "ipbcreateaccount": "Impidisci la criazioni d'althri registhrazioni",
        "show-big-image": "File d'orìgini",
        "newimages": "Galleria di li file nobi",
        "imagelisttext": "Inogghi una listha di '''$1''' {{PLURAL:$1|file|file}} ordhinaddi pa $2.",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nò v'è nudda da vidé.",
        "ilsubmit": "Zercha",
        "bydate": "data",
index 3429490..fd23386 100644 (file)
        "protectedpagetext": "Šėts poslapis īr ožrakints, saugont anū nū redagavėma.",
        "viewsourcetext": "Tomsta galėt veizietė ėr kopėjoutė poslapė kuoda:",
        "protectedinterface": "Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.",
-       "editinginterface": "'''Diemesė:''' Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
+       "editinginterface": "<strong>Diemesė:</strong> Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
        "namespaceprotected": "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
        "ns-specialprotected": "Specēlė̅ jė poslapē negal būtė keitamė.",
        "logouttext": "'''Daba Tamsta esat atsėjongės.'''\n\nGalat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba <span class='plainlinks'>[$1 prisėjonkat]</span> ėš naujė šėtuo patiu a kėto nauduotuojė vardu.\nPastebiejims: katruos nekatruos poslapiuos ė tuoliau gal ruodītė būktā būtomiet prisėjongės lėgė tuol, kumet ėšvalīsėt sava naršīklės dietovė (''cache'').",
        "recreate-moveddeleted-warn": "'''Parspiejėms: Tamsta ikeliat faila, katros onkstiau bova ėštrėnts.'''\n\nTamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.\nTuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
        "moveddeleted-notice": "Tas poslapis bova ėštrėnts.\nĖštrėnta poslapė versėju sārašos īr pateikts paveiziejėmō žemiau.",
        "edit-conflict": "Redagavėma kuonflėktos",
-       "postedit-confirmation": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
+       "postedit-confirmation-saved": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
        "post-expand-template-inclusion-warning": "Perspiejėms: Šabluonu īterpėma dėdoms īr par dėdelis.\nKāp katrėi šabluonā nebus ītrauktė.",
        "post-expand-template-inclusion-category": "Poslapē, kur šabluonu īterpėma dėdoms viršėjams",
        "post-expand-template-argument-warning": "Perspiejėms: Tas poslapis tor nuors vėina šabluona argomenta, katros tor per dėdli ėšplietėma dėdoma.\nTė argomentā bova praleistė.",
        "log-title-wildcard": "Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto",
        "showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
        "allpages": "Vėsė straipsnē",
-       "alphaindexline": "Nu $1 lėg $2",
        "nextpage": "Kėts poslapis ($1)",
        "prevpage": "Unkstesnis poslapis ($1)",
        "allpagesfrom": "Ruodītė poslapius pradedont nu:",
        "blockip": "Ožblokoutė nauduotuoja",
        "blockip-legend": "Blokoutė nauduotuoja",
        "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
-       "ipadressorusername": "IP adresos a nauduotuojė vards",
+       "ipaddressorusername": "IP adresos a nauduotuojė vards",
        "ipbexpiry": "Galiuojėma čiesos",
        "ipbreason": "Prīžastis:",
        "ipbreason-dropdown": "*Dažniausės bluokavėma prižastīs\n** Melagėngas infuormacėjės rašīms\n** Torėnė trīnims ėš poslapiu\n** Spaminims\n** Zaunu/bikuo rašīms i poslapios\n** Gondinėmā/Pėktžuodiavėmā\n** Pėktnaudžiavėms paskėruomis\n** Netėnkams nauduotuojė vards",
        "newimages": "Naujausiu abruozdieliu galerėjė",
        "imagelisttext": "Žemiau īr '''$1''' failu sārašos, sorūšiouts $2.",
        "newimages-label": "Faila vards (ar anuo dalis):",
-       "showhidebots": "($1 robotos)",
        "ilsubmit": "Ėiškoutė",
        "bydate": "palē data",
        "sp-newimages-showfrom": "Ruodītė naujus abruozdielius pradedant nū $2, $1",
index 6ced5ea..118f7cf 100644 (file)
        "blockip": "Blokiraj korisnika",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  \nOvo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. \nUnesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su vandalizovane).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Unošenje netačnih informacija\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
        "newimages-summary": "Ova posebna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži / Тражи",
        "bydate": "po datumu",
index 57f079e..ad24932 100644 (file)
        "logempty": "ලඝු-සටහනෙහි ගැලපෙන අයිතමයන් කිසිවක් නොමැත.",
        "log-title-wildcard": "මෙම පෙළෙන් ඇරඹෙන ශීර්ෂ සඳහා ගවේෂණය කරන්න",
        "allpages": "සියළු පිටු",
-       "alphaindexline": "$1 සි‍ට $2 වෙත",
        "nextpage": "මීළඟ පිටුව ($1)",
        "prevpage": "පෙර පිටුව ($1)",
        "allpagesfrom": "මෙහිදී ඇරඹෙන පිටු පෙන්වන්න:",
        "blockip": "පරිශීලකයා වාරණය කරන්න",
        "blockip-legend": "වාරණයකල පරිශීලක",
        "blockiptext": "විශේෂිත අන්තර්ජාල ලිපිනයකින් හෝ ප්‍රතිශීලක නාමයකින් ලිවීම් ප්‍රවේශය වාරණය කෙරුමට පහත ආකෘති පත්‍රය භාවිතා කරන්න.\nවන්ධල්‍යය වැලැක්වීමේ හුදු  අභිලාෂයෙන් හා, [[{{MediaWiki:Policy-url}}|ප්‍රතිපත්ති]] ප්‍රකාරව මෙය සිදුකල යුත්තේය.\nවිශේෂිත  හේතුවක් මෙහි පහත ඇතුලත් කරන්න (නිදසුනක් ලෙස, වන්ධල්‍ය්‍යට ලක්වුනු විශේෂිත පිටු හඳුන්වමින්).",
-       "ipadressorusername": "පරිශීලක නාමය හෝ IP ලිපිනය:",
+       "ipaddressorusername": "පරිශීලක නාමය හෝ IP ලිපිනය:",
        "ipbexpiry": "කල් ඉකුත්වීම:",
        "ipbreason": "හේතුව:",
        "ipbreason-dropdown": "*සාමාන්‍ය වාරණ හේතූන්\n** සාවද්‍ය තොරතුරු බහාලීම\n** පිටුවලින් අන්තර්ගතය ඉවත්කිරීම\n** බාහිර අඩවි වෙත අයාචිත-තැපැල් සබැඳියන්\n** විප්‍රලාප /පල්හෑලි පිටු තුලට බහාලීම\n** තැතිගන්වනසුළු  හැසිරීම/හිරිහැරකිරීම\n** බහුගණ ගිනුම් අපයෙදුම\n** නොපිළිගතහැකි පරිශීලකනාමය",
        "newimages-summary": "මෙම විශේෂ පිටුව, අවසානයට උඩුගත කෙරුණු ගොනු පෙන්වයි.",
        "newimages-legend": "පෙරහන",
        "newimages-label": "ගොනු නාමය (හෝ එයින් කොටසක්):",
-       "showhidebots": "(රොබෝ $1 දෙනෙක්)",
        "noimages": "පෙනෙන්නට කිසිවක් නොමැත.",
        "ilsubmit": "ගවේෂණය",
        "bydate": "දිනය මගිනි",
        "watchlistedit-raw-done": "ඔබගේ මුර-ලැයිස්තුව යාවත්කාලීන කරන ලදි.",
        "watchlistedit-raw-added": "{{PLURAL:$1|ශීර්ෂ 1 ක් |ශීර්ෂ  $1 ක් }} එක් කරන ලදි:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ශීර්ෂ 1 ක්|ශීර්ෂ  $1 ක්}} ඉවත් කරන ලදි:",
+       "watchlistedit-clear-titles": "ශීර්ෂයන්:",
        "watchlisttools-view": "අදාල වෙනස්වීම් නරඹන්න",
        "watchlisttools-edit": "මුර ලැයිස්තුව නැරඹීම හා සංස්කරණය",
        "watchlisttools-raw": "නොනිමි මුර ලැයිස්තුව සංස්කරණය කරන්න",
index 6151b45..f53d289 100644 (file)
        "log-title-wildcard": "Hľadať názvy začínajúce týmto textom",
        "showhideselectedlogentries": "Zobraziť/skryť vybraté položky záznamu",
        "allpages": "Všetky stránky",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Ďalšia stránka ($1)",
        "prevpage": "Predchádzajúca stránka ($1)",
        "allpagesfrom": "Zobraziť stránky od:",
        "blockip": "Zablokovať používateľa",
        "blockip-legend": "Zablokovať používateľa",
        "blockiptext": "Použite tento formulár na zablokovanie možnosti zápisov uskutočnených z konkrétnej IP adresy alebo od používateľa.\nMali by ste to urobiť len v prípade bránenia vandalizmu a v súlade so [[{{MediaWiki:Policy-url}}|zásadami a smernicami {{GRAMMAR:genitív|{{SITENAME}}}}]].\nNižšie uveďte konkrétny dôvod (napríklad uveďte konkrétne stránky, ktoré padli za obeť vandalizmu).",
-       "ipadressorusername": "IP adresa/meno používateľa:",
+       "ipaddressorusername": "IP adresa/meno používateľa:",
        "ipbexpiry": "Ukončenie:",
        "ipbreason": "Dôvod:",
        "ipbreason-dropdown": "* Bežné dôvody blokovania\n** Zámerné vkladanie chybných informácií\n** Mazanie obsahu stránok\n** Spam odkazy na externé stránky\n** Vkladanie nezmyslov do stránok\n** Zastrašujúce správanie/obťažovanie\n** Zneužívanie viacerých účtov\n** Neprípustné používateľské meno",
        "newimages-summary": "Táto špeciálna stránka zobrazuje posledné nahrané súbory.",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
-       "showhidebots": "($1 botov)",
        "noimages": "Niet čo zobraziť.",
        "ilsubmit": "Hľadať",
        "bydate": "podľa dátumu",
index ac042a3..42ed906 100644 (file)
@@ -21,8 +21,8 @@
        "tog-showtoolbar": "Prikaži urejevalno orodno vrstico",
        "tog-editondblclick": "Omogoči urejanje strani z dvojnim klikom",
        "tog-editsectiononrightclick": "Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov",
-       "tog-watchcreations": "Vse ustvarjene strani in moje naložene datoteke dodaj na spisek nadzorov",
-       "tog-watchdefault": "Dodaj na spisek nadzorov vse članke in datoteke, ki sem jih spremenil/-a",
+       "tog-watchcreations": "Na spisek nadzorov dodaj vse ustvarjene strani in moje naložene datoteke",
+       "tog-watchdefault": "Na spisek nadzorov dodaj vse članke in datoteke, ki sem jih spremenil/-a",
        "tog-watchmoves": "Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov",
        "tog-watchdeletion": "Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov",
        "tog-minordefault": "Vsa urejanja označi kot manjša",
@@ -40,8 +40,8 @@
        "tog-watchlisthideown": "Na spisku nadzorov skrij moja urejanja",
        "tog-watchlisthidebots": "Na spisku nadzorov skrij urejanja botov",
        "tog-watchlisthideminor": "Na spisku nadzorov skrij manjša urejanja",
-       "tog-watchlisthideliu": "Skrij urejanja prijavljenih uporabnikov na spisku nadzorov",
-       "tog-watchlisthideanons": "Skrij urejanja anonimnih uporabnikov na spisku nadzorov",
+       "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
+       "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "recentchangescount": "Privzeto število prikazanih urejanj:",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
-       "savedprefs": "Spremembe so uspešno shranjene.",
+       "savedprefs": "Spremembe smo uspešno shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "right-move": "Premikanje strani",
        "right-move-subpages": "Premikanje strani s pripadajočimi podstranmi",
        "right-move-rootuserpages": "Premikanje korenskih uporabniških strani",
+       "right-move-categorypages": "Prestavljanje strani kategorij",
        "right-movefile": "Premikanje datotek",
        "right-suppressredirect": "Možnost izpuščanja preusmeritve pri premikanju strani",
        "right-upload": "Nalaganje datotek",
        "action-move": "premik te strani",
        "action-move-subpages": "premik te strani in njenih podstrani",
        "action-move-rootuserpages": "premik korenskih uporabniških strani",
+       "action-move-categorypages": "prestavljanje strani kategorij",
        "action-movefile": "premik te datoteke",
        "action-upload": "nalaganje te datoteke",
        "action-reupload": "prepis obstoječe datoteke",
        "log-title-wildcard": "Iskanje po naslovih, začenši s tem besedilom",
        "showhideselectedlogentries": "Pokaži/skrij izbrane dnevniške vnose",
        "allpages": "Vse strani",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Naslednja stran ($1)",
        "prevpage": "Prejšnja stran ($1)",
        "allpagesfrom": "Prikaži strani, ki se začnejo na:",
        "blockip": "Blokiranje IP-naslova ali uporabniškega imena",
        "blockip-legend": "Blokiraj uporabnika",
        "blockiptext": "Naslednji obrazec vam omogoča, da določenemu IP-naslovu ali uporabniškemu imenu preprečite urejanje.\nTo storimo le zaradi zaščite pred nepotrebnim uničevanjem in po [[{{MediaWiki:Policy-url}}|pravilih]].\nVnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotrebnem kvaril).",
-       "ipadressorusername": "IP-naslov ali uporabniško ime",
+       "ipaddressorusername": "IP-naslov ali uporabniško ime",
        "ipbexpiry": "Pretek",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Razlogi za blokado\n** vandalizem\n** dodajanje napačnih/lažnih podatkov\n** brisanje strani\n** dodajanje nepotrebnih zunanjih povezav\n** dodajanje neumnosti v besedilo\n** nadlegovanje/osebni napadi\n** neprimerno uporabniško ime",
        "movepagetalktext": "Če obstaja, bo samodejno prestavljena tudi pripadajoča pogovorna stran, '''razen kadar'''\n*pod novim imenom že obstaja neprazna pogovorna stran ali\n*ste odkljukali spodnji okvirček.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali povezati ročno.",
        "movearticle": "Prestavi stran:",
        "moveuserpage-warning": "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
+       "movecategorypage-warning": "<strong>Opozorilo:</strong> Prestavili boste stran kategorije. Pomnite, da boste prestavili samo stran; vse strani v stari kategoriji <em>ne</em> bomo prekategorizirali v novo kategorijo.",
        "movenologintext": "Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].",
        "movenotallowed": "Za prestavljanje strani nimate dovoljenja.",
        "movenotallowedfile": "Nimate dovoljenja, da premikate datoteke.",
        "cant-move-user-page": "Nimate dovoljenja, da premikate uporabniške strani (razen podstrani).",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
+       "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
+       "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
        "newtitle": "Na naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "newimages-summary": "Ta posebna stran prikazuje najnovejše naložene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ali njen del):",
-       "showhidebots": "($1 bote)",
+       "newimages-showbots": "Prikaži nalaganja botov",
        "noimages": "Nič ni videti.",
        "ilsubmit": "Išči",
        "bydate": "po datumu",
        "watchlistedit-normal-explain": "Strani na vašem spisku nadzorov so prikazane spodaj.\nDa odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].",
        "watchlistedit-normal-submit": "Odstrani strani",
        "watchlistedit-normal-done": "Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:",
-       "watchlistedit-raw-title": "urejanje golega spiska nadzorov",
+       "watchlistedit-raw-title": "Urejanje golega spiska nadzorov",
        "watchlistedit-raw-legend": "Uredi gol spisek nadzorov",
        "watchlistedit-raw-explain": "Strani na vašem spisku nadzorov so prikazane spodaj in jih lahko urejate z dodajanjem in odstranjevanjem s seznama; vsak naslov je v svoji vrstici.\nKo končate, kliknite »{{int:Watchlistedit-raw-submit}}«.\nUporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].",
        "watchlistedit-raw-titles": "Strani:",
        "watchlistedit-raw-done": "Vaš spisek nadzorov je bil posodobljen.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Dodana je bila $1 stran|Dodani sta bili $1 strani|Dodane so bile $1 strani|Dodanih je bilo $1 strani}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Odstranjena je bila $1 stran|Odstranjeni sta bili 2 strani|Odstranjene so bile $1 strani|Odstranjenih je bilo $1 strani}}:",
-       "watchlisttools-view": "oglej si ustrezne spremembe",
-       "watchlisttools-edit": "prikaz in urejanje spiska nadzorov",
+       "watchlistedit-clear-title": "Čiščenje spiska nadzorov",
+       "watchlistedit-clear-legend": "Počistite spisek nadzorov",
+       "watchlistedit-clear-explain": "Vse naslove bomo odstranili z vašega spiska nadzorov",
+       "watchlistedit-clear-titles": "Naslovi:",
+       "watchlistedit-clear-submit": "Počisti spisek nadzorov (To je trajno!)",
+       "watchlistedit-clear-done": "Vaš spisek nadzorov smo počistili.",
+       "watchlistedit-clear-removed": "Odstranili smo $1 {{PLURAL:$1|naslov|naslova|naslove|naslovov}}:",
+       "watchlistedit-too-many": "Obstaja preveč strani, da bi jih tukaj prikazali.",
+       "watchlisttools-clear": "Počisti spisek nadzorov",
+       "watchlisttools-view": "Oglej si ustrezne spremembe",
+       "watchlisttools-edit": "Prikaz in urejanje spiska nadzorov",
        "watchlisttools-raw": "Uredi gol spisek nadzorov",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])",
        "unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
index fd4d645..cf37864 100644 (file)
        "blockip": "IP-Atresse/Benutzer sperra",
        "blockip-legend": "IP-Atresse/Benutzer sperra",
        "blockiptext": "Mit diesem Formular sperrst du anne IP-Atresse oder an'n Nutzernoama, su doaß vu dort kenne Änderunga meh vorgenumma waan kinna.\nDies sullte ock erfolga, im Vandalismus zu verhindern und ei Iebereinstimmung miet dann [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib dann Grund fier de Sperre oa.",
-       "ipadressorusername": "IP-Atresse oder Benutzernoame:",
+       "ipaddressorusername": "IP-Atresse oder Benutzernoame:",
        "ipbreason": "Begriendung:",
        "ipbreason-dropdown": "* Allgemeene Sperrgrinde\n** Eenfiega foalscher Informationen\n** Laara vu Seita\n** Fiegt massenweise externe Links a\n** Einstalla unsinniger Inhalte ei Seita \n** bedrohliches Verhaala/Belästigung\n** Missbrauch durch mehrere Nutzerkonten\n** Ungeeigneter Nutzernoame",
        "ipbcreateaccount": "Erstellung vu Nutzerkonten verhindern",
index aca2189..232f1ce 100644 (file)
        "grouppage-sysop": "{{ns:project}}:Maamulada",
        "right-read": "Akhri maqaalada",
        "right-edit": "Wax ka bedel bogyaalo",
+       "right-createpage": "Samaynta bogag (taasoo aan lahayn bogag wadahadal)",
+       "right-createtalk": "Samaynta bogagga wadahadalka",
+       "right-createaccount": "Samaynta akoon isticmaale cusub",
+       "right-minoredit": "Calaamaynta bedelka yar",
        "right-move": "Wareeji maqaalada",
        "right-upload": "Soo geli fayl",
+       "right-writeapi": "Adeegsiga API ee qorista",
        "right-delete": "Tirtir maqaalada",
        "right-bigdelete": "Tirtir maqaalada taariikhda dheer leh",
        "right-browsearchive": "Raadi maqaalada la tirtiray",
        "right-undelete": "Ha tirtirin bog",
+       "right-editmyusercss": "Bedel galalka CSS ee isticmaalaha laftiisa",
+       "right-editmyuserjs": "Bedel galalka JavaScript ee isticmaalaha laftiisa",
+       "right-viewmywatchlist": "Egista liiska waardiyaha",
+       "right-editmywatchlist": "Bedel liiska waardiyaha. Eeg qaybo ka mid ah dhaqdhaqaaqa in aan weli lagu kordhin haddi uusan jirin xitaa xaqaan.",
+       "right-viewmyprivateinfo": "Eegista macluumaadka gaarka ah (sida ciwaanka e-mail-ka, iyo magaca saxda ah)",
+       "right-editmyprivateinfo": "Bedel macluumaadka gaarka ah (sida. ciwaanka e-mail-ka , iyo magaca saxda ah)",
+       "right-editmyoptions": "Bedelka dooqyada",
        "newuserlogpage": "Gudagalaha Isticmaale sameeyay",
        "action-read": "akhri boggaan",
        "action-edit": "wax ka bedel boggaan",
        "action-createpage": "sameey bogyaalo",
+       "action-createtalk": "Samaynta bogagga wadahadalka",
        "action-upload": "soo geli file'kaan",
        "action-delete": "tirtir boggaan",
        "action-browsearchive": "Raadi maqaalada la tirtiray",
        "booksources-go": "Soco",
        "log": "Guda galayaasha",
        "allpages": "Dhamaan bogagga",
-       "alphaindexline": "$1 ilaa $2",
        "nextpage": "Bogga ku xiga ($1)",
        "prevpage": "Bogga ka horeeyo ($1)",
        "allpagesfrom": "Soosaar boggaga ka bilaawda:",
        "listusers-submit": "I'tus",
        "listusers-noresult": "Lama helin isticmaale.",
        "listusers-blocked": "(waa la mamnuucay)",
+       "listgrouprights": "Xuquuqaha koox isticmaalada",
+       "listgrouprights-summary": "Kani waa liiska koox isticmaale yaal ah ee la aqoonsaday wikigaan, in ay leeyihiin xuquuqdaan.\nWaxaa laga yaabaa in ay halkaan ku jiraan [[{{MediaWiki:Listgrouprights-helppage}}|macluumaad dheeraad ah]] ee ku saabsan xuquuqaha kala gadisan.",
+       "listgrouprights-key": "Ciwaanka:\n* <span class=\"listgrouprights-granted\">Xuquuq la siiyey</span>\n* <span class=\"listgrouprights-revoked\">Xuquuq laga qaaday</span>",
+       "listgrouprights-group": "Kooxda",
+       "listgrouprights-rights": "Xuquuqaha",
        "listgrouprights-members": "(Inta ka mid ah liiskooda)",
        "mailnologin": "Ma'jiro cinwaan wax lagu diro",
        "mailnologintext": "Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]\nkuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],\nsi aad ugu dirto E-boosto isticmaalayaasha kale.",
        "metadata-help": "Faylkaan wuxuu leeyahay  faah faahin dheeraad ah,waxaa laga yaabaa in lagu  isticmaalay digital kaamiro ama skanner oo lagu sameeyo sawir ama lagu digitilays gareeyay.\nHadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in ee  faah faahinta faylkaan eesan dhameestirneen.",
        "metadata-fields": "Sawirka qeybihiisa metadata oo ku tixan fariintaan waxaa lagu dari doonaa bogga sawirka meesha laga arko markii miiska metadata la qariyo.Kuwa kale waxaa loo qarinaa sida default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-iimcategory": "Qeybta",
+       "exif-dc-rights": "Xuquuqaha",
        "watchlistall2": "dhamaan",
        "namespacesall": "dhamaan",
        "monthsall": "Dhamaan",
        "fileduplicatesearch-legend": "Raadi mid tusaale ah",
        "fileduplicatesearch-submit": "Raadi",
        "specialpages": "bogagga khaaska ah",
+       "specialpages-note-top": "Furaha",
        "specialpages-group-pages": "liiska maqaalada",
        "blankpage": "Bog masaxan",
        "tag-filter": "[[Special:Tags|Filtaraha]] tag:",
index ca2cefa..ae8507d 100644 (file)
        "blockip": "Blloko përdorues",
        "blockip-legend": "Blloko përdoruesin",
        "blockiptext": "Përdorni formularin e mëposhtëm për të hequr lejen e shkrimit për një përdorues ose IP specifike.\nKjo duhet bërë vetëm në raste vandalizmi, dhe në përputhje me [[{{MediaWiki:Policy-url}}|rregullat e {{SITENAME}}-s]].\nPlotësoni arsyen specifike më poshtë (p.sh., tregoni faqet specifike që u vandalizuan).",
-       "ipadressorusername": "Adresë IP ose emër përdoruesi",
+       "ipaddressorusername": "Adresë IP ose emër përdoruesi",
        "ipbexpiry": "Afati",
        "ipbreason": "Arsyeja:",
        "ipbreason-dropdown": "*Arsyet më të shpeshta të bllokimit\n** Postimi i informacioneve të rreme\n** Largimi i përmbajtjes së faqes\n** Futja e lidhjeve \"spam\"\n** Futja e informatave pa kuptim në faqe\n** Sjellje arrogante/perverze\n** Përdorimi i më shumë llogarive të përdoruesve\n** Nofkë të papranueshme",
        "newimages-summary": "Kjo faqe speciale tregon skedat e ngarkuara së fundmi.",
        "newimages-legend": "Filtrues",
        "newimages-label": "Emri i skedës (ose një pjesë e tij):",
-       "showhidebots": "($1 robotët)",
        "noimages": "S'ka gjë për të parë.",
        "ilsubmit": "Kërko",
        "bydate": "datës",
index d4c62a2..01cba00 100644 (file)
        "retypenew": "Потврда лозинке:",
        "resetpass_submit": "Постави лозинку и пријави ме",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
+       "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "resetpass_forbidden": "Лозинка не може бити промењена",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
        "changeemail-cancel": "Откажи",
+       "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
+       "resettokens": "Ресетује токене",
+       "resettokens-no-tokens": "Нема токена за ресетовање.",
+       "resettokens-legend": "Ресетује токене",
        "resettokens-tokens": "Токени:",
        "resettokens-token-label": "$1 (тренутна вредност: $2)",
+       "resettokens-watchlist-token": "Токен за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
+       "resettokens-done": "Токени су ресетовани",
+       "resettokens-resetbutton": "Ресетуј изабране токене",
        "bold_sample": "Подебљан текст",
        "bold_tip": "Подебљан текст",
        "italic_sample": "Искошени текст",
        "edit-gone-missing": "Не могу да ажурирам страницу.\nИзгледа да је обрисана.",
        "edit-conflict": "Сукоб измена.",
        "edit-no-change": "Ваша измена је занемарена јер није било никаквих измена у тексту.",
+       "postedit-confirmation-created": "Страница је направљена.",
+       "postedit-confirmation-restored": "Страница је враћена.",
        "postedit-confirmation-saved": "Ваша измена је сачувана.",
        "edit-already-exists": "Не могу да направим страницу.\nИзгледа да она већ постоји.",
        "defaultmessagetext": "Подразумевани текст поруке",
        "invalid-content-data": "Неисправни подаци садржаја",
        "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
        "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили.\nАко сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
+       "editpage-notsupportedcontentformat-title": "Формат садржаја није подржан",
        "content-model-wikitext": "викитекст",
        "content-model-text": "чист текст",
        "content-model-javascript": "јаваскрипт",
        "undo-success": "Измена се може вратити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због конфликта измена.",
        "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.",
+       "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccounttitle": "Не могу да отворим налог",
        "revertmerge": "растави",
        "mergelogpagetext": "Испод је списак најскоријих спајања историја двеју страница.",
        "history-title": "Историја измена странице „$1“",
-       "difference-title": "Разлика између измена на страници „$1“",
+       "difference-title": "$1 — разлика између измена",
        "difference-title-multipage": "Разлика између страница „$1“ и „$2“",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "shown-title": "Прикажи $1 {{PLURAL:$1|резултат|резултата|резултата}} по страници",
        "viewprevnext": "Погледај ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Постоји и чланак под називом „[[:$1]]“.'''",
-       "searchmenu-new": "'''Направите страницу „[[:$1]]“.'''",
+       "searchmenu-new": "<strong>Направите страницу „[[:$1]]“!</strong> {{PLURAL:$2|0=|Види такође разултате претраге.}}",
        "searchprofile-articles": "Чланци",
        "searchprofile-project": "Странице помоћи и пројеката",
        "searchprofile-images": "Датотеке",
        "recentchangesdays-max": "(највише $1 {{PLURAL:$1|дан|дана|дана}})",
        "recentchangescount": "Број измена за приказ:",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
-       "prefs-help-watchlist-token2": "Ово је тајни кључ за RSS довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
+       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
+       "userrights-removed-self": "Успешно сте себи скинули права. Због тога није вам дозвољен приступ овој страници.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Аутоматски потврђени корисници",
        "right-edituserjs": "уређивање туђих JavaScript датотека",
        "right-editmyusercss": "уређивање сопствених CSS датотека",
        "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
+       "right-viewmywatchlist": "Види списак надгледања",
        "right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
        "right-editmyprivateinfo": "уређивање сопствених личних података (нпр. адресу е-поште, право име)",
        "right-editmyoptions": "уредите своја подешавања",
        "action-createpage": "прављење страница",
        "action-createtalk": "прављење страница за разговор",
        "action-createaccount": "отварање овог корисничког налога",
+       "action-history": "гледање историје ове странице",
        "action-minoredit": "означавање ове измене као мање",
        "action-move": "премести ову страницу",
        "action-move-subpages": "премештање ове странице и њених подстраница",
        "action-siteadmin": "закључавање или откључавање базе података",
        "action-sendemail": "слање е-порука",
        "action-editmywatchlist": "измени свој списак надгледања",
+       "action-viewmywatchlist": "види списак надгледања",
+       "action-viewmyprivateinfo": "прегледање ваших личних података",
+       "action-editmyprivateinfo": "уређивање ваших личних података",
        "nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}",
        "enhancedrc-history": "историја",
        "listredirects": "Списак преусмерења",
        "listduplicatedfiles": "Списак дупликата датотека",
        "listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|један дупликат|$2 дупликата}}]].",
        "unusedtemplates": "Некоришћени шаблони",
        "unusedtemplatestext": "Ова страница наводи све странице у именском простору {{ns:template}} које нису укључене ни на једној другој страници.\nПре брисања проверите да ли друге странице воде до тих шаблона.",
        "unusedtemplateswlh": "остале везе",
        "randompage": "Случајна страница",
        "randompage-nopages": "Нема страница у {{PLURAL:$2|следећем именском простору|следећим именским просторима}}: $1.",
        "randomincategory": "Случајна страница у категорији",
+       "randomincategory-invalidcategory": "„$1“ није ваљано име категорије",
+       "randomincategory-nopages": "Нема страница у категорији [[:Category:$1|$1]].",
        "randomincategory-selectcategory-submit": "Иди",
        "randomredirect": "Случајно преусмерење",
        "randomredirect-nopages": "Нема преусмерења у именском простору „$1”.",
        "pageswithprop-submit": "Иди",
        "doubleredirects": "Двострука преусмерења",
        "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\n<del>Прецртани</del> уноси су већ решени.",
-       "double-redirect-fixed-move": "[[$1]] Ñ\98е Ð¿Ñ\80емеÑ\88Ñ\82ен.\nСада Ñ\98е Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aе на [[$2]].",
-       "double-redirect-fixed-maintenance": "Ð\98Ñ\81пÑ\80авÑ\99аÑ\9aе Ð´Ð²Ð¾Ñ\81Ñ\82Ñ\80Ñ\83киÑ\85 Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ð¸Ð· [[$1]] Ñ\83 [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] Ñ\98е Ð¿Ñ\80емеÑ\88Ñ\82ен.\nÐ\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ñ\98е Ð°Ð¶Ñ\83Ñ\80иÑ\80ано Ð¸ Ñ\81ада Ð¿Ñ\80еÑ\83Ñ\81меÑ\80ава на [[$2]].",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¸Ñ\81пÑ\80авÑ\99а Ð´Ð²Ð¾Ñ\81Ñ\82Ñ\80Ñ\83ка Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ð¸Ð· [[$1]] Ñ\83 [[$2]]. Ð\9aао Ð´ÐµÐ¾ Ð¾Ð´Ñ\80жаваÑ\9aа.",
        "double-redirect-fixer": "Исправљач преусмерења",
        "brokenredirects": "Покварена преусмерења",
        "brokenredirectstext": "Следећа преусмерења упућују на непостојеће странице:",
        "log-title-wildcard": "тражи наслове који почињу с овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране записе",
        "allpages": "Све странице",
-       "alphaindexline": "$1 до $2",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи странице почев од:",
        "listusers-blocked": "({{GENDER:$1|блокиран|блокирана|блокиран}})",
        "activeusers": "Списак активних корисника",
        "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|измена|измене|измена}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
+       "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
        "activeusers-from": "Прикажи кориснике почев од:",
        "activeusers-hidebots": "Сакриј ботове",
        "activeusers-hidesysops": "Сакриј администраторе",
        "watchlistanontext": "Морате бити $1 да бисте гледали и уређивали ставке на вашем списку надгледања.",
        "watchnologin": "Нисте пријављени",
        "addwatch": "Додај на списак надгледања",
-       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене овде.",
+       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене тамо.",
        "removewatch": "Уклони са списка надгледања",
        "removedwatchtext": "Страница „[[:$1]]“ је уклоњена с вашег [[Special:Watchlist|списка надгледања]].",
        "watch": "Надгледај",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
-       "historywarning": "'''Упозорење:''' страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "contributions-title": "Доприноси {{GENDER:$1|корисника|кориснице}} $1",
        "mycontris": "Доприноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
        "nocontribs": "Нема измена које одговарају наведеним критеријумима.",
        "uctop": "(последња)",
        "month": "од месеца (и раније):",
        "blockip": "Блокирај корисника",
        "blockip-legend": "Блокирај корисника",
        "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене ИП адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване).",
-       "ipadressorusername": "ИП адреса или корисничко име:",
+       "ipaddressorusername": "ИП адреса или корисничко име:",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
        "range_block_disabled": "Администраторска могућност за блокирање распона ИП адреса је онемогућена.",
        "ipb_expiry_invalid": "Време истека је неисправно.",
        "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.",
-       "ipb_hide_invalid": "Не могу да потиснем овај налог. Можда има превише измена.",
+       "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
        "ipb_already_blocked": "„$1“ је већ блокиран",
        "ipb-needreblock": "$1 је већ блокиран. Желите ли да промените подешавања?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Друга блокада|Друге блокаде}}",
        "importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.",
        "import-parse-failure": "Погрешно рашчлањивање XML-а.",
        "import-noarticle": "Нема странице за увоз!",
-       "import-nonewrevisions": "Све Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80еÑ\82Ñ\85одно Ñ\83везене.",
+       "import-nonewrevisions": "Ð\98змене Ð½Ð¸Ñ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð±Ð¸Ð»Ðµ Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\81Ñ\83Ñ\82не Ð¸Ð»Ð¸ Ð¿Ñ\80еÑ\81коÑ\87ене Ð·Ð±Ð¾Ð³ Ð³Ñ\80еÑ\88ки).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
        "import-token-mismatch": "Губитак података о сесији.\nПокушајте поново.",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "spam_blanking": "Све измене садрже везе до $1. Чистим",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
-       "simpleantispam-label": "Ð\9fÑ\80овеÑ\80а Ñ\81пама. '''Ð\9dÐ\95''' попуњавај ово унутра!",
+       "simpleantispam-label": "Ð\90нÑ\82и-Ñ\81пам Ð¿Ñ\80овеÑ\80а. \n<strong>Ð\9dÐ\95</strong> попуњавај ово унутра!",
        "pageinfo-title": "Подаци о „$1“",
        "pageinfo-not-current": "Нажалост, немогуће је прибавити ове податке за старије измене.",
        "pageinfo-header-basic": "Основни подаци",
        "newimages-summary": "Ова посебна страница приказује последње послате датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
-       "showhidebots": "($1 ботове)",
        "noimages": "Нема ништа.",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
        "htmlform-float-invalid": "Наведена вредност није број.",
        "htmlform-int-toolow": "Наведена вредност је испод минимума од $1",
        "htmlform-int-toohigh": "Наведена вредност је изнад максимума од $1",
-       "htmlform-required": "Ова вредност је обавезна",
+       "htmlform-required": "Ова вредност је обавезна.",
        "htmlform-submit": "Пошаљи",
        "htmlform-reset": "Врати измене",
        "htmlform-selectorother-other": "Друго",
        "htmlform-no": "Не",
        "htmlform-yes": "Да",
        "htmlform-chosen-placeholder": "Изаберите опцију",
+       "htmlform-cloner-create": "Додај још",
+       "htmlform-cloner-delete": "Уклони",
+       "htmlform-cloner-required": "Бар једна вредност је потребна.",
        "sqlite-has-fts": "$1 с подршком претраге целог текста",
        "sqlite-no-fts": "$1 без подршке претраге целог текста",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
index c42f2de..0780b5f 100644 (file)
        "revertmerge": "rastavi",
        "mergelogpagetext": "Ispod je spisak najskorijih spajanja istorija dveju stranica.",
        "history-title": "Istorija izmena stranice „$1“",
-       "difference-title": "Razlika između izmena na stranici „$1“",
+       "difference-title": "$1 — razlika između izmena",
        "difference-title-multipage": "Razlika između stranica „$1“ i „$2“",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "log-title-wildcard": "traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice počev od:",
        "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak nadgledanja",
-       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene ovde.",
+       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.",
        "removewatch": "Ukloni sa spiska nadgledanja",
        "removedwatchtext": "Stranica „[[:$1]]“ je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "watch": "Nadgledaj",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje:''' stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
+       "historywarning": "<strong>Upozorenje:</strong> stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu, uključujući i njenu istoriju.\nPotvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je završena",
        "actionfailed": "Radnja nije uspela",
        "blockip": "Blokiraj korisnika",
        "blockip-legend": "Blokiraj korisnika",
        "blockiptext": "Koristite donji obrazac da biste zabranili pristup za pisanje s određene IP adrese ili korisničkog imena.\nOvo bi trebalo da vršite samo radi sprečavanja vandalizma, u skladu sa [[{{MediaWiki:Policy-url}}|smernicama]].\nIzaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su vandalizovane).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Unošenje lažnih informacija\n** Uklanjanje sadržaja sa stranica\n** Postavljanje veza do spoljašnjih sajtova\n** Unošenje besmislica u stranice\n** Nepristojno ponašanje\n** Upotreba više naloga\n** Neprihvatljivo korisničko ime",
        "newimages-summary": "Ova posebna stranica prikazuje poslednje poslate datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
-       "showhidebots": "($1 botove)",
        "noimages": "Nema ništa.",
        "ilsubmit": "Pretraži",
        "bydate": "po datumu",
        "htmlform-float-invalid": "Navedena vrednost nije broj.",
        "htmlform-int-toolow": "Navedena vrednost je ispod minimuma od $1",
        "htmlform-int-toohigh": "Navedena vrednost je iznad maksimuma od $1",
-       "htmlform-required": "Ova vrednost je obavezna",
+       "htmlform-required": "Ova vrednost je obavezna.",
        "htmlform-submit": "Pošalji",
        "htmlform-reset": "Vrati izmene",
        "htmlform-selectorother-other": "Drugo",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izaberite opciju",
+       "htmlform-cloner-create": "Dodaj još",
+       "htmlform-cloner-delete": "Ukloni",
+       "htmlform-cloner-required": "Bar jedna vrednost je potrebna.",
        "sqlite-has-fts": "$1 s podrškom pretrage celog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage celog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
index 6469a7a..cedcb88 100644 (file)
        "blockip": "Blokkierje Benutser",
        "blockip-legend": "IP-Adresse/Benutser speere",
        "blockiptext": "Mäd dit Formular speerst du ne IP-Adresse of n Benutsernoome, so dät fon deer neen Annerengen moor foarnuumen wäide konnen.\nDit skuul bloot geböäre, uum Vandalismus tou ferhinnerjen un in Uureenstimmenge mäd do [[{{MediaWiki:Policy-url}}|Gjuchtlienjen]].\nReek dän Gruund foar ju Speere oun.",
-       "ipadressorusername": "IP-Adresse of Benutsernoome:",
+       "ipaddressorusername": "IP-Adresse of Benutsernoome:",
        "ipbexpiry": "Oulooptied (Speerduur):",
        "ipbreason": "Begruundenge:",
        "ipbreason-dropdown": "* Algemeene Speergruunde\n** Ienföigjen fon falske Information\n** Loosmoakjen fon Sieden\n** Föiget massenhaft externe Links ien\n** Ienstaalen fon uunsinnige Seeken in Sieden\n** betruujend Ferhoolden/Belästigenge\n** Misbruuk truch moorere Benutserkonten\n** Uungoadelge Benutsernoome",
        "newimages-summary": "Disse Spezioalsiede wiest do toulääst hoochleedene Doatäie an.",
        "newimages-legend": "Filter",
        "newimages-label": "Doatäinoome (of n Paat deerfon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "neen Bielden fuunen.",
        "ilsubmit": "Säik",
        "bydate": "ätter Doatum",
index 4427207..be38bf4 100644 (file)
        "blockip": "Peungpeuk pamaké",
        "blockip-legend": "Peungpeuk pamaké",
        "blockiptext": "Paké formulir di handap pikeun meungpeuk aksés nulis ti alamat IP atawa ngaran pamaké husus. Ieu sakuduna ditujukeun pikeun nyegah vandalisme, sarta saluyu jeung [[{{MediaWiki:Policy-url}}|kawijakan]]. Eusi alesan nu jéntré (misal, ngarujuk kaca tinangtu nu geus diruksak).",
-       "ipadressorusername": "Alamat IP atawa ngaran pamaké",
+       "ipaddressorusername": "Alamat IP atawa ngaran pamaké",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
        "ipbcreateaccount": "Tong bisa nyieun rekening",
        "imagelisttext": "Di handap ieu daptar '''$1''' {{PLURAL:$1|gambar|gambar}} nu disusun $2.",
        "newimages-summary": "Ieu kaca husus ngabéréndélkeun koropak nu alanyar dimuat.",
        "newimages-label": "Ngaran berkas (atawa sawaréh tina ngaranna):",
-       "showhidebots": "($1 bot)",
        "noimages": "Taya nanaon.",
        "ilsubmit": "Sungsi",
        "bydate": "dumasar titimangsa",
index 2d4b0c2..c6e0b06 100644 (file)
        "previewnote": "'''Kom ihåg att detta bara är en förhandsvisning.'''\nDina ändringar har ännu inte sparats!",
        "continue-editing": "Fortsätt redigera",
        "previewconflict": "Den här förhandsvisningen är resultatet av den\nredigerbara texten ovanför,\nså som det kommer att se ut om du väljer att spara.",
-       "session_fail_preview": "'''Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.\nVar god försök igen.\nOm det fortfarande inte fungerar, pröva att [[Special:UserLogout|logga ut]] och logga in igen.'''",
+       "session_fail_preview": "'''Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.\nVar god försök igen.\nOm det fortfarande inte fungerar, prova att [[Special:UserLogout|logga ut]] och logga in igen.'''",
        "session_fail_preview_html": "'''Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.'''\n\n''Eftersom {{SITENAME}} har aktiverat rå HTML, så döljs förhandsvisningen som en förebyggande säkerhetsåtgärd mot JavaScript-attacker.''\n\n'''Om detta är ett försök att göra en rättmätig redigering, så försök igen.\nOm det fortfarande inte fungerar, pröva att [[Special:UserLogout|logga ut]] och logga in igen.'''",
        "token_suffix_mismatch": "'''Din redigering har stoppats eftersom din klient har ändrat tecknen\ni redigeringens \"edit token\". Redigeringen stoppades för att förhindra att sidtexten skadas.\nDetta händer ibland om du använder buggiga webbaserade anonyma proxytjänster.'''",
        "edit_form_incomplete": "'''Vissa delar av redigeringen kunde inte nå servern, dubbelkolla att dina ändringar är intakta och försök igen.'''",
        "right-move": "Flytta sidor",
        "right-move-subpages": "Flytta sidor med deras undersidor",
        "right-move-rootuserpages": "Flytta root-användarsidor",
+       "right-move-categorypages": "Flytta kategorisidor",
        "right-movefile": "Flytta filer",
        "right-suppressredirect": "Skapa inte omdirigeringar från ursprungssidan vid sidflyttning",
        "right-upload": "Ladda upp filer",
        "action-createpage": "skapa sidor",
        "action-createtalk": "skapa diskussionssidor",
        "action-createaccount": "skapa detta användarkonto",
+       "action-history": "visa historiken för denna sida",
        "action-minoredit": "markera denna redigering som mindre",
        "action-move": "flytta denna sida",
        "action-move-subpages": "flytta denna sida, och dess undersidor",
        "action-move-rootuserpages": "flytta root-användarsidor",
+       "action-move-categorypages": "flytta kategorisidor",
        "action-movefile": "flytta den här filen",
        "action-upload": "ladda upp denna fil",
        "action-reupload": "skriva över denna existerade fil",
        "log-title-wildcard": "Sök efter sidtitlar som börjar med texten",
        "showhideselectedlogentries": "Visa/Dölj markerade loggposter",
        "allpages": "Alla sidor",
-       "alphaindexline": "$1 till $2",
        "nextpage": "Nästa sida ($1)",
        "prevpage": "Föregående sida ($1)",
        "allpagesfrom": "Visa sidor från och med:",
        "blockip": "Blockera användare",
        "blockip-legend": "Blockera användare",
        "blockiptext": "Använd formuläret nedan för att blockera möjligheten att redigera sidor från en specifik IP-adress eller ett användarnamn.\nDetta bör endast göras för att förhindra vandalisering, och i överensstämmelse med gällande [[{{MediaWiki:Policy-url}}|policy]].\nAnge orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).",
-       "ipadressorusername": "IP-adress eller användarnamn:",
+       "ipaddressorusername": "IP-adress eller användarnamn:",
        "ipbexpiry": "Varaktighet:",
        "ipbreason": "Anledning:",
        "ipbreason-dropdown": "*Vanliga motiv till blockering\n** Infogar falsk information\n** Tar bort sidinnehåll\n** Länkspam till externa sajter\n** Lägger till nonsens på sidor\n** Hotfullt beteende/trakasserier\n** Missbruk av flera användarkonton\n** Oacceptabelt användarnamn",
        "movepagetalktext": "Diskussionssidan kommer att även den automatiskt flyttas '''om inte''':\n*Det redan finns en diskussionssida som inte är tom med det nya namnet, eller\n*Du avmarkerar rutan nedan.\n\nI de fallen måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
        "movearticle": "Flytta sidan:",
        "moveuserpage-warning": "'''Varning:''' Du håller på att flytta en användarsida. Observera att endast sidan kommer att flyttas och att användaren ''inte'' kommer att byta namn.",
+       "movecategorypage-warning": "<strong>Varning:</strong> Du är på väg att flytta ebn kategorisida. Observera att endast sidan kommer att flyttas och eventuella sidor i den gamla kategorin kommer <em>inte</em> att kategoriseras om till den nya kategorin.",
        "movenologintext": "För att flytta en sida måste du vara registrerad användare och [[Special:UserLogin|inloggad]].",
        "movenotallowed": "Du har inte behörighet att flytta sidor på den här wikin.",
        "movenotallowedfile": "Du har inte tillåtelse att flytta filer.",
        "cant-move-user-page": "Du har inte behörighet att flytta användarsidor (bortsett från undersidor).",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
+       "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
+       "cant-move-to-category-page": "Du har inte behörighet att en sida till en kategorisida.",
        "newtitle": "Till nya titeln:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "newimages-summary": "Den här specialsidan visar de senast uppladdade filerna.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnamn (eller en del av det):",
-       "showhidebots": "($1 robotar)",
+       "newimages-showbots": "Visa uppladdningar av botar",
        "noimages": "Ingenting att se.",
        "ilsubmit": "Sök",
        "bydate": "efter datum",
        "watchlistedit-raw-done": "Din bevakningslista har uppdaterats.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 sida|$1 sidor}} lades till:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:",
+       "watchlistedit-clear-title": "Rensa bevakningslistan",
+       "watchlistedit-clear-legend": "Rensa bevakningslistan",
+       "watchlistedit-clear-explain": "Alla titlar kommer att tas bort från din bevakningslista",
+       "watchlistedit-clear-titles": "Titlar:",
+       "watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)",
+       "watchlistedit-clear-done": "Din bevakningslista har rensats.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titel|$1 titlar}} togs bort:",
+       "watchlistedit-too-many": "Det finns för många sidor att visa här.",
+       "watchlisttools-clear": "Rensa bevakningslistan",
        "watchlisttools-view": "Visa relevanta ändringar",
        "watchlisttools-edit": "Visa och redigera bevakningslistan",
        "watchlisttools-raw": "Redigera bevakningslistan i råformat",
index f98241d..fe0663c 100644 (file)
@@ -17,7 +17,7 @@
                ]
        },
        "tog-underline": "Wekea mstari viungo:",
-       "tog-hideminor": "Ficha mabadilisho madogo ya hivi karibuni",
+       "tog-hideminor": "Ficha maharirio madogo katika mabadiliko ya hivi karibuni",
        "tog-hidepatrolled": "Ficha kurasa zilizofanyiwa doria kwenye mabadiliko ya karibuni",
        "tog-newpageshidepatrolled": "Ficha kurasa zilizofanyiwa doria kwenye orodha ya kurasa mpya",
        "tog-extendwatchlist": "Tanua orodha ya maangalizi ili kuonyesha mabadiliko yote yaliyofanyika, si hilo la mwisho tu.",
        "logempty": "Vitu vyenye vipengele hivi havipo kwenye kumbukumbu.",
        "log-title-wildcard": "Tafuta kurasa zenye vichwa vinavyoanza na maandishi haya",
        "allpages": "Kurasa zote",
-       "alphaindexline": "$1 hadi $2",
        "nextpage": "Ukurasa ujao ($1)",
        "prevpage": "Ukurasa uliotangulia ($1)",
        "allpagesfrom": "Onyesha kurasa zinazoanza kutoka:",
        "blockip": "Zuia mtumiaji",
        "blockip-legend": "Kumzuia mtumiaji",
        "blockiptext": "Tumia fomu iliyopo chini kumzuia mtu asihariri kwa kupitia anwani fulani wa IP au kwa kutumia jina fulani la mtumiaji.\nNia ya kumzuia mtu inatakiwa kuwa kuzuia uharibifu tu, na ifanikiwe kutokana na masharti ya [[{{MediaWiki:Policy-url}}|sera]].\nAndika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizoharibiwa).",
-       "ipadressorusername": "Anwani ya IP au jina la mtumiaji:",
+       "ipaddressorusername": "Anwani ya IP au jina la mtumiaji:",
        "ipbexpiry": "Itakwisha:",
        "ipbreason": "Sababu:",
        "ipbreason-dropdown": "*Sababu za kawaida za kuzuia\n** Kuingiza habari za uongo\n** Kuondosha yaliyomo katika kurasa\n** Viungo vya nje visivyotakiwa\n** Kuingiza upuuzi/ujinga sioeleweka kwenye makala\n** Adabu mbaya/kero\n** Kusumbua akaunti nyinginyingi\n** Jina la mutumiaji lisilokubalika",
        "newimages-summary": "Ukurasa maalum huu unaonyesha mafaili yaliyopakiwa hivi karibuni.",
        "newimages-legend": "Chuja",
        "newimages-label": "Jina la faili (au sehemu yake):",
-       "showhidebots": "(roboti $1)",
        "noimages": "Hakuna picha.",
        "ilsubmit": "Tafuta",
        "bydate": "kwa tarehe",
index cc34559..64158b3 100644 (file)
        "blockip": "Zawrzij sprowjorza",
        "blockip-legend": "Zawrzij sprowjorza",
        "blockiptext": "Tyn formularz służy do zawjerańo sprowjyń spod uokreślůnygo adresu IP abo kůnkretnymu użytkowńikowi.\nZawjerać noleży jydyńy po to, by zapobjec wandalizmům, zgodńy ze [[{{MediaWiki:Policy-url}}|przijyntymi reglůma]].\nPodej powůd (np. umjeszczajůnc mjana zajtůw, na kerych dopuszczůno śe wandalizmu).",
-       "ipadressorusername": "Adres IP abo mjano użytkowńika",
+       "ipaddressorusername": "Adres IP abo mjano użytkowńika",
        "ipbexpiry": "Wygaso:",
        "ipbreason": "Čymu:",
        "ipbreason-dropdown": "*Nojczynstsze powody zawjerańo uod sprawjyń\n** Ataki na inkszych użytkowńikůw\n** Naruszyńy praw autorskych\n** Ńydozwolůne mjano użytkowńika\n** Open proxy/Tor\n** Spamowańy\n** Ůsuwańy treśći zajtůw\n** Wprowadzańy fołszywych informacyji\n** Wulgaryzmy\n** Wypisywańy gůpot na zajtach",
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Mjano plika (abo jygo tajla):",
-       "showhidebots": "($1 boty)",
        "noimages": "Brak plikůw do pokozańo.",
        "ilsubmit": "Šnupej",
        "bydate": "wedle daty",
index 036c834..7117def 100644 (file)
        "blockip": "பயனரைத் தடு",
        "blockip-legend": "பயனரைத் தடு",
        "blockiptext": "ஒரு குறிப்பிட்ட ஐபி முகவரி அல்லது பயனரிடமிருந்து எழுத்து அணுக்கத்தைத் தடுப்பதற்குக் கீழேயுள்ள படிவத்தை உபயோகிக்கவும். இது விசமத்தனத்தைத் தடுப்பதற்கும் [[{{MediaWiki:Policy-url}}|{{SITENAME}} கொள்கை]]க்கு எற்புடைய வகையிலும் மட்டுமே பயன்படுத்தப்பட வேண்டும்.\nகுறிப்பிட்ட காரணமொன்றைக் கீழே நிரப்புக (எடுத்துக்காட்டாக, விசமத்தனம் செய்யப்பட்ட பக்கங்களை எடுத்துக் காட்டவும்).",
-       "ipadressorusername": "ஐ.பி. அல்லது பயனர் பெயர்:",
+       "ipaddressorusername": "ஐ.பி. அல்லது பயனர் பெயர்:",
        "ipbexpiry": "காலாவதி:",
        "ipbreason": "காரணம்:",
        "ipbreason-dropdown": "*பொதுவான தடைக் காரணங்கள்\n** பொய்யான தகவல்களை இடல்\n** பக்கங்களிலிருந்து உள்ளடக்கங்களை நீக்கல்\n** எரித இணைப்புகளை வெளியிணைப்பாக கொடுத்தல்\n** பக்கங்களுக்கு அர்த்தமற்ற உள்ளடக்கங்களை இணைத்தல்\n** பொறுப்பற்ற நடிவடிக்கைகள்\n** ஒரு பயனர் பல கணக்குகளைப் பேணல்\n** ஏற்றுக்கொள்ளப்படமுடியாத பயனர் பெயர்",
        "newimages-summary": "இச்சிறப்புப் பக்கம் கடைசியாக பதிவேற்றப்பட்ட பக்கங்களைப் பட்டியலிடுகிறது.",
        "newimages-legend": "வடிகட்டி",
        "newimages-label": "கோப்பின் பெயர் (அல்லது அதன் பகுதி):",
-       "showhidebots": "(தானியங்கிகளை $1)",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
index c902c3d..5fec48f 100644 (file)
@@ -37,7 +37,7 @@
        "tog-watchdefault": "నేను మార్చే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchmoves": "నేను తరలించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchdeletion": "నేను తొలగించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
-       "tog-minordefault": "డిఫాలà±\8dà°\9fà±\81గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
+       "tog-minordefault": "à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
        "tog-previewontop": "వ్యాసం మార్పుల మునుచూపును ఎడిట్ పెట్టె పైన చూపు",
        "tog-previewonfirst": "మొదటి  దిద్దుబాటు చేసినపుడు వ్యాసపు మునుచూపు చూపించు",
        "tog-enotifwatchlistpages": "నా వీక్షణాజాబితా లోని పేజీ లేదా దస్త్రం మారినపుడు నాకు ఈ-మెయిలు పంపు",
@@ -63,7 +63,7 @@
        "tog-prefershttps": "లాగిన్ అయి ఉన్నప్పుడెల్లా భద్ర కనెక్షనునే వాడు",
        "underline-always": "ఎల్లప్పుడూ",
        "underline-never": "ఎప్పటికీ వద్దు",
-       "underline-default": "à°°à±\82à°ªà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ à°¯à±\8aà°\95à±\8dà°\95 అప్రమేయం",
+       "underline-default": "à°\85à°²à°\82à°\95ారపà±\81 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ అప్రమేయం",
        "editfont-style": "దిద్దుబాటు పెట్టె ఫాంటు శైలి:",
        "editfont-default": "విహరిణి అప్రమేయం",
        "editfont-monospace": "మోనోస్పేస్‍డ్ ఫాంట్",
        "nocookiesnew": "ఖాతాని సృష్టించాం, కానీ మీరు ఇంకా లోనికి ప్రవేశించలేదు.\nవాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కూకీలని అచేతనం చేసివున్నారు.\nదయచేసి వాటిని చేతనంచేసి, మీ కొత్త వాడుకరి పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.",
        "nocookieslogin": "వాడుకరుల ప్రవేశానికై {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కుకీలని అచేతనం చేసివున్నారు.\nవాటిని చేతనంచేసి ప్రయత్నించండి.",
        "nocookiesfornew": "మూలాన్ని కనుక్కోలేకపోయాం కాబట్టి, ఈ వాడుకరి ఖాతాను సృష్టించలేకపోయాం.\nమీ కంప్యూటర్లో కూకీలు చేతనమై ఉన్నాయని నిశ్చయించుకొని, ఈ పేజీని తిరిగి లోడు చేసి, మళ్ళీ ప్రయత్నించండి.",
-       "noname": "మీరు సరైన వాడుకరిపేరు ఇవ్వలేదు.",
+       "noname": "మీరు సరైన వాడుకరి పేరు ఇవ్వలేదు.",
        "loginsuccesstitle": "ప్రవేశం విజయవంతమైంది",
        "loginsuccess": "<strong>మీరు ఇప్పుడు {{SITENAME}}లోనికి \"$1\"గా ప్రవేశించారు.</strong>",
        "nosuchuser": "\"$1\" అనే పేరుతో వాడుకరులు లేరు.\nవాడుకరి పేర్లు కేస్ సెన్సిటివ్.\nఅక్షరక్రమం సరిచూసుకోండి, లేదా [[Special:UserLogin/signup|కొత్త ఖాతా సృష్టించుకోండి]].",
        "action-createpage": "పేజీలను సృష్టించే",
        "action-createtalk": "చర్చాపేజీలను సృష్టించే",
        "action-createaccount": "ఈ వాడుకరి ఖాతాని సృష్టించే",
+       "action-history": "ఈ పేజీ యొక్క చరిత్రని చూడండి",
        "action-minoredit": "ఈ మార్పుని చిన్నదిగా గుర్తించే",
        "action-move": "ఈ పేజీని తరలించే",
        "action-move-subpages": "ఈ పేజీని, దీని ఉపపేజీలనూ తరలించే",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
        "allpages": "అన్ని పేజీలు",
-       "alphaindexline": "$1 నుండి $2 వరకు",
        "nextpage": "తరువాతి పేజీ ($1)",
        "prevpage": "మునుపటి పేజీ ($1)",
        "allpagesfrom": "ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:",
        "contributions-title": "$1 యొక్క మార్పులు-చేర్పులు",
        "mycontris": "మార్పుచేర్పులు",
        "contribsub2": "{{GENDER:$3|$1}} ($2) కొరకు",
+       "contributions-userdoesnotexist": "వాడుకరి ఖాతా \"$1\" నమోదుకాలేదు.",
        "nocontribs": "ఈ విధమైన మార్పులేమీ దొరకలేదు.",
        "uctop": "(ప్రస్తుత)",
        "month": "ఈ నెల నుండి (అంతకు ముందువి):",
        "blockip": "వాడుకరి నిరోధం",
        "blockip-legend": "వాడుకరి నిరోధం",
        "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).",
-       "ipadressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
+       "ipaddressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "ipbexpiry": "అంతమయ్యే గడువు",
        "ipbreason": "కారణం:",
        "ipbreason-dropdown": "*సాధారణ నిరోధ కారణాలు\n** తప్పు సమాచారాన్ని చొప్పించడం\n** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం\n** బయటి సైట్లకు లంకెలతో స్పాము చెయ్యడం\n** పేజీల్లోకి చెత్తను ఎక్కించడం\n** బెదిరింపు ప్రవర్తన/వేధింపులు\n** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం\n** అనుచితమైన వాడుకరి పేరు\n** అదుపు తప్పిన బాటు",
        "newimages-summary": "ఇటీవలే ఎగుమతైన ఫైళ్ళను ఈ ప్రత్యేక పేజీ చూపిస్తుంది.",
        "newimages-legend": "పడపోత",
        "newimages-label": "ఫైలుపేరు (లేదా దానిలోని భాగం):",
-       "showhidebots": "($1 బాట్లు)",
        "noimages": "చూసేందుకు ఏమీ లేదు.",
        "ilsubmit": "వెతుకు",
        "bydate": "తేదీ వారీగ",
        "htmlform-no": "కాదు",
        "htmlform-yes": "అవును",
        "htmlform-chosen-placeholder": "ఒక ఐచ్ఛికాన్ని ఎంచుకోండి",
+       "htmlform-cloner-create": "ఇంకా చేర్చు",
+       "htmlform-cloner-delete": "తొలగించు",
        "sqlite-has-fts": "$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటుతో",
        "sqlite-no-fts": "$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటు లేకుండా",
        "logentry-delete-delete": "$1 $3 పేజీని {{GENDER:$2|తొలగించారు}}",
index b18f41a..1d84b32 100644 (file)
        "blockip": "Бастани корбар",
        "blockip-legend": "Бастани корбар",
        "blockiptext": "Барои бастани дастрасии вироиши нишонаи IP ё номи корбарӣ мушаххас аз форми зерин истифода кунед.\nИн кор фақат бояд барои ҷилавгирӣ аз харобкори ва мувофиқи бо [[{{MediaWiki:Policy-url}}|сиёсати қатъи дастрасӣ]] анҷом шавад.\nДалели мушаххас барои ин корро дар зер зикр кунед (барои мисол, зикри саҳифаҳое, ки харобкорӣ шудаанд).",
-       "ipadressorusername": "IP нишона ё номи корбар:",
+       "ipaddressorusername": "IP нишона ё номи корбар:",
        "ipbexpiry": "Хотима:",
        "ipbreason": "Сабаб:",
        "ipbreason-dropdown": "*Сабабҳои умумии бастан\n** Ворид кардани иттилооти нодуруст\n** Пок кардани иттилооти муфид аз саҳифаҳо\n** Истифода бурдани пайвандҳои спам ба сомонаҳои беруна\n** Ворид кардани навиштаҳои беманънӣ ба саҳифаҳо\n** Рафтори баъд/масхаракунии дигар корбарон\n** Сӯиистифода аз чанд ҳисоби корбарӣ\n** Номи корбарии номуносиб",
        "imagelisttext": "Дар зер феҳристи '''$1''' {{PLURAL:$1|парвандаи|парвандаҳои}} ба тартиб оварда шуда, омадааст $2.",
        "newimages-summary": "Ин саҳифаи вижа охирин парвандаҳои боршударо намоиш медиҳад.",
        "newimages-legend": "Филтр",
-       "showhidebots": "($1 ботҳо)",
        "noimages": "Чизе барои дидан нест.",
        "ilsubmit": "Ҷустуҷӯи",
        "bydate": "аз рӯи сана",
index 9e9242b..f8ba339 100644 (file)
        "portal-url": "Project:ศูนย์รวมชุมชน",
        "privacy": "นโยบายสิทธิส่วนบุคคล",
        "privacypage": "Project:นโยบายสิทธิส่วนบุคคล",
-       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
+       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
        "badaccess-group0": "คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ",
        "badaccess-groups": "ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่ม}}: $1",
        "versionrequired": "ต้องการมีเดียวิกิรุ่น $1",
        "noemail": "ไม่มีที่อยู่อีเมลบันทึกไว้สำหรับผู้ใช้ \"$1\"",
        "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง",
        "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาล็อกอินอีกครั้งหลังได้รับอีเมล",
-       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\89ะà¸\99ัà¹\89à¸\99 à¸\88ึà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\82อà¸\81ูà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¸\81ระà¸\97ำผิด",
+       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\97ำà¹\83หà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\80รืà¹\88อà¸\87à¸\82อรหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\84à¸\94à¹\89 à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¹\83à¸\8aà¹\89à¹\83à¸\99à¸\97าà¸\87à¸\97ีà¹\88ผิด",
        "eauthentsent": "อีเมลยืนยันได้ถูกส่งไปที่อยู่อีเมลที่เสนอ ก่อนที่อีเมลจะถูกส่งไปที่ชื่อบัญชีนั้น คุณต้องปฏิบัติตามคำแนะนำในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ",
        "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำที่ไม่ถูกต้อง",
        "mailerror": "ข้อผิดพลาดในการส่งเมล: $1",
        "action-createpage": "สร้างหน้า",
        "action-createtalk": "สร้างหน้าอภิปราย",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
+       "action-history": "ดูประวัติของหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
        "action-move-subpages": "ย้ายหน้านี้ รวมทั้งหน้าย่อย",
        "log-title-wildcard": "ค้นหาชื่อเรื่องด้วยข้อความนี้",
        "showhideselectedlogentries": "แสดง/ซ่อนหน่วยปูมที่เลือก",
        "allpages": "หน้าทั้งหมด",
-       "alphaindexline": "$1 ถึง $2",
        "nextpage": "หน้าถัดไป ($1)",
        "prevpage": "หน้าก่อนหน้า ($1)",
        "allpagesfrom": "แสดงหน้าโดยเริ่มจาก:",
        "allinnamespace": "หน้าทุกหน้า (เนมสเปซ $1)",
        "allpagessubmit": "ดู",
        "allpagesprefix": "แสดงหน้าที่ขึ้นต้นด้วย:",
-       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸¥à¸´à¸\87à¸\81à¹\8cมาà¸\88าà¸\81ภาษาอืà¹\88à¸\99หรือวิà¸\81ิอืà¹\88à¸\99 หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
+       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸«à¸£à¸·à¸­à¹\80à¸\9bà¹\87à¸\99ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามภาษา หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
        "allpages-bad-ns": "{{SITENAME}} ไม่มีเนมสเปซ \"$1\"",
        "allpages-hide-redirects": "ซ่อนการเปลี่ยนทาง",
        "cachedspecial-viewing-cached-ttl": "คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1",
        "blockip": "บล็อกผู้ใช้",
        "blockip-legend": "บล็อกผู้ใช้",
        "blockiptext": "ใช้แบบด้านล่างเพื่อบล็อกสิทธิเข้าถึงการเขียนของเลขที่อยู่ไอพีหรือชื่อผู้ใช้โดยเจาะจง การบล็อกนี้ควรดำเนินการเพื่อป้องกันการก่อกวนเท่านั้น และให้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]\nกรอกเหตุผลโดยเจาะจงด้านล่าง (เช่น อ้างถึงหน้าที่ถูกก่อกวน)",
-       "ipadressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้",
+       "ipaddressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้",
        "ipbexpiry": "หมดอายุ",
        "ipbreason": "เหตุผล:",
        "ipbreason-dropdown": "*สาเหตุการบล็อกทั่วไป\n** ใส่ข้อมูลเท็จ\n** ลบเนื้อหาในหน้าออก\n** ใส่ลิงก์สแปม\n** ใส่ข้อความไร้สาระ/ขยะเข้ามา\n** พฤติกรรมข่มขู่/รังควาน\n** ใช้หลายบัญชีในทางที่ผิด\n** ชื่อผู้ใช้ที่ไม่อาจยอมรับได้",
        "spam_reverting": "ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1",
        "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)",
        "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ",
+       "simpleantispam-label": "การตรวจสอบสแปม\n<strong>อย่า</strong>กรอกช่องนี้!",
        "pageinfo-title": "ข้อมูลสำหรับ \"$1\"",
        "pageinfo-not-current": "ขออภัย ไม่สามารถให้ข้อมูลนี้สำหรับรุ่นเก่าได้",
        "pageinfo-header-basic": "ข้อมูลเบื้องต้น",
        "newimages-summary": "หน้าพิเศษนี้แสดงไฟล์ที่ถูกอัปโหลดล่าสุด",
        "newimages-legend": "ตัวกรอง",
        "newimages-label": "ชื่อไฟล์ (หรือส่วนหนึ่งของชื่อ):",
-       "showhidebots": "($1 บอต)",
+       "newimages-showbots": "แสดงไฟล์ที่บอตอัปโหลด",
        "noimages": "ไม่มีให้ดู",
        "ilsubmit": "สืบค้น",
        "bydate": "ตามวันที่",
        "confirmemail_send": "ส่งรหัสยืนยันทางอีเมล",
        "confirmemail_sent": "ส่งอีเมลสำหรับการยืนยันแล้ว",
        "confirmemail_oncreate": "รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ\nรหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้",
-       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88ถูกต้อง\n\nข้อความตีกลับ: $1",
+       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าอัà¸\81à¸\82ระà¸\97ัà¹\89à¸\87หมà¸\94ถูกต้อง\n\nข้อความตีกลับ: $1",
        "confirmemail_invalid": "รหัสยืนยันไม่ถูกต้อง \nรหัสอาจหมดอายุแล้ว",
        "confirmemail_needlogin": "คุณต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ",
        "confirmemail_success": "อีเมลคุณได้รับการยืนยันแล้ว\nคุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ",
index d1ac296..9a27692 100644 (file)
        "blockip": "Ulanyjyny blokirle",
        "blockip-legend": "Ulanyjyny blokirle",
        "blockiptext": "Aşakdaky formdan peýdalanyp, belli bir IP-niň ýa-da ulanyjy adynyň ýazmak hukugyny blokirläp bilersiňiz.\nBu diňe wandalizmiň öňüni almak üçin hem-de [[{{MediaWiki:Policy-url}}|kadalara]] laýyklykda edilmelidir.\nAşakda blokirlemäniň takyk sebäbini ýazyň (meselem: wandalizm eden sahypalaryny görkeziň).",
-       "ipadressorusername": "IP adresi ýa-da ulanyjy ady:",
+       "ipaddressorusername": "IP adresi ýa-da ulanyjy ady:",
        "ipbexpiry": "Gutarýan wagty:",
        "ipbreason": "Sebäp:",
        "ipbreason-dropdown": "*Adaty blokirleme sebäpleri\n** Ýalan maglumat girizmek\n** Sahypalaryň mazmunyny aýyrmak\n** Daşarky saýtlara spam çykgydy goýmak\n** Sahypalara manysyz/düşnüksiz sözler girizmek\n** Haýbat atyjy hereket/Yrsaramak\n** Birden köp hasaby betniýetli ulanmak\n** Kabul edip bolmajak ulanyjy ady",
        "newimages-summary": "Bu ýörite sahypa iň soňky ýüklenen faýllary görkezýär.",
        "newimages-legend": "Filtr",
        "newimages-label": "Faýlyň ady (ýa-da bir bölegi):",
-       "showhidebots": "(botlary $1)",
        "noimages": "Görmäge zat ýok.",
        "ilsubmit": "Gözle",
        "bydate": "sene boýunça",
index 5f549f0..1580cde 100644 (file)
        "log-title-wildcard": "Hanapin ang mga pamagat na nagsisimula sa tekstong ito",
        "showhideselectedlogentries": "Ipakita/itago ang napiling mga lahok sa talaan",
        "allpages": "Lahat ng pahina",
-       "alphaindexline": "$1 hanggang $2",
        "nextpage": "Susunod na pahina ($1)",
        "prevpage": "Nakaraang pahina ($1)",
        "allpagesfrom": "Pinapakita ang mga pahina na nagsisimula sa:",
        "blockip": "Harangin/hadlangan ang tagagamit",
        "blockip-legend": "Iharang ang tagagamit",
        "blockiptext": "Gamitin ang mga lahok sa ibaba upang maharang ang akses sa pagsulat mula sa isang espesipikong IP address o bansag.\nGawin lamang ito para maiwasan ang bandalismo, at napapaloob sa [[{{MediaWiki:Policy-url}}|patakaran]].\nPunan ang espesipikong dahilan sa ibaba (halimbawa, magbanggit ng partikular na mga pahina na nagkaroon ng bandalismo).",
-       "ipadressorusername": "Direksyong IP o bansag:",
+       "ipaddressorusername": "Direksyong IP o bansag:",
        "ipbexpiry": "Pagkawalang-bisa:",
        "ipbreason": "Dahilan:",
        "ipbreason-dropdown": "*Mga karaniwang dahilan sa paghaharang\n** Pagpasok ng hindi totoong impormasyon\n** Pag-alis ng nilalaman mula sa mga pahina\n** Paglalagay ng mga panlabas na link  na spam\n** Pagpasok ng impormasyong walang kabuluhan o hindi maintindihan sa mga pahina\n** Ugaling nananakot/pagligalig\n** Pagmamalabis ng maramihang account\n** Hindi kanais-nais na pangalan",
        "newimages-summary": "Nagpapakita ang natatanging pahinang ito ng huling naikargang mga talaksan.",
        "newimages-legend": "Pansala",
        "newimages-label": "Pangalan ng talaksan (o bahagi nito):",
-       "showhidebots": "($1 mga ''bot'')",
        "noimages": "Walang makikita dito.",
        "ilsubmit": "Hanapin",
        "bydate": "ayon sa petsa",
index ad597f9..79752a5 100644 (file)
        "edit-gone-missing": "Sayfa güncellenemiyor.\nSilinmiş görünüyor.",
        "edit-conflict": "Değişiklik çakışması.",
        "edit-no-change": "Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.",
+       "postedit-confirmation-created": "Sayfa oluşturuldu.",
        "postedit-confirmation-saved": "Değişikliğiniz kaydedildi.",
        "edit-already-exists": "Yeni sayfa oluşturulamıyor.\nSayfa zaten mevcut.",
        "defaultmessagetext": "Varsayılan mesaj metni",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "showhideselectedlogentries": "Seçili günlük girdilerinin görünürlüğünü değiştir",
        "allpages": "Tüm sayfalar",
-       "alphaindexline": "$1 sayfasından $2 sayfasına kadar",
        "nextpage": "Sonraki sayfa ($1)",
        "prevpage": "Önceki sayfa ($1)",
        "allpagesfrom": "Listelemeye başlanılacak harfler:",
        "blockip": "Kullanıcıyı engelle",
        "blockip-legend": "Kullanıcıyı engelle",
        "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).",
-       "ipadressorusername": "IP adresi veya kullanıcı adı",
+       "ipaddressorusername": "IP adresi veya kullanıcı adı",
        "ipbexpiry": "Bitiş süresi",
        "ipbreason": "Neden:",
        "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı",
        "newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
        "newimages-legend": "Filtre",
        "newimages-label": "Dosya adı (ya da bir parçası):",
-       "showhidebots": "(botları $1)",
        "noimages": "Görecek bir şey yok.",
        "ilsubmit": "Ara",
        "bydate": "kronolojik sırayla",
index 67adf7b..3812afb 100644 (file)
        "whatlinkshere-filters": "Фильтрлар",
        "blockip": "Кулланучыны тыю",
        "blockip-legend": "Кулланучыны тыю",
-       "ipadressorusername": "IP адресы яки кулланучы исеме:",
+       "ipaddressorusername": "IP адресы яки кулланучы исеме:",
        "ipbexpiry": "Бетә:",
        "ipbreason": "Сәбәп:",
        "ipbreason-dropdown": "* Кысуның гадәттәге сәбәпләре\n** Ялган мәгълүмат кертү\n** Битләрнең эчтәлеген сөртү\n** Тышкы сайтларга спам-сылтамалар\n** Мәгънәсез текст/чүп өстәү\n** Кулланучыларны эзәрлекләү/янаулар\n** Берничә хисап язмасы белән исәпләшмәү\n** Кулланучы исеменең яраксыз булуы",
        "show-big-image": "Тулы ачыклык",
        "newimages": "Яңа сүрәтләр җыелмасы",
        "newimages-legend": "Фильтр",
-       "showhidebots": "($1 бот)",
        "ilsubmit": "Эзләү",
        "bad_image_list": "Киләчәк рәвеш кирәк:\n\nИсемлек кисәкләре генә (* символыннан башланучы юллар) саналырлар.\nЮлның беренче сылтамасы куйма өчен тыелган рәсемгә сылтама булырга тиеш.\nШул ук юлның киләчәк сылтамалары чыгармалар, рәсемгә тыелмаган битләре, саналырлар.",
        "metadata": "Мета мәгълүматлар",
index 27996c6..206af30 100644 (file)
        "whatlinkshere-filters": "Filtrlar",
        "blockip": "Qullanuçını tıyu",
        "blockip-legend": "Qullanuçını tıyu",
-       "ipadressorusername": "IP adresı yäki qullanuçı iseme:",
+       "ipaddressorusername": "IP adresı yäki qullanuçı iseme:",
        "ipbexpiry": "Betä:",
        "ipbreason": "Säbäp:",
        "ipbreason-dropdown": "* Qısunıñ ğädättäge säbäpläre\n** Yalğan mäğlümat kertü\n** Bitlärneñ eçtälegen sörtü\n** Tışqı saytlarğa spam-sıltamalar\n** Mäğnäsez tekst/çüp östäw\n** Qullanuçılarnı ezärlekläw/yanawlar\n** Berniçä xisap yazması belän isäpläşmäw\n** Qullanuçı isemeneñ yaraqsız buluı",
        "show-big-image": "Tulı açıqlıq",
        "newimages": "Yaña sürätlär cıyılması",
        "newimages-legend": "Filtr",
-       "showhidebots": "($1 bot)",
        "ilsubmit": "Ezläw",
        "bydate": "waqıt buyınça",
        "bad_image_list": "Kiläçäk räweş kiräk:\n\nİsemlek kisäkläre genä (* simvolınnan başlanuçı yullar) sanalırlar.\nYulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulırğa tieş.\nŞul uq yulnıñ kiläçäk sıltamaları çığarmalar, räsemgä tıyılmağan bitläre, sanalırlar.",
index e1c1b6c..2e329dc 100644 (file)
        "blockip": "چەكلەنگەن ئىشلەتكۈچى",
        "blockip-legend": "چەكلەنگەن ئىشلەتكۈچى",
        "blockiptext": "تۆۋەندىكى جەدۋەلنى ئىشلىتىپ بەلگىلىك IP ئادرېس ياكى ئىشلەتكۈچى ئاتىدىن كەلگەن يېزىش زىيارىتىنى چەكلەشكە بولىدۇ.\nپەقەت بۇزغۇنچىلىكنىڭ ئالدىنى ئېلىش ھەمدە [[{{MediaWiki:Policy-url}}|تاكتىكا]].\nسىغا ئۇيغۇن بولغان ئەھۋالدا ئاندىن بۇ مەشغۇلاتنى ئېلىپ بېرىشقا بولىدۇ. تۆۋەندە ئەمەلىي سەۋەب (مەسىلەن، بۇزۇۋېتىلگەن بەتتىن بىرنى نەقىل ئېلىش)تىن بىرنى كىرگۈزۈڭ.",
-       "ipadressorusername": "IP ئادرېس ياكى ئىشلەتكۈچى ئاتى:",
+       "ipaddressorusername": "IP ئادرېس ياكى ئىشلەتكۈچى ئاتى:",
        "ipbexpiry": "مۇددىتى:",
        "ipbreason": "سەۋەب:",
        "ipbreason-dropdown": "*ئادەتتىكى چەكلەش سەۋەبى\n** ساختا ئۇچۇر قوشۇش\n** بەت مەزمۇنىنى چىقىرىۋېتىش\n** سىرتقى ئەخلەت ئۇلانما قوشۇش\n** بەتكە تۇترۇقسىز گەپ قوشۇش\n**  باشقىلارغا ھەيۋە قىلىش/مەجبۇرلاش\n** كۆپ ھېساباتنى قالايمىغان ئىشلىتىش\n** قوبۇل قىلغىلى بولمايدىغان ئىشلەتكۈچى ئاتى",
        "newimages-summary": "بۇ ئالاھىدە بەتتە ئەڭ ئاخىرىدا يۈكلەنگەن ھۆججەت كۆرسىتىلىدۇ.",
        "newimages-legend": "سۈزگۈچ",
        "newimages-label": "ھۆججەت ئاتى (ياكى ئۇنىڭ پارچىسى):",
-       "showhidebots": "($1 ماشىنا ئادەم)",
        "noimages": "كۆرۈدىغان ھېچنېمە يوق.",
        "ilsubmit": "ئىزدەش",
        "bydate": "چېسلا بويىچە",
index 6038591..10b7901 100644 (file)
        "blockip": "Блокування",
        "blockip-legend": "Блокування користувача",
        "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\n* Якщо ви блокуєте обліковий запис бота, переконайтеся, що ви вимкнули автоблокування (для запобігання автоматичного блокування облікових записів власника бота або інших ботів).\n* Зверніть увагу, що IP-адреси у більшості випадків не варто блокувати на більший за декілька днів термін, щоб під блокування не підпали інші користувачі з таким самим IP. Винятки — частий довготривалий вандалізм.",
-       "ipadressorusername": "IP-адреса або ім'я користувача:",
+       "ipaddressorusername": "IP-адреса або ім'я користувача:",
        "ipbexpiry": "Термін:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Типові причини блокування\n** Вставка неправильної інформації\n** Видалення змісту сторінок\n** Спам, рекламні посилання\n** Вставка нісенітниці/лайки в текст\n** Залякуюча поведінка/переслідування\n** Зловживання кількома обліковими записами\n** Неприйнятне ім'я користувача",
        "newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файлу (або її частина):",
-       "showhidebots": "($1 ботів)",
        "noimages": "Файли відсутні.",
        "ilsubmit": "Шукати",
        "bydate": "за датою",
index 13e5f2b..6ae2b30 100644 (file)
        "unblock": "Foydalanuvchiga yo'l ochish",
        "blockip": "Foydalanuvchini chetlashtir",
        "blockip-legend": "Foydalanuvchini muhosara qilish",
-       "ipadressorusername": "IP-manzil yoki foydalanuvchi nomi:",
+       "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
        "ipbexpiry": "Tugaydi:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
        "show-big-image": "Toʻliq hajmdagi tasvir",
        "noimages": "Tasvir mavjud emas.",
        "ilsubmit": "Qidirish",
+       "variantname-uz-latn": "lotincha",
+       "variantname-uz-cyrl": "кириллча",
        "metadata": "Metama’lumot",
        "metadata-expand": "Batafsil axborotni koʻrsatish",
        "metadata-collapse": "Batafsil axborotni yashirish",
index b9a0b1e..23d8abd 100644 (file)
        "blockip": "Bloco utente",
        "blockip-legend": "Bloca l'utente",
        "blockiptext": "Dòpara el moduło qua soto par blocar l'accesso in scritura a un speçifico utente o indirizo IP. El bloco el gà de èssar operà par prevegner ati de vandalismo e in streta osservansa de ła [[{{MediaWiki:Policy-url}}|policy de {{SITENAME}}]]. Speçifica in detałio el motivo del bloco nel canpo seguente (ad es. indicando i titołi de łe pàxene ogeto de vandalismo).",
-       "ipadressorusername": "Indirizo IP o nome utente",
+       "ipaddressorusername": "Indirizo IP o nome utente",
        "ipbexpiry": "Scadensa",
        "ipbreason": "Motivassion:",
        "ipbreason-dropdown": "*Motivazion piassè comuni par i blocchi\n** Inserimento de informazion false\n** Rimozion de contenuti da le pagine\n** Colegamenti promozionali a siti foresti\n** Inserimento de contenuti privi de senso\n** Conportamenti intimidatori o molestie\n** Uso indebito de più account\n** Nome utente non cònsono",
        "newimages-summary": "Sta pagina speciale la mostra i file cargà piassè reçentemente.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome del file (o na parte de élo):",
-       "showhidebots": "($1 i bot)",
        "noimages": "No ghè gnente da vardare.",
        "ilsubmit": "Serca",
        "bydate": "data",
index e1e8706..dcb3994 100644 (file)
        "blockip": "Blokiruida kävutajad",
        "blockip-legend": "Blokiruida kävutajad",
        "blockiptext": "Kävutagat alemba anttud form, miše blokiruida kirjutandan voimuz märitud IP-adresaspäi.\nNece sab tehta vaiše sen täht, miše borcuidas vandalizmanke, kut om kirjutadud [[{{MediaWiki:Policy-url}}|ohjandimiš]].\nKirjutagat sü alemba (ozutesikš, citiruigat vandaliziruidud lehtpoled).",
-       "ipadressorusername": "IP-adres vai kävutajan nimi:",
+       "ipaddressorusername": "IP-adres vai kävutajan nimi:",
        "ipbexpiry": "Lopindan strok:",
        "ipbreason": "Sü:",
        "ipbreason-dropdown": "*Blokiruindan päsüd\n** Väran informacijan andand\n** Lehtpoliden südäimišton čudand\n** Spamkosketused irdsaitoihe\n** Hamatoman tekstan da rujon kirjutamine lehtpolile\n** Toižiden kävutajiden pöl'gästoitand\n** Erazvuiččiden registracijoiden kävutand ühtel ristitul\n** Paha kävutajan nimi",
        "newimages-summary": "Necil specialižel lehtpolel ozutadas tantoi jügutoittud failoid.",
        "newimages-legend": "Fil'tr",
        "newimages-label": "Failan nimi (vai sen pala):",
-       "showhidebots": "($1 botad)",
        "noimages": "Ei ole uzid kuvid.",
        "ilsubmit": "Ectä",
        "bydate": "datan mödhe",
index 43d21f8..c70f3cf 100644 (file)
@@ -24,7 +24,8 @@
                        "Vương Ngân Hà",
                        "Withoutaname",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Tranquanganh"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "jumptonavigation": "chuyển hướng",
        "jumptosearch": "tìm kiếm",
        "view-pool-error": "Xin lỗi, máy chủ hiện đang bị quá tải.\nCó quá nhiều thành viên đang cố gắng xem trang này.\nXin hãy đợi một lát rồi thử truy cập lại vào trang.\n\n$1",
+       "generic-pool-error": "Xin lỗi, các máy chủ hiện đang bị quá tải.\nCó quá nhiều người dùng đang cố gắng xem tài nguyên này.\nXin hãy đợi một lát rồi thử truy cập lại vào tài nguyên.",
        "pool-timeout": "Hết thời gian chờ đợi khóa",
        "pool-queuefull": "Đầy hàng đợi khối ứng dụng (pool queue)",
        "pool-errorunknown": "Lỗi lạ",
        "passwordreset-capture": "Xem thư điện tử có mật khẩu tạm",
        "passwordreset-capture-help": "Nếu bạn kiểm hộp này, bạn sẽ xem thư điện tử có mật khẩu tạm lúc khi nó được gửi cho người dùng.",
        "passwordreset-email": "Địa chỉ thư điện tử:",
-       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAM}}",
+       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: $1\nMật khẩu tạm: $2",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã bị xóa.",
        "edit-conflict": "Sửa đổi mâu thuẫn.",
        "edit-no-change": "Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.",
+       "postedit-confirmation-created": "Trang đã được tạo ra.",
+       "postedit-confirmation-restored": "Trang đã được phục hồi.",
        "postedit-confirmation-saved": "Sửa đổi của bạn đã được lưu.",
        "edit-already-exists": "Không thể tạo trang mới.\nNó đã tồn tại.",
        "defaultmessagetext": "Nội dung mặc định",
        "action-createpage": "tạo trang",
        "action-createtalk": "tạo trang thảo luận",
        "action-createaccount": "mở tài khoản này",
+       "action-history": "xem lịch sử của trang này",
        "action-minoredit": "đánh dấu đây là sửa đổi nhỏ",
        "action-move": "di chuyển trang này",
        "action-move-subpages": "di chuyển trang này và các trang con",
        "recentchanges-legend-heading": "'''Chú giải:'''",
        "recentchanges-legend-newpage": "(xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
-       "rclistfrom": "Hiển thị các thay đổi từ $3 $2.",
+       "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
+       "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "rcshowhideminor-show": "Hiện",
        "rcshowhideminor-hide": "Ẩn",
        "protectedpages-cascade": "Chỉ hiển thị khóa theo tầng",
        "protectedpages-noredirect": "Ẩn trang đổi hướng",
        "protectedpagesempty": "Hiện không có trang nào bị khóa với các thông số này.",
-       "protectedpages-timestamp": "Dấu thời gian",
+       "protectedpages-timestamp": "Thời gian",
        "protectedpages-page": "Trang",
        "protectedpages-expiry": "Hết hạn",
        "protectedpages-performer": "Người dùng khóa",
        "log-title-wildcard": "Tìm các tựa trang bắt đầu bằng các chữ này",
        "showhideselectedlogentries": "Thay đổi mức khả kiến của các mục nhật trình đã chọn",
        "allpages": "Mọi trang",
-       "alphaindexline": "$1 đến $2",
        "nextpage": "Trang sau ($1)",
        "prevpage": "Trang trước ($1)",
        "allpagesfrom": "Xem trang từ:",
        "blockip": "Cấm người dùng",
        "blockip-legend": "Cấm người dùng",
        "blockiptext": "Dùng mẫu dưới để cấm một địa chỉ IP hoặc thành viên không được viết trang.\nĐiều này chỉ nên làm để tránh phá hoại, và phải theo [[{{MediaWiki:Policy-url}}|quy định]].\nĐiền vào lý do cụ thể ở dưới (ví dụ, chỉ ra trang nào bị phá hoại).",
-       "ipadressorusername": "Địa chỉ IP hay tên thành viên:",
+       "ipaddressorusername": "Địa chỉ IP hay tên thành viên:",
        "ipbexpiry": "Thời hạn:",
        "ipbreason": "Lý do:",
        "ipbreason-dropdown": "*Một số lý do cấm thường gặp\n** Phá hoại\n** Thêm thông tin sai lệch\n** Xóa nội dung trang\n** Đăng liên kết thư rác dẫn đến trang Web bên ngoài\n** Cho thông tin rác vào trang\n** Có thái độ dọa dẫm/quấy rối\n** Lạm dụng nhiều tài khoản\n** Tên thành viên không thể chấp nhận",
        "newimages-summary": "Trang đặc biệt này hiển thị các tập tin được tải lên gần đây nhất.",
        "newimages-legend": "Bộ lọc",
        "newimages-label": "Tên tập tin (hoặc một phần tên):",
-       "showhidebots": "($1 robot)",
        "noimages": "Chưa có hình.",
        "ilsubmit": "Tìm kiếm",
        "bydate": "theo ngày",
-       "sp-newimages-showfrom": "Trưng bày những tập tin mới, bắt đầu từ lúc $2, ngày $1",
+       "sp-newimages-showfrom": "Trưng bày các tập tin từ $2 $1 trở về sau",
        "video-dims": "$1, $2×$3",
        "seconds-abbrev": "$1 s",
        "minutes-abbrev": "$1 min",
        "htmlform-no": "Không",
        "htmlform-yes": "Có",
        "htmlform-chosen-placeholder": "Chọn một tùy chọn",
+       "htmlform-cloner-create": "Tiếp tục thêm",
+       "htmlform-cloner-delete": "Loại bỏ",
+       "htmlform-cloner-required": "Cần ít nhất một giá trị.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "sqlite-no-fts": "$1 không có hỗ trợ tìm kiếm toàn văn",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
index f31bdb4..ecc53f1 100644 (file)
        "blockip": "Blokön gebani",
        "blockip-legend": "Blokön gebani",
        "blockiptext": "Gebolös padi at ad blokön redakamagitäti gebananema u ladeta-IP semikas. Atos söton padunön teiko ad vitön vandalimi, e bai [[{{MediaWiki:Policy-url}}|dunalesets {{SITENAME}}]]. Penolös dono kodi patik pro blokam (a. s., mäniotolös padis pedobüköl).",
-       "ipadressorusername": "Ladet-IP u gebananem",
+       "ipaddressorusername": "Ladet-IP u gebananem",
        "ipbexpiry": "Dü",
        "ipbreason": "Kod:",
        "ipbreason-dropdown": "*Blokamakods suvik:\n** Läükam nünas neverätik\n** Moükam ninäda se pads\n** Läükam yümas plödik tu mödikis (el „spam“)\n** Penam vödas/vödemas nesiämik su pads\n** Kondöt tu komipälik u dredüköl\n** Geb dobik kalas mödik\n** Gebananem no zepabik",
        "newimages-summary": "Pad patik at lisedon ragivis pelöpüköl lätik.",
        "newimages-legend": "Sul",
        "newimages-label": "Ragivanem (u dil ona):",
-       "showhidebots": "($1 mäikamenis)",
        "noimages": "Nos ad logön.",
        "ilsubmit": "Sukolöd",
        "bydate": "ma dät",
index a5ac915..19909f8 100644 (file)
        "whatlinkshere-filters": "Sõglaq",
        "blockip": "Piäq puutri võrgoaadrõs kinniq",
        "blockiptext": "Taa vorm om kimmä puutri võrgoaadrõsi päält tettüisi kirotuisi kinniqpidämises. '''Taad tohis tetäq õnnõ lehti ts'urkmisõ vasta ni [[{{MediaWiki:Policy-url}}|{{SITENAME}} sisekõrra perrä]]'''. Kimmähe tulõ täütäq ka rida \"põhjus\". Sinnäq võinuq pandaq nt lingiq noilõ lehile, midä rikuti.",
-       "ipadressorusername": "Puutri võrgoaadrõs vai pruukjanimi",
+       "ipaddressorusername": "Puutri võrgoaadrõs vai pruukjanimi",
        "ipbexpiry": "Tähtaig",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Hariliguq kinniqpidämise põhjusõq\n** Võlss teedüse kirotaminõ\n** Lehti sisu ärqkistutaminõ\n** Reklaamilinkõ pandminõ\n** Mõttõlda jutu vai prahi pandminõ\n** Segämine ja ts'urkminõ\n** Mitmõ pruukjanime võlsspruukminõ\n** Sündümäldäq pruukjanimi",
        "show-big-image": "Algteedüstü",
        "newimages": "Vahtsõq pildiq",
        "imagelisttext": "Pilte nimekirän $1 (sordiduq $2).",
-       "showhidebots": "($1 robodiq)",
        "noimages": "Olõ-i vahtsit pilte.",
        "ilsubmit": "Otsminõ",
        "bydate": "kuupäävä perrä",
index 273e010..13ea5e4 100644 (file)
        "autoblockid": "Blocaedje otomatike #$1",
        "blockip": "Bloker èn uzeu",
        "blockiptext": "Rimplixhoz les tchamps chal pa dzo po bloker\nl' accès e scrijhaedje d' èn uzeu dné ou a pårt d' ene\nadresse IP dnêye. Çouci èn doet esse fwait ki po-z arester les\nvandales, et çoula doet esse fwait tot shuvant les\n[[{{MediaWiki:Policy-url}}|rîles]].\nDinez ene råjhon do blocaedje (eg: dijhoz les pådjes k' ont\nstî vandalijheyes).",
-       "ipadressorusername": "Adresse IP ou no d' uzeu",
+       "ipaddressorusername": "Adresse IP ou no d' uzeu",
        "ipbexpiry": "Tins do blocaedje",
        "ipbreason": "Råjhon:",
        "ipbsubmit": "Bloker cist uzeu",
        "show-big-image": "Imådje a si grandeur d' oridjinne",
        "newimages": "Galreye des nouvès imådjes",
        "imagelisttext": "Chal pa dzo c' est ene djivêye di '''$1''' {{PLURAL:$1|imådje relîte|imådjes relîtes}} $2.",
-       "showhidebots": "($1 robots)",
        "noimages": "I n' a rén a vey.",
        "ilsubmit": "Cweri",
        "bydate": "pazès dates",
index d334bd7..0cd9595 100644 (file)
        "whatlinkshere-hidelinks": "заалһудиг $1",
        "whatlinkshere-filters": "Шүрс",
        "blockip": "Демнчиг бүслх",
-       "ipadressorusername": "IP хайг аль демнчна нернь:",
+       "ipaddressorusername": "IP хайг аль демнчна нернь:",
        "ipbreason": "Учр:",
        "ipboptions": "2 часуд:2 hours,1 өдр:1 day,3 өдрмүд:3 days,1 долан хонг:1 week,2 долан хонгуд:2 weeks,1 сар:1 month,3 сармуд:3 months,6 сармуд:6 months,1 җил:1 year,мөнк:infinite",
        "ipblocklist": "Бүслсн болн демнчнр",
index 3b64e43..6e12f9b 100644 (file)
        "log-title-wildcard": "זוכן טיטלען וואס הייבן אָן מיט דעם טעקסט",
        "showhideselectedlogentries": "ווײַזן/באַהאַלטן געקליבענע לאגבוך אקציעס",
        "allpages": "אַלע בלעטער",
-       "alphaindexline": "$1 ביז $2",
        "nextpage": "קומענדיקער בלאַט ($1)",
        "prevpage": "פֿריִערדיקער בלאַט ($1)",
        "allpagesfrom": "ווייזן בלעטער אנגעהויבן פון:",
        "blockip": "בלאקירן באַניצער",
        "blockip-legend": "בלאקירן באַניצער",
        "blockiptext": "באניצט די פארעם דא אונטן כדי צו בלאקירן שרײַבן רעכטן פֿון איינגעשריבענע באניצער אדער סתם ספעציפישע איי פי אדרעסן.\n\nאזאלכע בלאקירונגען מוזן דורכגעפירט ווערן בלויז צו פֿאַרמײַדן וואַנדאַליזם, און לויט די [[{{MediaWiki:Policy-url}}|פארשריפטן און פאליסיס]].\n\nביטע שרײַבט ארויס קלאָר די ספעציפֿישע סיבה (למשל, ציטירן וועלכע בלעטער מ'האט וואַנדאַליזירט).",
-       "ipadressorusername": "IP אדרעס אדער באַניצער נאמען:",
+       "ipaddressorusername": "IP אדרעס אדער באַניצער נאמען:",
        "ipbexpiry": "אויסגיין:",
        "ipbreason": "אורזאַך:",
        "ipbreason-dropdown": "* פֿארשפרייטע בלאקירן סיבות\n** ארײַנלייגן פֿאלשע אינפֿארמאציע\n** אויסמעקן אינהאַלט פֿון בלעטער\n** פֿארפֿלייצן לינקען צו דרויסנדיקע ערטער\n** ארײַנלייגן שטותים/טאָטעריש אין בלעטער\n** סטראשעט און שטערט\n** קרומבאניצן מערערע קאנטעס\n** באַניצער נאָמען פראבלעמאַטיש",
        "newimages-summary": "דער באַזונדערער בלאַט ווײַזט די לעצטע ארויפֿגעלאָדענע טעקעס.",
        "newimages-legend": "פֿילטער",
        "newimages-label": "טעקע נאָמען (אדער אַ טײל דערפֿון):",
-       "showhidebots": "($1 ראָבאָטן)",
        "noimages": "נישטא קיין בילדער.",
        "ilsubmit": "זוכן",
        "bydate": "לויטן דאטום",
index 254f2e0..5be55de 100644 (file)
        "blockip": "Dínà oníṣe",
        "blockip-legend": "Ìdínà oníṣẹ",
        "blockiptext": "Ẹ lo fọ́ọ̀mù ìsàlẹ̀ láti dínà ìle kọ láti ọ̀dọ̀ àdírẹ́ẹ̀sì IP pàtó kan tàbí orúkọ oníṣe.\nẸyí gbọ́dọ̀ jẹ́ síṣe láti dínà ìṣèbàjẹ́ nìkan, àtí gẹ́gẹ́bí [[{{MediaWiki:Policy-url}}|ètò ìsiṣẹ́]].\nẸ sọ ìdí pàtó nísàlẹ̀ (fún àpẹrẹ, ìtọ́kasí àwọn ojúewé pàtó tí wọ́n jẹ́ bíbàjẹ́).",
-       "ipadressorusername": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
+       "ipaddressorusername": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
        "ipbexpiry": "Ìwásópin:",
        "ipbreason": "Ìdíẹ̀:",
        "ipbreason-dropdown": "*Àwọn ìdí fún ìdínà\n** Àròyé tí kò jẹ́ òtítọ́\n** Yíyọ àkóónú kúrò nínú ojúewé\n** Kíkọ àjápọ̀ sí àwọn ibi tí kò ní ìbámu mọ́ ojúewé\n** Ìkọkúkọ sínú ojúewé\n** Iwùwà ìpayà sí ẹlòmíràn\n** Ìlòkulò ọ̀pọ̀lọpọ̀ àpamọ́\n** Lílo orúkọ oníṣe tí kò tọ́",
        "newimages-summary": "Ojúewé pàtàkì yìí ṣe àfihàn àwọn fáìlì ìrùsókè gbẹ̀yìn.",
        "newimages-legend": "Ajọ̀",
        "newimages-label": "Orúkọ faili (tàbí apá kan rẹ̀):",
-       "showhidebots": "(àwọn bot $1)",
        "noimages": "Kò sí àwòrán.",
        "ilsubmit": "Ṣàwárí",
        "bydate": "bíi ọjọ́ọdún",
index c326085..4c37bd6 100644 (file)
        "blockip": "封鎖用戶",
        "blockip-legend": "封鎖用戶",
        "blockiptext": "使用以下嘅表格嚟去阻止指定嘅IP地址或用戶名嘅寫權限。\n僅當僅當為咗避免有版畀人惡意破壞嘅時候先可以使用,而且唔可以違反[[{{MediaWiki:Policy-url}}|政策]]。\n喺下面填寫阻止嘅確切原因(比如:引用咗某啲已經破壞咗嘅頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*共用封鎖原因\n** 插入錯嘅資料\n** 響頁面度拎走\n** 亂加入外部連結\n** 響頁度加入冇意義嘅嘢\n** 嚇人/騷擾\n** 濫用多個戶口\n** 唔能夠接受嘅用戶名",
        "newimages-summary": "呢個特別頁顯示最後上載咗嘅檔案。",
        "newimages-legend": "過濾",
        "newimages-label": "檔名(或佢嘅一部份):",
-       "showhidebots": "($1 機械人)",
        "noimages": "冇嘢去睇。",
        "ilsubmit": "搵嘢",
        "bydate": "以時間",
index 33fadab..eec0373 100644 (file)
        "right-move": "移动页面",
        "right-move-subpages": "移动页面及其子页面",
        "right-move-rootuserpages": "移动根用户页面",
+       "right-move-categorypages": "移动分类页面",
        "right-movefile": "移动文件",
        "right-suppressredirect": "移动页面时不创建来源页面的重定向",
        "right-upload": "上传文件",
        "action-move": "移动本页",
        "action-move-subpages": "移动本页及其子页面",
        "action-move-rootuserpages": "移动根用户页面",
+       "action-move-categorypages": "移动分类页面",
        "action-movefile": "移动本文件",
        "action-upload": "上传本文件",
        "action-reupload": "覆盖本文件",
        "uploadscriptednamespace": "此SVG文件包含非法名字空间“$1”",
        "uploadinvalidxml": "上传文件中的XML无法解析。",
        "uploadvirus": "该文件包含病毒!\n详情:$1",
-       "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。\n不允许上传的 Java 文件,因为他们可能会跳过的安全限制。",
+       "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。上传Java文件不被允许,因为它们可能绕过限制,从而引起安全问题。",
        "upload-source": "来源文件",
        "sourcefilename": "源文件名:",
        "sourceurl": "来源网址:",
        "log-title-wildcard": "搜索以该文字开头的标题",
        "showhideselectedlogentries": "显示/隐藏所选日志项",
        "allpages": "所有页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一页($1)",
        "prevpage": "上一页($1)",
        "allpagesfrom": "显示页面开始于:",
        "blockip": "封禁用户",
        "blockip-legend": "封禁用户",
        "blockiptext": "使用下方的表单来禁止来自特定IP地址或用户名的写访问。\n只有在为了防止破坏,并符合[[{{MediaWiki:Policy-url}}|方针]]的情况下才可采取此行动。\n请在下面输入一个具体的理由(例如引述一个被破坏的页面)。",
-       "ipadressorusername": "IP地址或用户名:",
+       "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 删除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
        "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
        "movearticle": "移动页面:",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
+       "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "movenotallowed": "你没有权限移动页面。",
        "movenotallowedfile": "你没有权限移动文件。",
        "cant-move-user-page": "你没有权限移动用户页面(子页面除外)。",
        "cant-move-to-user-page": "你没有权限移动页面至用户页面(用户子页面除外)。",
+       "cant-move-category-page": "您没有权限移动分类页面。",
+       "cant-move-to-category-page": "您没有权限移动页面至分类页面。",
        "newtitle": "新标题:",
        "move-watch": "监视来源页面和目标页面",
        "movepagebtn": "移动页面",
        "newimages-summary": "本特殊页面展示最后上传的文件。",
        "newimages-legend": "过滤",
        "newimages-label": "文件名(或它的一部份):",
-       "showhidebots": "($1机器人)",
+       "newimages-showbots": "显示机器人上传",
        "noimages": "无可查看文件。",
        "ilsubmit": "搜索",
        "bydate": "按日期",
        "watchlistedit-raw-done": "您的监视列表已经更新。",
        "watchlistedit-raw-added": "$1个标题被添加:",
        "watchlistedit-raw-removed": "$1个标题被删除:",
+       "watchlistedit-clear-title": "清空的监视列表",
+       "watchlistedit-clear-legend": "清空监视列表",
+       "watchlistedit-clear-explain": "所有标题将从您的监视列表中移除",
+       "watchlistedit-clear-titles": "标题:",
+       "watchlistedit-clear-submit": "清空监视列表(永久!)",
+       "watchlistedit-clear-done": "您的监视列表已清空。",
+       "watchlistedit-clear-removed": "$1个标题已移除:",
+       "watchlistedit-too-many": "这里显示了太多页面。",
+       "watchlisttools-clear": "清空监视列表",
        "watchlisttools-view": "查看相关更改",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
index c8e9837..1323ab2 100644 (file)
        "toc": "目錄",
        "showtoc": "顯示",
        "hidetoc": "隱藏",
-       "collapsible-collapse": "摺",
+       "collapsible-collapse": "摺",
        "collapsible-expand": "展開",
        "thisisdeleted": "檢視或還原 $1 ?",
        "viewdeleted": "檢視 $1?",
        "parser-unstrip-loop-warning": "檢測到迴圈",
        "parser-unstrip-recursion-limit": "遞歸超過限制 ($1)",
        "converter-manual-rule-error": "手動語言轉換規則中檢測到錯誤",
-       "undo-success": "該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。",
-       "undo-failure": "由於中途的編輯不一致,此編輯不能撤銷。",
+       "undo-success": "此編輯可以被還原。\n請檢查以下比較表,確認您是否要還原,然後儲存以下變更以完成編輯還原。",
+       "undo-failure": "由於編輯的修訂間有衝突,此編輯不能還原。",
        "undo-norev": "由於其修訂版本不存在或已刪除,此編輯不能撤銷。",
-       "undo-nochange": "æ\98¯æ¬¡ç·¨è¼¯ä¼¼ä¹\8eå·²ç¶\93被æ\92¤é\8a·。",
+       "undo-nochange": "此編輯å\8f¯è\83½å·²è¢«é\82\84å\8e\9f。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
        "lineno": "行 $1:",
        "compareselectedversions": "比較已選擇的修訂",
        "showhideselectedversions": "顯示/隱藏已選擇的修訂",
-       "editundo": "原",
+       "editundo": "原",
        "diff-empty": "(無差異)",
        "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
        "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
        "titlematches": "頁面標題相符",
        "textmatches": "頁面內容相符",
        "notextmatches": "沒有頁面內容匹配",
-       "prevn": "前 $1 ",
-       "nextn": "後 {{PLURAL:$1|$1}} ",
-       "prevn-title": "前 $1 結果",
-       "nextn-title": "後 $1 結果",
+       "prevn": "前 $1 ",
+       "nextn": "後 {{PLURAL:$1|$1}} ",
+       "prevn-title": "前 $1 結果",
+       "nextn-title": "後 $1 結果",
        "shown-title": "每頁顯示 $1 項結果",
        "viewprevnext": "檢視 ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
        "search-relatedarticle": "相關",
        "searcheverything-enable": "搜尋所有命名空間",
        "searchrelated": "相關",
-       "searchall": "所有",
+       "searchall": "全部",
        "showingresults": "下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:",
-       "showingresultsinrange": "以下顯示於#<strong>$2</strong>至#<strong>$3</strong>之<strong>$1</strong>個搜尋結果。",
+       "showingresultsinrange": "以下顯示第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆,共 <strong>$1</strong> 筆搜尋結果。",
        "showingresultsnum": "下面顯示從第 '''$2''' 條開始的 '''{{PLURAL:$3|1|$3}}''' 條結果。",
        "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 至第 '''$3''' 項結果|第 '''$1 - $2''' 項,共 '''$3''' 項結果}}",
        "search-nonefound": "在查詢中無結果相符。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
-       "powersearch-togglelabel": "核取:",
-       "powersearch-toggleall": "所有",
+       "powersearch-togglelabel": "勾選:",
+       "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
        "search-external": "外部搜尋",
        "searchdisabled": "{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。",
        "prefs-rc": "最近變更",
        "prefs-watchlist": "監視列表",
        "prefs-watchlist-days": "監視列表中顯示的天數:",
-       "prefs-watchlist-days-max": "最多$1{{PLURAL:$1|天}}",
-       "prefs-watchlist-edits": "擴充監視列表中顯示變更次數的上限:",
+       "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
+       "prefs-watchlist-edits": "展開的監視列表中顯示變更次數上限:",
        "prefs-watchlist-edits-max": "最大數量:1000",
        "prefs-watchlist-token": "監視列表密鑰:",
        "prefs-misc": "雜項",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
        "recentchangesdays": "最近變更的顯示日數:",
-       "recentchangesdays-max": "最多$1{{PLURAL:$1|天}}",
+       "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
        "prefs-help-recentchangescount": "這包含最近變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "這是一個秘密的密鑰,用於訂源您的監視列表。\n知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。",
        "editinguser": "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
        "saveusergroups": "儲存使用者群組",
-       "userrights-groupsmember": "屬於:",
-       "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
+       "userrights-groupsmember": "所屬群組:",
+       "userrights-groupsmember-auto": "所屬隱含群組:",
+       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其它使用者在 Wiki 上的權限。",
        "userrights-nodatabase": "資料庫$1不存在或並非為本地的。",
        "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
        "userrights-notallowed": "你無權加入或刪除使用者權限。",
-       "userrights-changeable-col": "您可以更改的群組",
-       "userrights-unchangeable-col": "您不可以更改的群組",
+       "userrights-changeable-col": "您可變更的群組",
+       "userrights-unchangeable-col": "您不可變更的群組",
        "userrights-conflict": "使用者權限更改發生衝突!請重新檢視並確認你的更改。",
        "userrights-removed-self": "您已成功移除自己的權限,故此您沒法再次訪問此頁。",
        "group": "群組:",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
-       "right-minoredit": "標示編輯為小修訂",
+       "right-minoredit": "標示編輯為小修訂",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
+       "right-move-categorypages": "移動分類頁面",
        "right-movefile": "移動檔案",
        "right-suppressredirect": "移動頁面時不建立來源的重新導向頁面",
        "right-upload": "上傳檔案",
        "right-reupload-own": "覆蓋由同一位上載的檔案",
        "right-reupload-shared": "於本地無視共用媒體檔案庫上的檔案",
        "right-upload_by_url": "由一個URL上載檔案",
-       "right-purge": "不需要確認之下清除網站快取",
-       "right-autoconfirmed": "不受基於IP的頻率限制",
+       "right-purge": "不確認清除網站快取",
+       "right-autoconfirmed": "不受以 IP 為基礎的註冊頻率限制",
        "right-bot": "視為一個自動程序",
        "right-nominornewtalk": "若討論頁面為小修訂,則不顯示新訊息提示",
-       "right-apihighlimits": "在API查詢中使用更高的上限",
-       "right-writeapi": "使用API編寫",
+       "right-apihighlimits": "API 查詢中可使用較高上限值",
+       "right-writeapi": "使用寫入 API",
        "right-delete": "刪除頁面",
        "right-bigdelete": "刪除大量歷史之頁面",
        "right-deletelogentry": "刪除及恢復特定的日誌項目",
        "right-protect": "更改保護等級以及編輯被連鎖保護的頁面",
        "right-editprotected": "編輯保護層級為「{{int:protect-level-sysop}}」的頁面",
        "right-editsemiprotected": "編輯保護層級為「{{int:protect-level-autoconfirmed}}」的頁面",
-       "right-editinterface": "編輯使用者面",
+       "right-editinterface": "編輯使用者面",
        "right-editusercssjs": "編輯其他使用者的 CSS 和 JavaScript 檔案",
        "right-editusercss": "編輯其他使用者的 CSS 檔案",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔案",
        "action-move": "移動這個頁面",
        "action-move-subpages": "移動這個頁面跟它的子頁面",
        "action-move-rootuserpages": "移動使用者根頁面",
+       "action-move-categorypages": "移動分類頁面",
        "action-movefile": "移動這個檔案",
        "action-upload": "上載這個檔案",
        "action-reupload": "覆蓋這個現有的檔案",
        "enhancedrc-history": "歷史",
        "recentchanges": "最近變更",
        "recentchanges-legend": "最近變更選項",
-       "recentchanges-summary": "追蹤該 Wiki 在此頁面的最近變更。",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近變更。",
        "recentchanges-noresult": "在所選擇的時間裡沒有任何更改與所給條件吻合。",
        "recentchanges-feed-description": "追蹤該 Wiki 在此頁面的最近變更。",
-       "recentchanges-label-newpage": "這次編輯建立了一個新頁面",
-       "recentchanges-label-minor": "是一個小修訂",
-       "recentchanges-label-bot": "這次編輯是由機器人進行",
+       "recentchanges-label-newpage": "該次編輯建立了新頁面",
+       "recentchanges-label-minor": "該次編輯是一個小修訂",
+       "recentchanges-label-bot": "該次編輯為機器人所執行",
        "recentchanges-label-unpatrolled": "這次編輯尚未巡查過",
-       "recentchanges-label-plusminus": "更改前後頁面位元組大小的變化",
+       "recentchanges-label-plusminus": "頁面更改的位元組大小",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "(è¦\8b[[Special:NewPages|æ\96°é \81é\9d¢å\88\97表]])",
+       "recentchanges-legend-newpage": "(è«\8bå\8f\83è\80\83 [[Special:NewPages|æ\9c\80æ\96°é \81é\9d¢]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "ä¸\8bé\9d¢æ\98¯è\87ª<strong>$2</strong>èµ·ä¹\8bæ\9b´æ\94¹ï¼\88è\87³å¤\9a顯示<strong>$1</strong>å\80\8bï¼\89。",
-       "rclistfrom": "顯示è\87ª $3 $2 ä»¥ä¾\86ç\9a\84æ\96°變更",
-       "rcshowhideminor": "$1 小修訂",
+       "rcnotefrom": "以ä¸\8bç\82ºè\87ª <strong>$2</strong> èµ·ç\9a\84æ\9b´æ\94¹ (æ\9c\80å¤\9a顯示<strong>$1</strong> ç­\86)。",
+       "rclistfrom": "顯示è\87ª $3 $2 ä»¥ä¾\86ç\9a\84æ\9c\80è¿\91變更",
+       "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
-       "rcshowhidebots": "$1機器人的編輯",
+       "rcshowhidebots": "$1 機器人的編輯",
        "rcshowhidebots-show": "顯示",
        "rcshowhidebots-hide": "隱藏",
-       "rcshowhideliu": "$1 已註冊的使用者",
+       "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1 匿名的使用者",
+       "rcshowhideanons": "$1 匿名的使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
-       "rcshowhidepatr": "$1巡查過的編輯",
+       "rcshowhidepatr": "$1 巡查過的編輯",
        "rcshowhidepatr-show": "顯示",
        "rcshowhidepatr-hide": "隱藏",
-       "rcshowhidemine": "$1我的編輯",
+       "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
-       "rclinks": "顯示最近$2天內最新的$1次改動。<br />$3",
+       "rclinks": "顯示最近 $2 天內的 $1 次更改。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "upload_directory_read_only": "上傳目錄($1)不存在或無寫權限。",
        "uploaderror": "上傳錯誤",
        "upload-recreate-warning": "'''警告:一個相同名字的檔案曾經被刪除或者移動至別處。'''\n\n這個頁面的刪除和移動日誌在這裏提供以便參考:",
-       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可以進入[[Special:FileList|檔案上傳清單]],(重新)上傳也將在[[Special:Log/upload|上傳日誌]]中記錄,而刪除將在[[Special:Log/delete|刪除日誌]]中記錄。\n\n要在頁面中加入檔案,使用以下其中一種形式的連結:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''使用檔案的完整版本\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></code>'''使用放置於左側的一個框內的 200 像素寬的圖片,同時使用「替換文字」作為描述\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''直接連結到檔案而不顯示檔案",
-       "upload-permitted": "å\87\86許的檔案類型:$1。",
+       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可至 [[Special:FileList|檔案上傳清單]],(重新)上傳會在 [[Special:Log/upload|上傳日誌]] 中記錄,而刪除則會在 [[Special:Log/delete|刪除日誌]] 中記錄。\n\n要在頁面中引用檔案,可使用以下其中一種方式連結:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 顯示完整尺吋的圖片\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> 會在左方放置一張 200 像素寬的圖片於框中,並顯示 \"alt text\" 作為描述\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 直接連結到圖片而不顯示預覽",
+       "upload-permitted": "å\85\81許的檔案類型:$1。",
        "upload-preferred": "建議的檔案類型:$1。",
        "upload-prohibited": "禁止的檔案類型:$1。",
        "uploadlogpage": "上傳日誌",
-       "uploadlogpagetext": "以ä¸\8bæ\98¯æ\9c\80è¿\91ä¸\8aè¼\89ç\9a\84æª\94æ¡\88ç\9a\84ä¸\80覽表ã\80\82\n檢è¦\96[[Special:NewFiles|æ\96°æª\94æ¡\88ç\95«å»\8a]]å\8e»ç\9c\8bæ\9b´å¯\8cå\9c\96ç\89\87ç\9a\84總覽。",
+       "uploadlogpagetext": "以ä¸\8bæ¸\85å\96®ç\82ºæ\9c\80è¿\91ä¸\8aå\82³ç\9a\84æª\94æ¡\88ã\80\82\nè«\8b檢è¦\96 [[Special:NewFiles|æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫]] ä»¥è¦\96覺å\8c\96ç\9a\84æ\96¹å¼\8f檢è¦\96。",
        "filename": "檔案名稱",
        "filedesc": "檔案摘要",
        "fileuploadsummary": "檔案摘要:",
        "uploadvirus": "該檔案包含有病毒!\n詳情:$1",
        "uploadjava": "該檔案是 ZIP 檔案,其中包含 Java 的.class 檔案。\n不允許上傳 Java 檔案,是因為他們可能會跳過安全限制。",
        "upload-source": "來源檔案",
-       "sourcefilename": "來源檔案名:",
+       "sourcefilename": "來源檔案名:",
        "sourceurl": "來源網址:",
-       "destfilename": "目標檔案名:",
-       "upload-maxfilesize": "檔案最大限制大小:$1",
+       "destfilename": "目標檔案名:",
+       "upload-maxfilesize": "檔案大小限制:$1",
        "upload-description": "檔案描述",
-       "upload-options": "上選項",
+       "upload-options": "上選項",
        "watchthisupload": "監視這個檔案",
        "filewasdeleted": "之前已經有一個同名檔案被上傳後又被刪除了。在上傳此檔案之前您需要檢查$1。",
        "filename-bad-prefix": "您上傳的檔案名稱是以'''「$1」'''作為開頭,通常這種沒有含意的檔案名稱是由數碼相機中自動編排。請在您的檔案中重新選擇一個更加有意義的檔案名稱。",
        "upload-file-error": "內部錯誤",
        "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-misc-error": "未知的上傳錯誤",
-       "upload-misc-error-text": "在上傳時發生未知的錯誤。請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與[[Special:ListUsers/sysop|管理員]]聯繫。",
+       "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 位置是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
-       "upload-http-error": "已發生一個HTTP錯誤:$1",
-       "upload-copy-upload-invalid-domain": "不能從該域名上載檔案副本。",
-       "backend-fail-stream": "無法流傳送文件「$1」。",
-       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æ\96\87件ã\80\8c$1ã\80\8d。",
-       "backend-fail-notexists": "æ¢\9dç\9b®$1不存在。",
-       "backend-fail-hashes": "比較無法獲取文件hashes",
-       "backend-fail-notsame": "「$1」已存在不同的檔案。",
-       "backend-fail-invalidpath": "「$1」不是有效的存儲路徑。",
-       "backend-fail-delete": "無法刪除「$1」檔案。",
-       "backend-fail-describe": "無法修改檔案 \"$1\" 的 metadata。",
-       "backend-fail-alreadyexists": "檔案「$1」已存在。",
-       "backend-fail-store": "ç\84¡æ³\95å\9c¨$2å­\98å\84²æ\96\87件$1。",
-       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æ\96\87件$1å\88°$2。",
-       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æ\96\87件$1å\88°$2。",
-       "backend-fail-opentemp": "無法打開臨時文件。",
-       "backend-fail-writetemp": "無法寫臨時文件。",
-       "backend-fail-closetemp": "無法創建臨時文件。",
-       "backend-fail-read": "找不到檔案「$1」。",
-       "backend-fail-create": "無法寫入檔案「$1」。",
-       "backend-fail-maxsize": "ç\84¡æ³\95寫å\85¥æª\94æ¡\88ã\80\8c$1ã\80\8dâ\80\8bâ\80\8bï¼\8cå\9b ç\82ºå®\83大æ\96¼$2å­\97ç¯\80。",
-       "backend-fail-readonly": "「$1」儲存後端目前是唯讀模式,因為:「$2」",
-       "backend-fail-synced": "æ\96\87件ã\80\8c$1ã\80\8då\9c¨å\85§é\83¨å­\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9f。",
-       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8d。",
-       "backend-fail-internal": "å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8dç\99¼ç\94\9fäº\86ä¸\80å\80\8bæ\9cªç\9f¥錯誤。",
-       "backend-fail-contenttype": "無法確定檔案的內容類型以存儲於「$1」。",
+       "upload-http-error": "發生 HTTP 錯誤:$1",
+       "upload-copy-upload-invalid-domain": "不允許此網域複製上傳的檔案。",
+       "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
+       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æª\94æ¡\88 \"$1\"。",
+       "backend-fail-notexists": "æª\94æ¡\88 $1 不存在。",
+       "backend-fail-hashes": "無法取得檔案雜湊值(Hash)進行比較。",
+       "backend-fail-notsame": "於 \"$1\" 已存在另一個不相同的檔案。",
+       "backend-fail-invalidpath": "\"$1\" 不是有效的儲存路徑。",
+       "backend-fail-delete": "無法刪除檔案 \"$1\"。",
+       "backend-fail-describe": "無法修改檔案 \"$1\" 的資料定義。",
+       "backend-fail-alreadyexists": "檔案 \"$1\" 已存在。",
+       "backend-fail-store": "ç\84¡æ³\95å\84²å­\98æª\94æ¡\88 \"$1\" æ\96¼ \"$2\"。",
+       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-opentemp": "無法開啟暫存檔案。",
+       "backend-fail-writetemp": "無法寫入暫存檔案。",
+       "backend-fail-closetemp": "無法關閉暫存檔案。",
+       "backend-fail-read": "無法讀取檔案 \"$1\"。",
+       "backend-fail-create": "無法寫入檔案 \"$1\"。",
+       "backend-fail-maxsize": "ç\94±æ\96¼æª\94æ¡\88大å°\8fè¶\85é\81\8e $2 ä½\8då\85\83çµ\84ï¼\8cç\84¡æ³\95寫å\85¥æª\94æ¡\88 \"$1\"â\80\8bâ\80\8b。",
+       "backend-fail-readonly": "儲存庫的後端 \"$1\" 目前為唯讀模式。原因為:\"<em>$2</em>\"",
+       "backend-fail-synced": "æª\94æ¡\88 \"$1\" è\88\87å\85§é\83¨å\84²å­\98庫å¾\8c端å\85§ç\9a\84ç\8b\80æ\85\8bä¸\8dä¸\80è\87´。",
+       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å\84²å­\98庫å¾\8c端 \"$1\"。",
+       "backend-fail-internal": "å\84²å­\98庫å¾\8c端 \"$1\" ç\99¼ç\94\9fäº\86ä¸\8dæ\98\8eç\9a\84錯誤。",
+       "backend-fail-contenttype": "無法辨識儲存於 \"$1\" 的檔案內容類型。",
        "backend-fail-batchsize": "存儲後端被給予了「$1」次檔案 {{PLURAL:$1|操作}} ;限制是$2次{{PLURAL:$2|操作}}。",
-       "backend-fail-usable": "ç\94±æ\96¼æ²\92æ\9c\89足夠ç\9a\84æ¬\8aé\99\90æ\88\96缺å°\91è·¯å¾\91/容å\99¨ï¼\8cæ\89\80以ç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 $1 。",
-       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "lockmanager-notlocked": "ç\84¡æ³\95解é\8e\96ã\80\8c$1ã\80\8dï¼\9bå®\83æ²\92æ\9c\89被鎖定。",
-       "lockmanager-fail-closelock": "無法關閉「$1」的鎖文件。",
-       "lockmanager-fail-deletelock": "無法刪除「$1」的鎖文件。",
-       "lockmanager-fail-acquirelock": "無法為「$1」獲取鎖。",
-       "lockmanager-fail-openlock": "無法打開「$1」的鎖文件。",
-       "lockmanager-fail-releaselock": "無法為「$1」釋放鎖。",
+       "backend-fail-usable": "ç\94±æ\96¼æ¬\8aé\99\90ä¸\8d足æ\88\96ç\9b®é\8c\84/容å\99¨é\81ºå¤±ï¼\8cç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 \"$1\"。",
+       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "lockmanager-notlocked": "ç\84¡æ³\95解é\99¤é\8e\96å®\9a \"$1\"ï¼\9b該æª\94æ¡\88並æ\9cª被鎖定。",
+       "lockmanager-fail-closelock": "無法關閉 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-deletelock": "無法刪除 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-acquirelock": "無法取得 \"$1\" 的鎖定狀態。",
+       "lockmanager-fail-openlock": "無法開啟 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-releaselock": "無法釋放 \"$1\" 的鎖定狀態。",
        "lockmanager-fail-db-bucket": "不能在$1池中聯繫到足夠鎖數據庫。",
-       "lockmanager-fail-db-release": "不能在數據庫$1上釋放鎖。",
-       "lockmanager-fail-svr-acquire": "無法取得伺服器$1上的鎖。",
-       "lockmanager-fail-svr-release": "不能在服務器$1上釋放鎖。",
-       "zip-file-open-error": "打開檔案的 ZIP 檢查時遇到一個錯誤。",
-       "zip-wrong-format": "指定的檔案不是ZIP檔案。",
-       "zip-bad": "該檔案是已損壞或以其它方式無法讀取的 ZIP 檔案。\n不能正確檢查安全。",
-       "zip-unsupported": "該檔案是 ZIP 檔案,其中使用 MediaWiki 不支持的ZIP功能。\n不能正確檢查安全。",
-       "uploadstash": "上傳貯藏",
-       "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人無法查看。",
-       "uploadstash-clear": "清除貯藏檔案",
-       "uploadstash-nofiles": "{{GENDER:|ä½ |妳|ä½ }}æ²\92æ\9c\89已貯藏的檔案。",
-       "uploadstash-badtoken": "進行這個動作不成功,或者{{GENDER:|你|妳|你}}的編輯資訊已經過期。請再試。",
-       "uploadstash-errclear": "清除檔案不成功。",
+       "lockmanager-fail-db-release": "無法釋放資料庫 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-acquire": "無法取得伺服器 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-release": "無法釋放伺服器 $1 的鎖定狀態。",
+       "zip-file-open-error": "開啟檔案進行 ZIP 檢查時發生錯誤。",
+       "zip-wrong-format": "指定的檔案不是 ZIP 檔案。",
+       "zip-bad": "ZIP 檔案已損毀或無法讀取,\n無法正常執行安全檢查。",
+       "zip-unsupported": "ZIP 檔案使用了 MediaWiki 目前不支援的功能。\n無法正常執行安全檢查。",
+       "uploadstash": "上傳儲藏庫",
+       "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人無法查看。",
+       "uploadstash-clear": "清除儲藏庫檔案",
+       "uploadstash-nofiles": "{{GENDER:|ä½ |妳|ä½ }}æ²\92æ\9c\89å\84²藏的檔案。",
+       "uploadstash-badtoken": "執行動作失敗,{{GENDER:|你|妳|你}}的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
        "invalid-chunk-offset": "無效區塊偏移量",
        "img-auth-accessdenied": "拒絕存取",
-       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服務器尚未設置傳送該信息。\n它可能是基於CGI的,因而不支持img_auth。\n請參見 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
-       "img-auth-notindir": "所請求的路徑不在已經設定的上載目錄。",
-       "img-auth-badtitle": "不能夠由「$1」建立一個有效標題。",
-       "img-auth-nologinnWL": "您而家並未登入,「$1」不在白名單上。",
-       "img-auth-nofile": "檔案「$1」不存在。",
-       "img-auth-isdir": "您嘗試過存取一個目錄「$1」。\n只是可以存取檔案。",
-       "img-auth-streaming": "串流「$1」中。",
-       "img-auth-public": "img_auth.php的功能是由一個公共wiki中輸出檔案。\n這個wiki是已經設定做一個公共wiki。\n基於保安最佳化,img_auth.php已經停用。",
+       "img-auth-nopathinfo": "缺少 PATH_INFO。\n您的伺服器環境未傳遞此資訊,\n可能為以 CGI 為基礎並不支持 img_auth。\n詳情請參考 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
+       "img-auth-notindir": "所指定的路徑不在已設定的上傳目錄清單。",
+       "img-auth-badtitle": "無法由 \"$1\" 建立有效的標題。",
+       "img-auth-nologinnWL": "您尚未登入,且 \"$1\" 並未在允許清單上。",
+       "img-auth-nofile": "檔案 \"$1\" 不存在。",
+       "img-auth-isdir": "您正嘗試存取目錄 \"$1\",\n僅允許存取檔案。",
+       "img-auth-streaming": "傳輸 \"$1\" 中。",
+       "img-auth-public": "img_auth.php 的用途是讓非公開的 Wiki 可輸出檔案,\n此 Wiki 已設定為公開的 Wiki。\n基於安全性的考量,已停用 img_auth.php。",
        "img-auth-noread": "使用者沒有權限讀取 \"$1\"。",
-       "http-invalid-url": "無效的URL:$1",
-       "http-invalid-scheme": "不支援含有「$1」的URL。",
-       "http-request-error": "未知的錯誤令到HTTP請求失敗。",
-       "http-read-error": "HTTP讀取錯誤。",
-       "http-timed-out": "HTTP請求已過時。",
-       "http-curl-error": "擷取URL時出錯:$1",
-       "http-bad-status": "進行HTTP請求時出現問題:$1 $2",
-       "upload-curl-error6": "無法訪問 URL",
-       "upload-curl-error6-text": "無法訪問所提供的 URL。請再次檢查該 URL 是否正確,並且網站的訪問是否正常。",
-       "upload-curl-error28": "上傳時",
-       "upload-curl-error28-text": "網站回應時間過長。請檢查此網站的訪問是否正常,過一會再進行嘗試。您可能需要在網路訪問空閒時間再次進行嘗試。",
-       "license": "授權:",
-       "license-header": "授權",
-       "nolicense": "未選定",
+       "http-invalid-url": "無效的 URL:$1",
+       "http-invalid-scheme": "不支援 \"$1\" 協定的 URL。",
+       "http-request-error": "發生不明錯誤,HTTP 請求失敗。",
+       "http-read-error": "HTTP 讀取錯誤。",
+       "http-timed-out": "HTTP 請求已逾時。",
+       "http-curl-error": "擷取 URL 時錯誤:$1",
+       "http-bad-status": "進行 HTTP 請求發生問題:$1 $2",
+       "upload-curl-error6": "無法連線 URL",
+       "upload-curl-error6-text": "無法連線指定的 URL。\n請重新檢查 URL 是否正確,且確認網站是否正常運作。",
+       "upload-curl-error28": "上傳時",
+       "upload-curl-error28-text": "網站超出回應時間限制。\n請檢查該網站是否正常運作,並稍候一會再試一次。\n建議您可在非網路尖峰時段再嘗試連線。",
+       "license": "授權條款:",
+       "license-header": "授權條款",
+       "nolicense": "尚未選擇",
        "license-nopreview": "(不可預覽)",
        "upload_source_url": "(有效,可公開存取的 URL)",
        "upload_source_file": "(在您電腦上的檔案)",
        "listfiles-summary": "此特殊頁面顯示所有上傳過的檔案。",
-       "listfiles_search_for": "æ\8c\89æª\94æ¡\88å\90\8d稱æ\90\9cç´¢:",
+       "listfiles_search_for": "æ\90\9cå°\8båª\92é«\94å\90\8d稱:",
        "imgfile": "檔案",
        "listfiles": "檔案列表",
        "listfiles_thumb": "縮圖",
        "listfiles_size": "大小",
        "listfiles_description": "描述",
        "listfiles_count": "版本",
-       "listfiles-show-all": "包圖片的舊版本",
+       "listfiles-show-all": "包圖片的舊版本",
        "listfiles-latestversion": "目前版本",
        "listfiles-latestversion-yes": "是",
        "listfiles-latestversion-no": "否",
        "file-anchor-link": "檔案",
        "filehist": "檔案歷史",
-       "filehist-help": "點擊日期/時間以檢視當時出現過的檔案。",
+       "filehist-help": "點選日期/時間以檢視該時間的檔案版本。",
        "filehist-deleteall": "刪除全部",
        "filehist-deleteone": "刪除",
-       "filehist-revert": "恢復",
+       "filehist-revert": "還原",
        "filehist-current": "目前",
-       "filehist-datetime": "日期時間",
+       "filehist-datetime": "日期/時間",
        "filehist-thumb": "縮圖",
        "filehist-thumbtext": "於$1的縮圖版本",
        "filehist-nothumb": "沒有縮圖",
        "filehist-user": "使用者",
-       "filehist-dimensions": "維度",
+       "filehist-dimensions": "尺寸",
        "filehist-filesize": "檔案大小",
        "filehist-comment": "註解",
-       "imagelinks": "檔案使用情況",
-       "linkstoimage": "以ä¸\8bç\9a\84$1å\80\8bé \81é\9d¢é\80£æ\8e¥å\88°æ\9c¬æª\94æ¡\88:",
+       "imagelinks": "檔案使用",
+       "linkstoimage": "ä¸\8bå\88\97 $1 å\80\8bé \81é\9d¢é\80£çµ\90å\88°æ­¤æª\94æ¡\88ï¼\9a",
        "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
        "morelinkstoimage": "檢視連接到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
        "linkstoimage-redirect": "$1 (檔案重新導向至) $2",
-       "duplicatesoffile": "以下的$1個檔案跟這個檔案重覆([[Special:FileDuplicateSearch/$2|更多細節]]):",
+       "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
        "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
-       "sharedupload-desc-there": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n請參閱在[$2 檔案描述頁面]以了解其相關資訊。",
+       "sharedupload-desc-there": "此檔案來自 $1 且可能被其他專案所使用。\n請參考 [$2 檔案描述頁面] 了解進一步資訊。",
        "sharedupload-desc-here": "此檔案來自 $1 且可能被其他專案所使用。\n以下為該檔案於 [$2 檔案描述頁面] 的內容描述。",
-       "sharedupload-desc-edit": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在其[$2 檔案描述頁面]上編輯說明。",
+       "sharedupload-desc-edit": "此檔案來自 $1 且可能被其他專案所使用。\n您可在該檔案的 [$2 檔案描述頁面] 上編輯內容描述。",
        "sharedupload-desc-create": "此檔案來自 $1 且可能被其他專案所使用。\n若您想要編輯內容描述可至 [$2 檔案描述頁面]。",
        "filepage-nofile": "不存在此名稱的檔案。",
-       "filepage-nofile-link": "不存在此名稱的檔案,但您可以[$1 上傳它]。",
-       "uploadnewversion-linktext": "上傳檔案的新版本",
+       "filepage-nofile-link": "不存在此名稱的檔案,您可以 [$1 上傳]。",
+       "uploadnewversion-linktext": "上傳檔案的新版本",
        "shared-repo-from": "來自 $1",
        "shared-repo": "一個共用檔案庫",
        "shared-repo-name-wikimediacommons": "維基共享資源",
        "upload-disallowed-here": "您不可以覆蓋此檔案。",
-       "filerevert": "恢復$1",
-       "filerevert-legend": "恢復檔案",
-       "filerevert-intro": "您現正在恢復檔案'''[[Media:$1|$1]]'''到[$4 於$2 $3的版本]。",
-       "filerevert-comment": "理由:",
-       "filerevert-defaultcomment": "已經恢復到於$1 $2的版本",
-       "filerevert-submit": "恢復",
-       "filerevert-success": "'''[[Media:$1|$1]]'''已經恢復到[$4 於$2 $3的版本]。",
-       "filerevert-badversion": "這個檔案所提供的時間截記並無先前的本地版本。",
-       "filedelete": "刪除$1",
+       "filerevert": "還原 $1",
+       "filerevert-legend": "還原檔案",
+       "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
+       "filerevert-comment": "原因:",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-submit": "還原",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
+       "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
+       "filedelete": "刪除 $1",
        "filedelete-legend": "刪除檔案",
-       "filedelete-intro": "您現正刪除檔案'''[[Media:$1|$1]]'''。",
-       "filedelete-intro-old": "{{GENDER:|你|妳|你}}現正刪除'''[[Media:$1|$1]]'''於[$4 $2 $3]的版本。",
-       "filedelete-comment": "理由:",
+       "filedelete-intro": "您現正要刪除檔案 <strong>[[Media:$1|$1]]</strong> 與其所有歷史版本。",
+       "filedelete-intro-old": "您現正要刪除 <strong>[[Media:$1|$1]]</strong> 於 [$4 $2 $3] 的版本。",
+       "filedelete-comment": "原因:",
        "filedelete-submit": "刪除",
-       "filedelete-success": "'''$1'''已經刪除。",
-       "filedelete-success-old": "'''[[Media:$1|$1]]'''於 $2 $3 的版本已經刪除。",
-       "filedelete-nofile": "'''$1'''不存在。",
-       "filedelete-nofile-old": "在已指定屬性的情況下,這裡沒有'''$1'''的保存版本。",
-       "filedelete-otherreason": "其它/附加的理由:",
-       "filedelete-reason-otherlist": "其它理由",
-       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 重覆的檔案",
-       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\9f\8bç\94±",
-       "filedelete-maintenance": "ç\95¶å\9c¨ç¶­è­·æ\99\82å·²ç¶\93æ\9a«æ\99\82å\81\9cç\94¨æª\94æ¡\88å\88ªé\99¤å\92\8cæ\81¢å¾©。",
-       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æ\96\87件",
+       "filedelete-success": "已刪除 <strong>$1</strong>。",
+       "filedelete-success-old": "已刪除 <strong>[[Media:$1|$1]]</strong> 於 $2 $3 的版本。",
+       "filedelete-nofile": "<strong>$1</strong> 不存在。",
+       "filedelete-nofile-old": "查無 <strong>$1</strong> 擁有指定的屬性的封存版本。",
+       "filedelete-otherreason": "其它/額外的原因:",
+       "filedelete-reason-otherlist": "其它原因",
+       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 檔案重覆",
+       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\8e\9få\9b ",
+       "filedelete-maintenance": "維護æ\9c\9fé\96\93æª\94æ¡\88å\88ªé\99¤å\92\8cé\82\84å\8e\9fæ\9a«å\81\9c使ç\94¨。",
+       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æª\94æ¡\88",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\95\9fç\94¨æª\94æ¡\88MIMEé¡\9eå\9e\8bé\81\8e濾å\99¨ã\80\82輸å\85¥ï¸°內容類型/子類型,如 <code>image/jpeg</code>。",
-       "mimetype": "MIME 類型:",
+       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\8f¯æ\90\9cå°\8bæª\94æ¡\88ç\9a\84 MIME é¡\9eå\9e\8bã\80\82\n輸å\85¥æ ¼å¼\8fï¼\9a內容類型/子類型,如 <code>image/jpeg</code>。",
+       "mimetype": "MIME 類型",
        "download": "下載",
        "unwatchedpages": "未被監視的頁面",
-       "listredirects": "重新導向清單",
+       "listredirects": "重新導向頁面清單",
        "listduplicatedfiles": "重複檔案列表",
        "listduplicatedfiles-summary": "以下列表中某檔案之最新版本與其他檔案之最新版本重複。進包含本地檔案",
-       "listduplicatedfiles-entry": "檔案[[:File:$1|$1]]與[[$3|其他$2個重複]]。",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
        "unusedtemplates": "未使用的樣版",
-       "unusedtemplatestext": "此頁列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的頁面。\n請在刪除這些樣版前檢查其他使用該樣版的頁面。",
+       "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "randompage-nopages": "在{{PLURAL:$2|命名空間}}中沒有任何頁面:$1。",
        "randomincategory-invalidcategory": "\"$1\" 不是一個有效的分類名稱。",
        "randomincategory-nopages": "[[:Category:$1]]中沒有頁面。",
        "randomincategory-selectcategory": "從分類中獲取隨機頁面:$1 $2",
-       "randomincategory-selectcategory-submit": "顯示",
+       "randomincategory-selectcategory-submit": "前往",
        "randomredirect": "隨機重新導向",
        "randomredirect-nopages": "在命名空間 \"$1\" 中沒有重新導向頁面。",
        "statistics": "統計",
        "statistics-views-total-desc": "不存在頁面和特殊頁面的查看數未計入",
        "statistics-views-peredit": "每次編輯檢視數",
        "statistics-users": "已註冊的 [[Special:ListUsers|使用者]]",
-       "statistics-users-active": "活使用者",
+       "statistics-users-active": "活使用者",
        "statistics-users-active-desc": "在最近 $1 天操作過的使用者",
        "statistics-mostpopular": "被查閱次數最多的頁面",
-       "pageswithprop": "æ\9c\89é \81é\9d¢屬性的頁面",
+       "pageswithprop": "æ\93\81æ\9c\89屬性的頁面",
        "pageswithprop-legend": "有頁面屬性的頁面",
        "pageswithprop-text": "此頁列出所有頁面使用了特定的頁面屬性。",
        "pageswithprop-prop": "屬性名稱:",
        "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
        "double-redirect-fixed-maintenance": "作為維護工作自動修復於[[$1]]至[[$2]]之雙重重定向。",
        "double-redirect-fixer": "重新導向修正器",
-       "brokenredirects": "中斷的重新導向頁面",
+       "brokenredirects": "損壞的重新導向頁面",
        "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
        "withoutinterwiki": "未有語言連結的頁面",
-       "withoutinterwiki-summary": "以ä¸\8bç\9a\84é \81é\9d¢æ\98¯æ\9cªæ\9c\89èª\9eè¨\80é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬。",
-       "withoutinterwiki-legend": "å\89\8d綴",
+       "withoutinterwiki-summary": "ä¸\8bå\88\97æ\98¯æ²\92æ\9c\89é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬ç\9a\84é \81é\9d¢。",
+       "withoutinterwiki-legend": "å­\97é¦\96",
        "withoutinterwiki-submit": "顯示",
        "fewestrevisions": "最少修訂的頁面",
        "nbytes": "$1 個位元組",
        "ncategories": "$1 個分類",
        "ninterwikis": "$1 個跨維基",
-       "nlinks": "$1個連結",
+       "nlinks": "$1 個連結",
        "nmembers": "$1個成員",
        "nmemberschanged": "$1 → $2個成員",
        "nrevisions": "$1個修訂",
        "ntransclusions": "用於$1個頁面中",
        "specialpage-empty": "這個報告的結果為空。",
        "lonelypages": "孤立頁面",
-       "lonelypagestext": "以ä¸\8bé \81é\9d¢å°\9aæ\9cªè¢«{{SITENAME}}中ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96被ä¹\8bå\8c\85å\90«。",
+       "lonelypagestext": "ä¸\8bå\88\97é \81é\9d¢å°\9aæ\9cªè¢« {{SITENAME}} ä¸­ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96å¼\95ç\94¨。",
        "uncategorizedpages": "待分類頁面",
        "uncategorizedcategories": "待分類類別",
        "uncategorizedimages": "待分類檔案",
        "uncategorizedtemplates": "待分類樣版",
        "unusedcategories": "未使用的分類",
-       "unusedimages": "未使用圖片",
+       "unusedimages": "未使用的檔案",
        "popularpages": "熱點頁面",
        "wantedcategories": "需要的分類",
-       "wantedpages": "待撰頁面",
+       "wantedpages": "需要的頁面",
        "wantedpages-badtitle": "在結果組上的無效標題: $1",
        "wantedfiles": "需要的檔案",
        "wantedfiletext-cat": "以下檔案被使用,但不存在。外部儲存庫的文件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了不存在的檔案的網頁將在[[:$1]]列出。",
        "mostimages": "最多連結檔案",
        "mostinterwikis": "最多跨維基頁面",
        "mostrevisions": "最多修訂頁面",
-       "prefixindex": "所有有前綴的頁面",
+       "prefixindex": "所有頁面與字首",
        "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
-       "prefixindex-strip": "於列表中省略前綴",
-       "shortpages": "頁面",
-       "longpages": "é\95·頁面",
-       "deadendpages": "斷連頁面",
-       "deadendpagestext": "以下頁面沒有連結到{{SITENAME}}中的其它頁面。",
+       "prefixindex-strip": "於清單中省略字首",
+       "shortpages": "過短的頁面",
+       "longpages": "é\81\8eé\95·ç\9a\84頁面",
+       "deadendpages": "無連結頁面",
+       "deadendpagestext": "以下在 {{SITENAME}} 中的頁面未連結到其他頁面。",
        "protectedpages": "受保護頁面",
-       "protectedpages-indef": "只有無期之保護頁面",
-       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ä¿\9dè­·ä¹\8bé \81é\9d¢ã\80\82欲訪å\95\8få\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
-       "protectedpages-cascade": "只有連鎖之保護頁面",
+       "protectedpages-indef": "只顯示無限期的保護頁面",
+       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84é \81é\9d¢ã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·æ¨\99é¡\8cæ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
+       "protectedpages-cascade": "只顯示連鎖的保護頁面",
        "protectedpages-noredirect": "隱藏重新導向頁面",
        "protectedpagesempty": "在這些參數下沒有頁面正在保護。",
-       "protectedpages-timestamp": "æ\99\82é\96\93æ\88³",
+       "protectedpages-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "protectedpages-page": "頁面",
        "protectedpages-expiry": "期限",
        "protectedpages-performer": "保護使用者",
        "protectedpages-unknown-timestamp": "未知",
        "protectedpages-unknown-performer": "不明的使用者",
        "protectedtitles": "受保護標題",
-       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cã\80\82欲訪å\95\8få\8f\97ä¿\9dè­·é \81é\9d¢ä¹\8bå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
+       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84æ¨\99é¡\8cã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·é \81é\9d¢æ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "在這些參數之下並無標題正在保護。",
        "listusers": "使用者清單",
        "listusers-editsonly": "只顯示有編輯的使用者",
-       "listusers-creationsort": "建立日期排序",
+       "listusers-creationsort": "建立日期排序",
        "listusers-desc": "使用降冪排序",
        "usereditcount": "$1 次{{PLURAL:$1|編輯}}",
        "usercreated": "於 $1 $2 {{GENDER:$3|建立}}",
        "ancientpages": "最舊頁面",
        "move": "移動",
        "movethispage": "移動本頁",
-       "unusedimagestext": "下列檔案未有嵌入任何頁面但它仍然存在。\n請注意其它網站可能直接透過 URL 連結此檔案,所以這裡列出的圖片有可能依然被使用。",
-       "unusedcategoriestext": "é\9b\96ç\84¶æ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80æ\8e¡ç\94¨ï¼\8cä½\86å\88\97表中ç\9a\84å\88\86é¡\9eé \81ä¾\9dç\84¶å­\98å\9c¨ã\80\82",
+       "unusedimagestext": "下列為未被任何頁面使用的檔案。\n請注意,其它網站可能直接透過 URL 連結至檔案,所以這裡列出的檔案仍有可能被使用。",
+       "unusedcategoriestext": "ä¸\8bå\88\97å\88\86é¡\9eæ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80使ç\94¨ã\80\82",
        "notargettitle": "無目標",
        "notargettext": "您尚未指定目標頁面或使用者以進行此項操作。",
        "nopagetitle": "無目標頁面",
        "pager-older-n": "較舊 $1 筆",
        "suppress": "監督",
        "querypage-disabled": "此特殊頁面基於效能的原因已經被停用。",
-       "booksources": "網路書源",
-       "booksources-search-legend": "尋找網路書源",
+       "booksources": "圖書資源",
+       "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "booksources-go": "送出",
        "booksources-text": "以下是一份銷售新書或二手書的列表,並可能有{{GENDER:|你|妳|你}}正尋找的書的進一步訊息:",
        "log-title-wildcard": "搜尋以這個文字開始的標題",
        "showhideselectedlogentries": "顯示/隱藏所選的日誌項目",
        "allpages": "所有頁面",
-       "alphaindexline": "$1 到 $2",
        "nextpage": "下一頁 ($1)",
        "prevpage": "上一頁 ($1)",
        "allpagesfrom": "顯示從此處開始的頁面:",
        "allarticles": "所有頁面",
        "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "提交",
-       "allpagesprefix": "顯示有此前綴的頁面:",
-       "allpagesbadtitle": "給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。",
+       "allpagesprefix": "顯示以此為字首頁面:",
+       "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
        "allpages-hide-redirects": "隱藏重新導向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
        "cachedspecial-refresh-now": "查看最新。",
        "categories": "頁面分類",
-       "categoriespagetext": "以ä¸\8bç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}中å\8c\85å\90«äº\86é \81é\9d¢æ\88\96åª\92é«\94ã\80\82\n[[Special:UnusedCategories|æ\9cªç\94¨å\88\86é¡\9e]]ä¸\8dæ\9c\83å\9c¨é\80\99è£\8få\88\97示ã\80\82\nè«\8bå\90\8cæ\99\82å\8f\83é\96±[[Special:WantedCategories|需要的分類]]。",
+       "categoriespagetext": "ä¸\8bå\88\97ç\82ºå\8c\85å\90«é \81é\9d¢æ\88\96åª\92é«\94ç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}ã\80\82\n[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ç\9a\84å\88\86é¡\9e]] ä¸\8dæ\9c\83å\9c¨æ­¤é¡¯ç¤ºã\80\82\nè«\8bå\8f\83è\80\83 [[Special:WantedCategories|需要的分類]]。",
        "categoriesfrom": "顯示由此項起之分類:",
        "special-categories-sort-count": "按數量排列",
        "special-categories-sort-abc": "按字母排列",
        "listusers-submit": "顯示",
        "listusers-noresult": "查無使用者。",
        "listusers-blocked": "(已封鎖)",
-       "activeusers": "æ\9c\89æ´»å\8b\95ç\9a\84使ç\94¨è\80\85æ¸\85å\96®",
+       "activeusers": "活動的使用者清單",
        "activeusers-intro": "此清單為最近 $1 天有活動的使用者。",
-       "activeusers-count": "最近$3天內有$1次編輯",
+       "activeusers-count": "最近 $3 天內有 $1 次動作",
        "activeusers-from": "顯示使用者開始自:",
        "activeusers-hidebots": "隱藏機器人",
        "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "查無使用者。",
        "listgrouprights": "使用者群組權限",
        "listgrouprights-summary": "以下為此 Wiki 的使用者群組清單,以及相關的存取權限。\n您可以在 [[{{MediaWiki:Listgrouprights-helppage}}|詳細資訊]] 找到有關個別權限的資訊。",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">被吊銷的權限</span>",
+       "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">已撤銷的權限</span>",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:群組權限",
        "trackingcategories": "跟蹤分類",
        "trackingcategories-summary": "此頁面列出由 MediaWiki 系統自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
        "trackingcategories-msg": "跟蹤分類",
-       "trackingcategories-name": "è³\87è¨\8aå\90\8d",
+       "trackingcategories-name": "è¨\8aæ\81¯å\90\8d稱",
        "trackingcategories-desc": "分類收錄準則",
        "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "dellogpage": "刪除紀錄",
        "dellogpagetext": "以下是最近的刪除的列表。",
        "deletionlog": "刪除紀錄",
-       "reverted": "恢復到早期版本",
+       "reverted": "還原到較早的版本",
        "deletecomment": "理由:",
        "deleteotherreason": "其它/附加的理由:",
        "deletereasonotherlist": "其它理由",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "回退多過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
-       "cantrollback": "無法恢復編輯;最後的貢獻者是本篇的唯一作者。",
+       "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
        "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要: \"''$1''\"。",
        "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
        "protect-otherreason-op": "其它理由",
        "protect-dropdown": "*通用保護理由\n** 過量的破壞\n** 過量的灌水\n** 反生產性編輯戰\n** 高流量頁面",
        "protect-edit-reasonlist": "編輯保護理由",
-       "protect-expiry-options": "1小時:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,不限期:infinite",
-       "restriction-type": "權限:",
-       "restriction-level": "限制級別:",
-       "minimum-size": "最小大小",
-       "maximum-size": "最大大小:",
+       "protect-expiry-options": "1 小時:1 hour,1 天:1 day,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,不限期:infinite",
+       "restriction-type": "權限",
+       "restriction-level": "限制級別",
+       "minimum-size": "大小下限",
+       "maximum-size": "大小上限:",
        "pagesize": "(位元組)",
        "restriction-edit": "編輯",
        "restriction-move": "移動",
        "isredirect": "重新導向頁面",
        "istemplate": "包含",
        "isimage": "檔案連結",
-       "whatlinkshere-prev": "前$1個",
-       "whatlinkshere-next": "後$1個",
+       "whatlinkshere-prev": "前 $1 筆",
+       "whatlinkshere-next": "後 $1 筆",
        "whatlinkshere-links": "← 連入",
-       "whatlinkshere-hideredirs": "重新導向 $1 次",
+       "whatlinkshere-hideredirs": "$1 重新導向頁面",
        "whatlinkshere-hidetrans": "$1嵌入",
        "whatlinkshere-hidelinks": "$1連結",
        "whatlinkshere-hideimages": "$1檔案連結",
        "blockip": "封鎖使用者",
        "blockip-legend": "封鎖使用者",
        "blockiptext": "填寫以下單據可封鎖特定 IP 位置或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
-       "ipadressorusername": "IP 位址或使用者名稱:",
+       "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
        "blocklist-tempblocks": "隱藏暫時封鎖",
        "blocklist-addressblocks": "隱藏單一 IP 封鎖",
        "blocklist-rangeblocks": "隱藏 IP 範圍封鎖",
-       "blocklist-timestamp": "時間",
+       "blocklist-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "blocklist-target": "目標",
        "blocklist-expiry": "期限",
        "blocklist-by": "封鎖的管理員",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "contribslink": "貢獻",
-       "emaillink": "傳送電郵",
+       "emaillink": "發送電子郵件",
        "autoblocker": "您的 IP 位址因最近被 [[User:$1|$1]] 使用過而被自動封鎖。\n封鎖 $1 的原因為 \"$2\"",
        "blocklogpage": "查封日誌",
        "blocklog-showlog": "此使用者先前被封鎖過。\n以下為封鎖紀錄以供參考:",
        "lockedbyandtime": "在$2的$3由$1",
        "move-page": "移動$1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重的重新導向頁面]] 或 [[Special:BrokenRedirects|損壞的重新導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
        "movepagetext-noredirectfixer": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
        "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
        "moveuserpage-warning": "<strong>警告:</strong> 您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "movecategorypage-warning": "<strong>警告:</strong>您將要移動分類頁面。請注意此操作只頁面,舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenotallowed": "您並沒有許可權去移動頁面。",
        "movenotallowedfile": "您並沒有許可權去移動檔案。",
        "cant-move-user-page": "您沒有權限去移動使用者頁面 (除了它的子頁面)。",
        "cant-move-to-user-page": "您沒有權限去移動頁面至使用者頁面 (除了使用者子頁面)。",
+       "cant-move-category-page": "您沒有移動分類頁面的權限。",
+       "cant-move-to-category-page": "您沒有權限移動頁面去分類頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁",
        "movepagebtn": "移動頁面",
        "movesubpagetext": "這個頁面有$1個子頁面列示如下。",
        "movenosubpage": "這個頁面沒有子頁面。",
        "movereason": "原因",
-       "revertmove": "恢復該移動",
+       "revertmove": "還原",
        "delete_and_move": "刪除並移動",
        "delete_and_move_text": "==需要刪除==\n\n目標頁面\"[[:$1]]\"已經存在。{{GENDER:|你|妳|你}}確認需要刪除原頁面並以進行移動嗎?",
        "delete_and_move_confirm": "是的,刪除此頁面",
        "allmessages-filter-legend": "搜尋",
        "allmessages-filter": "以自定狀況過濾:",
        "allmessages-filter-unmodified": "未修改",
-       "allmessages-filter-all": "所有",
+       "allmessages-filter-all": "全部",
        "allmessages-filter-modified": "曾修改",
-       "allmessages-prefix": "以å\89\8d綴é\81\8e濾:",
+       "allmessages-prefix": "以å­\97é¦\96æ\90\9cå°\8b:",
        "allmessages-language": "語言:",
        "allmessages-filter-submit": "往",
        "allmessages-filter-translate": "翻譯",
        "tooltip-recreate": "重建該頁面,無論是否被刪除。",
        "tooltip-upload": "開始上傳",
        "tooltip-rollback": "點選 \"還原\" 還原至上位貢獻者對此頁面的編輯",
-       "tooltip-undo": "「復原」可以在編輯模式上開啟編輯表格以便恢復。它容許在摘要中加入原因。",
+       "tooltip-undo": "\"還原\" 可還原此編輯並以預覽模式開啟編輯表單,讓您可在摘要中加入原因。",
        "tooltip-preferences-save": "儲存偏好設定",
        "tooltip-summary": "輸入一個簡短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "spamprotectiontext": "您欲儲存的文字內容已被垃圾過濾器封鎖,\n可能因您的內容包含了已封鎖的外部連結。",
        "spamprotectionmatch": "觸發了我們的垃圾過濾器的文本如下:$1",
        "spambot_username": "MediaWiki 廣告清除",
-       "spam_reverting": "恢復到不包含連結至$1的最近修訂版本",
+       "spam_reverting": "還原到未包含連結至 $1 的最新修訂",
        "spam_blanking": "所有包含連結至$1的修訂,清空",
        "spam_deleting": "所有包含連結至$1的修訂,刪除中",
        "simpleantispam-label": "反濫發電郵檢查。\n'''不要'''加入這個!",
        "filedelete-old-unregistered": "所指定的檔案修訂「$1」在資料庫中不存在。",
        "filedelete-current-unregistered": "所指定的檔案「$1」在資料庫中不存在。",
        "filedelete-archive-read-only": "存檔目錄「$1」在網頁伺服器中不可寫。",
-       "previousdiff": "←上一版本",
-       "nextdiff": "下一版本→",
-       "mediawarning": "'''警告''': 該檔案類型可能包含惡意代碼。\n執行它可能對您的系統帶來危險。",
-       "imagemaxsize": "å½±å\83\8f大å°\8fé\99\90å\88¶ï¼\9a<br />''ï¼\88ç\94¨å\9c¨æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢ä¸­ï¼\89''",
-       "thumbsize": "縮圖大小:",
-       "widthheightpage": "$1 × $2, $3頁",
-       "file-info": "檔案大小: $1, MIME 類型: $2",
-       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME類型:$4",
-       "file-info-size-pages": "$1 × $2像素,檔案大小: $3,檔案類型: $4, $5 {{PLURAL:$5|頁}}",
+       "previousdiff": "← 較舊編輯",
+       "nextdiff": "較新編輯 →",
+       "mediawarning": "<strong>警告</strong>:此檔案類型可能包含惡意代碼。\n若執行可能對您的系統造成損害。",
+       "imagemaxsize": "å\9c\96ç\89\87大å°\8fé\99\90å\88¶ï¼\9a<br /><em>(ç\94¨æ\96¼æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢)</em>",
+       "thumbsize": "縮圖大小:",
+       "widthheightpage": "$1 × $2,$3 頁",
+       "file-info": "檔案大小:$1,MIME 類型:$2",
+       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4",
+       "file-info-size-pages": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4,$5 {{PLURAL:$5|頁}}",
        "file-nohires": "無更高解像度可提供。",
        "svg-long-desc": "SVG 檔案,表面大小:$1 × $2 像素,檔案大小:$3",
        "svg-long-desc-animated": "SVG 動畫檔案,表面大小:$1 × $2 像素,檔案大小:$3",
-       "svg-long-error": "無效的SVG檔案:$1",
+       "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
-       "show-big-image-preview": "此預覽的大小:$1.",
+       "show-big-image-preview": "預覽大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
-       "file-info-gif-frames": "$1",
+       "file-info-gif-frames": "$1 畫格",
        "file-info-png-looped": "循環",
-       "file-info-png-repeat": "已播放$1次",
-       "file-info-png-frames": "$1",
-       "file-no-thumb-animation": "'''注意: 由於技術限制,不能播放此檔案縮圖的動畫。'''",
-       "file-no-thumb-animation-gif": "'''注意: 由於技術限制,不能播放此高解析度GIF圖像縮圖的動畫。'''",
-       "newimages": "æ\96°å»ºå\9c\96ç\89\87ç\95«å»\8a",
+       "file-info-png-repeat": "已播放 $1 次",
+       "file-info-png-frames": "$1 畫格",
+       "file-no-thumb-animation": "<strong>注意:由於技術限制,此檔案縮圖無動畫效果。</strong>",
+       "file-no-thumb-animation-gif": "<strong>注意:由於技術限制,此類型高解析度 GIF 圖片無動畫效果。</strong>",
+       "newimages": "æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫",
        "imagelisttext": "以下是按$2排列的'''$1'''個檔案列表。",
-       "newimages-summary": "這個特殊頁面中顯示最後已上傳的檔案。",
+       "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
-       "newimages-label": "檔案名稱(或它的一部份):",
-       "showhidebots": "(機器人$1)",
+       "newimages-label": "檔案名稱 (或部份):",
+       "newimages-showbots": "顯示機械人上載",
        "noimages": "無可檢視圖片。",
        "ilsubmit": "搜尋",
        "bydate": "按日期",
        "sp-newimages-showfrom": "從$1 $2開始顯示新檔案",
-       "seconds": "$1秒",
-       "minutes": "$1分鍾",
-       "hours": "$1小時",
-       "days": "$1天",
-       "weeks": "{{PLURAL:$1|$1}}",
-       "months": "{{PLURAL:$1|$1個月}}",
-       "years": "{{PLURAL:$1|$1年}}",
-       "ago": "$1前",
+       "seconds": "$1 秒",
+       "minutes": "$1 分鍾",
+       "hours": "$1 小時",
+       "days": "$1 天",
+       "weeks": "{{PLURAL:$1|$1 週}}",
+       "months": "{{PLURAL:$1|$1 個月}}",
+       "years": "{{PLURAL:$1|$1 年}}",
+       "ago": "$1 前",
        "just-now": "剛才",
-       "hours-ago": "$1小時前",
-       "minutes-ago": "$1分鐘前",
-       "seconds-ago": "$1秒前",
-       "monday-at": "於星期一$1",
-       "tuesday-at": "於星期二$1",
-       "wednesday-at": "於星期三$1",
-       "thursday-at": "於星期四$1",
-       "friday-at": "於星期五$1",
-       "saturday-at": "於星期六$1",
-       "sunday-at": "於星期日$1",
-       "yesterday-at": "昨天$1",
+       "hours-ago": "$1 小時前",
+       "minutes-ago": "$1 分鐘前",
+       "seconds-ago": "$1 秒前",
+       "monday-at": "於星期一 $1",
+       "tuesday-at": "於星期二 $1",
+       "wednesday-at": "於星期三 $1",
+       "thursday-at": "於星期四 $1",
+       "friday-at": "於星期五 $1",
+       "saturday-at": "於星期六 $1",
+       "sunday-at": "於星期日 $1",
+       "yesterday-at": "昨天 $1",
        "bad_image_list": "請按照下列格式編寫:\n\n只有(以 * 開頭)列出的項目會被考慮。\n每一行的第一個連結必須是損毀檔案的連結。\n然後同一行後方的連結會被視為例外,即是該檔案可以在哪些頁面內被顯示。",
        "variantname-zh-hans": "‪中文(简体)",
        "variantname-zh-hant": "‪繁體中文",
        "variantname-zh": "不轉換",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
-       "metadata": "元數據",
+       "metadata": "資料定義",
        "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
        "exif-serialnumber": "相機的序號",
        "exif-cameraownername": "相機持有人",
        "exif-label": "標籤",
-       "exif-datetimemetadata": "元數據最後修改日期",
+       "exif-datetimemetadata": "資料定義最後修改日期",
        "exif-nickname": "非正式圖片名",
        "exif-rating": "評分(最高5分)",
        "exif-rightscertificate": "權利管理證書",
        "comma-separator": "、",
        "colon-separator": ":",
        "word-separator": "",
-       "parentheses": "($1)",
+       "parentheses": " ($1)",
        "quotation-marks": "「$1」",
        "imgmultipageprev": "← 上一頁",
        "imgmultipagenext": "下一頁 →",
        "table_pager_first": "第一頁",
        "table_pager_last": "最末頁",
        "table_pager_limit": "每頁顯示 $1 筆記錄",
-       "table_pager_limit_label": "每頁項目數︰",
+       "table_pager_limit_label": "每頁數︰",
        "table_pager_limit_submit": "送出",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
        "watchlistedit-raw-done": "您的監視列表已經更新。",
        "watchlistedit-raw-added": "已經加入了$1個標題:",
        "watchlistedit-raw-removed": "已經移除了$1個標題:",
+       "watchlistedit-clear-title": "已清除監視列表",
+       "watchlistedit-clear-legend": "清除監視列表",
+       "watchlistedit-clear-explain": "所有標題將會從你的監視列表中刪除",
+       "watchlistedit-clear-titles": "標題:",
+       "watchlistedit-clear-submit": "清除監視列表(這是永久!)",
+       "watchlistedit-clear-done": "您的監視列表已經清除。",
+       "watchlistedit-clear-removed": "已經移除了$1個標題:",
+       "watchlistedit-too-many": "有太多的頁面要在此處顯示。",
+       "watchlisttools-clear": "清除監視列表",
        "watchlisttools-view": "檢視相關更改",
        "watchlisttools-edit": "檢視並編輯監視列表",
        "watchlisttools-raw": "編輯原始監視列表",
        "unknown_extension_tag": "不明的擴展標籤「$1」",
        "duplicate-defaultsort": "警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。",
        "version": "版本",
-       "version-extensions": "已經安裝的擴展",
+       "version-extensions": "已安裝的擴充套件",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "èª\9eæ³\95é\88\8e",
+       "version-parserhooks": "èª\9eæ³\95é\80£çµ\90(Hook)",
        "version-variables": "變數",
-       "version-antispam": "垃圾防止",
+       "version-antispam": "垃圾訊息防止",
        "version-skins": "外觀",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
-       "version-hooks": "é\88\8e",
-       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å±\95標籤",
-       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\88\8e",
-       "version-hook-name": "é\88\8eå\90\8d",
-       "version-hook-subscribedby": "利用於",
+       "version-hooks": "é\80£çµ\90(Hooks)",
+       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å\85\85標籤",
+       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\80£çµ\90",
+       "version-hook-name": "é\80£çµ\90å\90\8d稱",
+       "version-hook-subscribedby": "署名",
        "version-version": "(版本 $1)",
-       "version-license": "MediaWiki許可證",
-       "version-ext-license": "授權",
-       "version-ext-colheader-name": "æ\93´å±\95",
+       "version-license": "MediaWiki 授權條款",
+       "version-ext-license": "授權條款",
+       "version-ext-colheader-name": "æ\93´å\85\85å¥\97件",
        "version-ext-colheader-version": "版本",
-       "version-ext-colheader-license": "許可證",
+       "version-ext-colheader-license": "授權條款",
        "version-ext-colheader-description": "說明",
        "version-ext-colheader-credits": "作者",
-       "version-license-title": "用於$1之許可證",
-       "version-license-not-found": "並無與此拓展相關之許可證資訊。",
-       "version-credits-title": "用於$1之信用",
-       "version-credits-not-found": "並無與此拓展相關之信用資訊。",
-       "version-poweredby-credits": "此維基由'''[https://www.mediawiki.org/ MediaWiki]'''驅動,版權所有 © 2001-$1 $2。",
+       "version-license-title": "$1 的授權條款",
+       "version-license-not-found": "查無此擴充套件的詳細授權條款資訊。",
+       "version-credits-title": "$1 的製作群",
+       "version-credits-not-found": "查無此擴充套件的詳細製作群資訊。",
+       "version-poweredby-credits": "此 Wiki 由 <strong>[https://www.mediawiki.org/ MediaWiki]</strong> 開發,版權所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
-       "version-poweredby-translators": "translatewiki.net 上的翻譯者",
-       "version-credits-summary": "我們感謝以下人士為[[Special:Version|MediaWiki]]作出的貢獻。",
-       "version-license-info": "MediaWiki為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程式再為發佈與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。\n\nMediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任;亦無對適售性或特定目的適用性所為的默示性擔保。詳情請參照GNU通用公共授權。\n\n您應已收到附隨於本程式的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授權的副本];如果沒有,請寫信至自由軟件基金會:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
-       "version-software": "已經安裝的軟",
+       "version-poweredby-translators": " translatewiki.net 翻譯人員",
+       "version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
+       "version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
+       "version-software": "已經安裝的軟",
        "version-software-product": "產品",
        "version-software-version": "版本",
-       "version-entrypoints": "入口URL",
-       "version-entrypoints-header-entrypoint": "入口",
+       "version-entrypoints": "入口 URL",
+       "version-entrypoints-header-entrypoint": "入口",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
        "redirect": "依檔案、使用者、頁面或修訂 ID 重新導向",
        "redirect-lookup": "尋找:",
        "redirect-value": "值:",
        "redirect-user": "使用者 ID",
-       "redirect-page": "頁面ID",
-       "redirect-revision": "頁面修訂ID",
+       "redirect-page": "頁面 ID",
+       "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "找不到",
-       "fileduplicatesearch": "選擇重覆檔案",
-       "fileduplicatesearch-summary": "用重覆檔案的切細值去找出檔案是否重覆。",
-       "fileduplicatesearch-legend": "æ\89¾重覆",
+       "fileduplicatesearch": "搜尋重覆檔案",
+       "fileduplicatesearch-summary": "依據雜湊值(Hash)來搜尋重複的檔案。",
+       "fileduplicatesearch-legend": "æ\90\9cå°\8b重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "檔案「$1」無完全相同的重覆。",
-       "fileduplicatesearch-result-n": "檔案「$1」有$2項完全相同的重覆。",
-       "fileduplicatesearch-noresults": "æ²\92æ\9c\89ç\99¼ç\8f¾å\90\8dç\82ºã\80\8c$1ã\80\8dç\9a\84æ\96\87件。",
+       "fileduplicatesearch-result-1": "檔案 $1 無重覆的檔案。",
+       "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
+       "fileduplicatesearch-noresults": "æ\9f¥ç\84¡å\90\8d稱ç\82º \"$1\" ç\9a\84æª\94æ¡\88。",
        "specialpages": "特殊頁面",
-       "specialpages-note-top": "圖例",
-       "specialpages-note": "* 標準特殊頁面。\n* <span class=\"mw-specialpagerestricted\">用於重新整理的特殊頁面(可能過時)。</span>",
-       "specialpages-group-maintenance": "維護報",
+       "specialpages-note-top": "說明",
+       "specialpages-note": "* 一般特殊頁面。\n* <span class=\"mw-specialpagerestricted\">受限制的特殊頁面。</span>",
+       "specialpages-group-maintenance": "維護報",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入/建立新帳號",
        "specialpages-group-changes": "最近變更與日誌",
-       "specialpages-group-media": "媒體報告和上傳",
+       "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "specialpages-group-pages": "頁面清單",
        "specialpages-group-pagetools": "頁面工具",
        "specialpages-group-wiki": "資料和工具",
-       "specialpages-group-redirects": "重新導向特殊頁面",
-       "specialpages-group-spam": "反垃圾工具",
+       "specialpages-group-redirects": "重新導向相關特殊頁面",
+       "specialpages-group-spam": "反垃圾訊息工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "這個頁面是為空白",
+       "intentionallyblankpage": "此頁面被故意設為空白。",
        "external_image_whitelist": " #留下這行一樣的文字<pre>\n#在下面(//之中間部份)輸入正規表達式\n#這些將會跟外部(已超連結的)圖片配合\n#那些配合到出來的會顯示成圖片,否則就只會顯示成連結\n#有 # 開頭的行會當成註解\n#大小寫並無區分\n\n#在這行上面輸入所有的regex。留下這行一樣的文字</pre>",
-       "tags": "有效標籤",
-       "tag-filter": "[[Special:Tags|標籤]]過濾器:",
+       "tags": "有效變更標籤",
+       "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "tag-filter-submit": "搜尋",
        "tag-list-wrapper": "([[Special:Tags|標籤]]:$2)",
        "tags-title": "標籤",
        "tags-intro": "這個頁面列示出在軟件中已標示的編輯,以及它們的解釋。",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在更改清單中的出現方式",
-       "tags-description-header": "解釋完整描述",
+       "tags-description-header": "完整含意說明",
        "tags-active-header": "存檔?",
        "tags-hitcount-header": "已加上標籤的更改",
        "tags-active-yes": "是",
        "tags-active-no": "否",
        "tags-edit": "編輯",
-       "tags-hitcount": "$1次更改",
+       "tags-hitcount": "$1 次變更",
        "comparepages": "比較頁面",
-       "compare-page1": "第1頁",
-       "compare-page2": "第2頁",
-       "compare-rev1": "修訂版本1",
-       "compare-rev2": "修訂版本2",
+       "compare-page1": "第 1 頁",
+       "compare-page2": "第 2 頁",
+       "compare-rev1": "修訂 1",
+       "compare-rev2": "修訂 2",
        "compare-submit": "比較",
        "compare-invalid-title": "所指定標題無效。",
        "compare-title-not-exists": "所指定的話題不存在。",
        "htmlform-int-toohigh": "您所指定的值高於最大值$1",
        "htmlform-required": "此值是必填項",
        "htmlform-submit": "提交",
-       "htmlform-reset": "撤銷更改",
+       "htmlform-reset": "還原更改",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "htmlform-yes": "是",
        "api-error-unknownerror": "未知錯誤:$1。",
        "api-error-uploaddisabled": "本wiki的上傳檔案功能已停用。",
        "api-error-verification-error": "本檔案可能已損壞,或副檔名錯誤。",
-       "duration-seconds": "$1秒",
-       "duration-minutes": "$1",
-       "duration-hours": "$1小時",
-       "duration-days": "$1天",
-       "duration-weeks": "$1週",
-       "duration-years": "$1年",
-       "duration-decades": "$1十年",
-       "duration-centuries": "$1世紀",
-       "duration-millennia": "$1千年",
+       "duration-seconds": "$1 秒",
+       "duration-minutes": "$1 分鐘",
+       "duration-hours": "$1 小時",
+       "duration-days": "$1 天",
+       "duration-weeks": "$1 週",
+       "duration-years": "$1 年",
+       "duration-decades": "$1{{PLURAL:$1|0 年|0 年}}",
+       "duration-centuries": "$1 世紀",
+       "duration-millennia": "$1 千年",
        "rotate-comment": "順時針旋轉圖像$1{{PLURAL:$1|度}}",
        "limitreport-title": "分析器分析資料:",
-       "limitreport-cputime": "CPU使用時間",
-       "limitreport-cputime-value": "$1秒",
+       "limitreport-cputime": "CPU 使用時間",
+       "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
-       "limitreport-walltime-value": "$1秒",
-       "limitreport-ppvisitednodes": "預處理器訪問節點數",
-       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94\9fæ\88\90ç¯\80é»\9eè¨\88數",
-       "limitreport-postexpandincludesize": "展開後大小",
+       "limitreport-walltime-value": "$1 秒",
+       "limitreport-ppvisitednodes": "預處理器訪問節點數",
+       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94¢ç\94\9fç¯\80é»\9e次數",
+       "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-templateargumentsize": "樣版參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
-       "limitreport-expensivefunctioncount": "高開銷分析函數數位",
+       "limitreport-expensivefunctioncount": "高分析函數次數",
        "expandtemplates": "展開樣版",
        "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的分析程式語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果:",
-       "expand_templates_xml_output": "XML輸出",
-       "expand_templates_html_output": "原始HTML輸出",
+       "expand_templates_xml_output": "XML 輸出",
+       "expand_templates_html_output": "原始 HTML 輸出",
        "expand_templates_ok": "確定",
        "expand_templates_remove_comments": "移除評論",
        "expand_templates_remove_nowiki": "在結果中禁止顯示 <nowiki> 標籤",
-       "expand_templates_generate_xml": "顯示XML語法樹",
-       "expand_templates_generate_rawhtml": "顯示原始HTML",
+       "expand_templates_generate_xml": "顯示 XML 解析樹",
+       "expand_templates_generate_rawhtml": "顯示原始 HTML",
        "expand_templates_preview": "預覽"
 }
index 479030f..e316d9e 100644 (file)
@@ -731,7 +731,7 @@ abstract class Maintenance {
                        return;
                }
 
-               $screenWidth = 80; // TODO: Caculate this!
+               $screenWidth = 80; // TODO: Calculate this!
                $tab = "    ";
                $descWidth = $screenWidth - ( 2 * strlen( $tab ) );
 
index 7fe3bd9..83e731a 100644 (file)
@@ -36,17 +36,76 @@ class GenerateJsonI18n extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Build JSON messages files from a PHP messages file";
-               $this->addArg( 'phpfile', 'PHP file defining a $messages array', true );
-               $this->addArg( 'jsondir', 'Directory to write JSON files to. ' .
-                       'Required unless <phpfile> exists and --shim-only is specified', false );
+
+               $this->addArg( 'phpfile', 'PHP file defining a $messages array', false );
+               $this->addArg( 'jsondir', 'Directory to write JSON files to', false );
                $this->addOption( 'langcode', 'Language code; only needed for converting core i18n files',
                        false, true );
+               $this->addOption( 'extension', 'Perform default conversion on an extension',
+                       false, true );
                $this->addOption( 'shim-only', 'Only create or update the backward-compatibility shim' );
+               $this->addOption( 'supplementary', 'Find supplementary i18n files in subdirs and convert those',
+                       false, false );
        }
 
        public function execute() {
+               global $IP;
+
                $phpfile = $this->getArg( 0 );
                $jsondir = $this->getArg( 1 );
+               $extension = $this->getOption( 'extension' );
+               $convertSupplementaryI18nFiles = $this->hasOption( 'supplementary' );
+
+               if ( $extension ) {
+                       if ( $phpfile ) {
+                               $this->error( "The phpfile is already specified, conflicts with --extension.\n", 1 );
+                       }
+                       $phpfile = "$IP/extensions/$extension/$extension.i18n.php";
+               }
+
+               if ( !$phpfile ) {
+                       $this->error( "I'm here for an argument!\n" );
+                       $this->maybeHelp( true );
+                       // dies.
+               }
+
+               if ( $convertSupplementaryI18nFiles ) {
+                       if ( is_readable( $phpfile ) ) {
+                               $this->transformI18nFile( $phpfile, $jsondir );
+                       } else {
+                               // This is non-fatal because we might want to continue searching for
+                               // i18n files in subdirs even if the extension does not include a
+                               // primary i18n.php.
+                               $this->error( "Warning: no primary i18n file was found." );
+                       }
+                       $this->output( "Searching for supplementary i18n files...\n" );
+                       $dir_iterator = new RecursiveDirectoryIterator( dirname( $phpfile ) );
+                       $iterator = new RecursiveIteratorIterator( $dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY );
+                       foreach ( $iterator as $path => $fileObject ) {
+                               if ( fnmatch( "*.i18n.php", $fileObject->getFilename() ) ) {
+                                       $this->output( "Converting $path.\n" );
+                                       $this->transformI18nFile( $path );
+                               }
+                       }
+               } else {
+                       // Just convert the primary i18n file.
+                       $this->transformI18nFile( $phpfile, $jsondir );
+               }
+       }
+
+       public function transformI18nFile( $phpfile, $jsondir = null ) {
+               if ( !$jsondir ) {
+                       // Assume the json directory should be in the same directory as the
+                       // .i18n.php file.
+                       $jsondir = dirname( $phpfile ) . "/i18n";
+               }
+               if ( !is_dir( $jsondir ) ) {
+                       $this->output( "Creating directory $jsondir.\n" );
+                       $success = mkdir( $jsondir );
+                       if ( !$success ) {
+                               $this->error( "Could not create directory $jsondir\n", 1 );
+                       }
+               }
 
                if ( $this->hasOption( 'shim-only' ) ) {
                        $this->shimOnly( $phpfile, $jsondir );
index 20d6ad5..5a3e00c 100644 (file)
@@ -29,11 +29,14 @@ if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
+require_once dirname( __DIR__ ) . '/maintenance/Maintenance.php';
 
 /**
  * Maintenance script to install and configure MediaWiki
  *
+ * Default values for the options are defined in DefaultSettings.php (see the mapping in CliInstaller.php)
+ * Default for --dbpath (SQLite-specific) is defined in SqliteInstaller::getGlobalDefaults
+ *
  * @ingroup Maintenance
  */
 class CommandLineInstaller extends Maintenance {
@@ -41,9 +44,12 @@ class CommandLineInstaller extends Maintenance {
                parent::__construct();
                global $IP;
 
-               $this->addArg( 'name', 'The name of the wiki', true );
+               $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
+                       "Defaut options are indicated in parenthesis." );
+
+               $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
-               $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
+               $this->addArg( 'admin', 'The username of the wiki administrator.' );
                $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
                $this->addOption(
                        'passfile',
@@ -66,22 +72,22 @@ class CommandLineInstaller extends Maintenance {
                $this->addOption( 'dbserver', 'The database host (localhost)', false, true );
                $this->addOption( 'dbport', 'The database port; only for PostgreSQL (5432)', false, true );
                $this->addOption( 'dbname', 'The database name (my_wiki)', false, true );
-               $this->addOption( 'dbpath', 'The path for the SQLite DB (/var/data)', false, true );
+               $this->addOption( 'dbpath', 'The path for the SQLite DB ($IP/data)', false, true );
                $this->addOption( 'dbprefix', 'Optional database table name prefix', false, true );
                $this->addOption( 'installdbuser', 'The user to use for installing (root)', false, true );
-               $this->addOption( 'installdbpass', 'The pasword for the DB user to install as.', false, true );
+               $this->addOption( 'installdbpass', 'The password for the DB user to install as.', false, true );
                $this->addOption( 'dbuser', 'The user to use for normal operations (wikiuser)', false, true );
-               $this->addOption( 'dbpass', 'The pasword for the DB user for normal operations', false, true );
+               $this->addOption( 'dbpass', 'The password for the DB user for normal operations', false, true );
                $this->addOption(
                        'dbpassfile',
                        'An alternative way to provide dbpass option, as the contents of this file',
                        false,
                        true
                );
-               $this->addOption( 'confpath', "Path to write LocalSettings.php to, default $IP", false, true );
+               $this->addOption( 'confpath', "Path to write LocalSettings.php to ($IP)", false, true );
                /*
                $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true );
-               $this->addOption( 'namespace', 'The project namespace (same as the name)', false, true );
+               $this->addOption( 'namespace', 'The project namespace (same as the "name" argument)', false, true );
                */
                $this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
        }
@@ -89,18 +95,17 @@ class CommandLineInstaller extends Maintenance {
        function execute() {
                global $IP;
 
-               // Will not be set if used with --env-checks
-               $siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care";
-               $adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
+               $siteName = $this->getArg( 0, 'MediaWiki' ); // Will not be set if used with --env-checks
+               $adminName = $this->getArg( 1 );
 
-               $dbpassfile = $this->getOption( 'dbpassfile', false );
-               if ( $dbpassfile !== false ) {
-                       if ( $this->getOption( 'dbpass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "dbpass" and "dbpassfile". '
-                                       . 'The content of "dbpassfile" overwrites "dbpass".' );
+               $dbpassfile = $this->getOption( 'dbpassfile' );
+               if ( $dbpassfile !== null ) {
+                       if ( $this->getOption( 'dbpass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "dbpass" and "dbpassfile". '
+                                       . 'The content of "dbpassfile" overrides "dbpass".' );
                        }
                        wfSuppressWarnings();
-                       $dbpass = file_get_contents( $dbpassfile );
+                       $dbpass = file_get_contents( $dbpassfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $dbpass === false ) {
                                $this->error( "Couldn't open $dbpassfile", true );
@@ -108,25 +113,24 @@ class CommandLineInstaller extends Maintenance {
                        $this->mOptions['dbpass'] = trim( $dbpass, "\r\n" );
                }
 
-               $passfile = $this->getOption( 'passfile', false );
-               if ( $passfile !== false ) {
-                       if ( $this->getOption( 'pass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "pass" and "passfile". '
-                                       . 'The content of "passfile" overwrites "pass".' );
+               $passfile = $this->getOption( 'passfile' );
+               if ( $passfile !== null ) {
+                       if ( $this->getOption( 'pass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "pass" and "passfile". '
+                                       . 'The content of "passfile" overrides "pass".' );
                        }
                        wfSuppressWarnings();
-                       $pass = file_get_contents( $passfile );
+                       $pass = file_get_contents( $passfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $pass === false ) {
                                $this->error( "Couldn't open $passfile", true );
                        }
-                       $this->mOptions['pass'] = str_replace( array( "\n", "\r" ), "", $pass );
-               } elseif ( $this->getOption( 'pass', false ) === false ) {
+                       $this->mOptions['pass'] = trim( $pass, "\r\n" );
+               } elseif ( $this->getOption( 'pass' ) === null ) {
                        $this->error( 'You need to provide the option "pass" or "passfile"', true );
                }
 
-               $installer =
-                       InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
+               $installer = InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
                $status = $installer->doEnvironmentChecks();
                if ( $status->isGood() ) {
@@ -149,6 +153,6 @@ class CommandLineInstaller extends Maintenance {
        }
 }
 
-$maintClass = "CommandLineInstaller";
+$maintClass = 'CommandLineInstaller';
 
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9f73c80..10a3745 100644 (file)
@@ -271,6 +271,7 @@ $wgIgnoredMessages = array(
        'helplogin-url',
        'autocomment-prefix',
        'move-redirect-text',
+       'category-move-redirect-override',
        'interlanguage-link-title-langonly',
        'createaccount-hook-abort',
 );
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
deleted file mode 100644 (file)
index 62d1fa6..0000000
+++ /dev/null
@@ -1,4301 +0,0 @@
-<?php
-/**
- * Define the messages structure in the messages file, for an automated rewriting.
- *
- * 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
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/** The structure of the messages, divided to blocks */
-$wgMessageStructure = array(
-       'sidebar' => array(
-               'sidebar',
-       ),
-       'toggles' => array(
-               'tog-underline',
-               'tog-hideminor',
-               'tog-hidepatrolled',
-               'tog-newpageshidepatrolled',
-               'tog-extendwatchlist',
-               'tog-usenewrc',
-               'tog-numberheadings',
-               'tog-showtoolbar',
-               'tog-editondblclick',
-               'tog-editsectiononrightclick',
-               'tog-watchcreations',
-               'tog-watchdefault',
-               'tog-watchmoves',
-               'tog-watchdeletion',
-               'tog-minordefault',
-               'tog-previewontop',
-               'tog-previewonfirst',
-               'tog-enotifwatchlistpages',
-               'tog-enotifusertalkpages',
-               'tog-enotifminoredits',
-               'tog-enotifrevealaddr',
-               'tog-shownumberswatching',
-               'tog-oldsig',
-               'tog-fancysig',
-               'tog-uselivepreview',
-               'tog-forceeditsummary',
-               'tog-watchlisthideown',
-               'tog-watchlisthidebots',
-               'tog-watchlisthideminor',
-               'tog-watchlisthideliu',
-               'tog-watchlisthideanons',
-               'tog-watchlisthidepatrolled',
-               'tog-ccmeonemails',
-               'tog-diffonly',
-               'tog-showhiddencats',
-               'tog-norollbackdiff',
-               'tog-useeditwarning',
-               'tog-prefershttps'
-       ),
-       'underline' => array(
-               'underline-always',
-               'underline-never',
-               'underline-default',
-       ),
-       'editfont' => array(
-               'editfont-style',
-               'editfont-default',
-               'editfont-monospace',
-               'editfont-sansserif',
-               'editfont-serif',
-       ),
-       'dates' => array(
-               'sunday',
-               'monday',
-               'tuesday',
-               'wednesday',
-               'thursday',
-               'friday',
-               'saturday',
-               'sun',
-               'mon',
-               'tue',
-               'wed',
-               'thu',
-               'fri',
-               'sat',
-               'january',
-               'february',
-               'march',
-               'april',
-               'may_long',
-               'june',
-               'july',
-               'august',
-               'september',
-               'october',
-               'november',
-               'december',
-               'january-gen',
-               'february-gen',
-               'march-gen',
-               'april-gen',
-               'may-gen',
-               'june-gen',
-               'july-gen',
-               'august-gen',
-               'september-gen',
-               'october-gen',
-               'november-gen',
-               'december-gen',
-               'jan',
-               'feb',
-               'mar',
-               'apr',
-               'may',
-               'jun',
-               'jul',
-               'aug',
-               'sep',
-               'oct',
-               'nov',
-               'dec',
-               'january-date',
-               'february-date',
-               'march-date',
-               'april-date',
-               'may-date',
-               'june-date',
-               'july-date',
-               'august-date',
-               'september-date',
-               'october-date',
-               'november-date',
-               'december-date',
-       ),
-       'categorypages' => array(
-               'pagecategories',
-               'pagecategorieslink',
-               'category_header',
-               'subcategories',
-               'category-media-header',
-               'category-empty',
-               'hidden-categories',
-               'hidden-category-category',
-               'category-subcat-count',
-               'category-subcat-count-limited',
-               'category-article-count',
-               'category-article-count-limited',
-               'category-file-count',
-               'category-file-count-limited',
-               'listingcontinuesabbrev',
-               'index-category',
-               'noindex-category',
-               'broken-file-category',
-               'categoryviewer-pagedlinks',
-       ),
-       'miscellaneous1' => array(
-               'about',
-               'article',
-               'newwindow',
-               'cancel',
-               'moredotdotdot',
-               'morenotlisted',
-               'mypage',
-               'mytalk',
-               'anontalk',
-               'navigation',
-               'and',
-       ),
-       'cologneblue' => array(
-               'qbfind',
-               'qbbrowse',
-               'qbedit',
-               'qbpageoptions',
-               'qbmyoptions',
-               'faq',
-               'faqpage',
-               'sitetitle',
-               'sitesubtitle',
-       ),
-       'vector' => array(
-               'vector-action-addsection',
-               'vector-action-delete',
-               'vector-action-move',
-               'vector-action-protect',
-               'vector-action-undelete',
-               'vector-action-unprotect',
-               'vector-view-create',
-               'vector-view-edit',
-               'vector-view-history',
-               'vector-view-view',
-               'vector-view-viewsource',
-               'actions',
-               'namespaces',
-               'variants',
-       ),
-       'miscellaneous2' => array(
-               'navigation-heading',
-               'errorpagetitle',
-               'returnto',
-               'tagline',
-               'help',
-               'search',
-               'searchbutton',
-               'go',
-               'searcharticle',
-               'history',
-               'history_short',
-               'updatedmarker',
-               'printableversion',
-               'permalink',
-               'print',
-               'view',
-               'edit',
-               'create',
-               'editthispage',
-               'create-this-page',
-               'delete',
-               'deletethispage',
-               'undeletethispage',
-               'undelete_short',
-               'viewdeleted_short',
-               'protect',
-               'protect_change',
-               'protectthispage',
-               'unprotect',
-               'unprotectthispage',
-               'newpage',
-               'talkpage',
-               'talkpagelinktext',
-               'specialpage',
-               'personaltools',
-               'postcomment',
-               'addsection',
-               'articlepage',
-               'talk',
-               'views',
-               'toolbox',
-               'userpage',
-               'projectpage',
-               'imagepage',
-               'mediawikipage',
-               'templatepage',
-               'viewhelppage',
-               'categorypage',
-               'viewtalkpage',
-               'otherlanguages',
-               'redirectedfrom',
-               'redirectpagesub',
-               'talkpageheader',
-               'lastmodifiedat',
-               'viewcount',
-               'protectedpage',
-               'jumpto',
-               'jumptonavigation',
-               'jumptosearch',
-               'view-pool-error',
-               'generic-pool-error',
-               'pool-timeout',
-               'pool-queuefull',
-               'pool-errorunknown',
-               'pool-servererror',
-       ),
-       'links' => array(
-               'aboutsite',
-               'aboutpage',
-               'copyright',
-               'copyrightpage',
-               'currentevents',
-               'currentevents-url',
-               'disclaimers',
-               'disclaimerpage',
-               'edithelp',
-               'edithelppage',
-               'helppage',
-               'mainpage',
-               'mainpage-description',
-               'policy-url',
-               'portal',
-               'portal-url',
-               'privacy',
-               'privacypage',
-       ),
-       'badaccess' => array(
-               'badaccess',
-               'badaccess-group0',
-               'badaccess-groups',
-       ),
-       'versionrequired' => array(
-               'versionrequired',
-               'versionrequiredtext',
-       ),
-       'miscellaneous3' => array(
-               'ok',
-               'pagetitle',
-               'pagetitle-view-mainpage',
-               'backlinksubtitle',
-               'retrievedfrom',
-               'youhavenewmessages',
-               'youhavenewmessagesfromusers',
-               'youhavenewmessagesmanyusers',
-               'newmessageslinkplural',
-               'newmessagesdifflinkplural',
-               'youhavenewmessagesmulti',
-               'newtalkseparator',
-               'editsection',
-               'editold',
-               'viewsourceold',
-               'editlink',
-               'viewsourcelink',
-               'editsectionhint',
-               'toc',
-               'showtoc',
-               'hidetoc',
-               'collapsible-collapse',
-               'collapsible-expand',
-               'thisisdeleted',
-               'viewdeleted',
-               'restorelink',
-               'feedlinks',
-               'feed-invalid',
-               'feed-unavailable',
-               'site-rss-feed',
-               'site-atom-feed',
-               'page-rss-feed',
-               'page-atom-feed',
-               'feed-atom',
-               'feed-rss',
-               'sitenotice',
-               'anonnotice',
-               'newsectionheaderdefaultlevel',
-               'red-link-title',
-               'sort-descending',
-               'sort-ascending',
-
-       ),
-       'nstab' => array(
-               'nstab-main',
-               'nstab-user',
-               'nstab-media',
-               'nstab-special',
-               'nstab-project',
-               'nstab-image',
-               'nstab-mediawiki',
-               'nstab-template',
-               'nstab-help',
-               'nstab-category',
-               'mainpage-nstab',
-       ),
-       'main' => array(
-               'nosuchaction',
-               'nosuchactiontext',
-               'nosuchspecialpage',
-               'nospecialpagetext',
-       ),
-       'errors' => array(
-               'error',
-               'databaseerror',
-               'databaseerror-text',
-               'databaseerror-textcl',
-               'databaseerror-query',
-               'databaseerror-function',
-               'databaseerror-error',
-               'laggedslavemode',
-               'readonly',
-               'enterlockreason',
-               'readonlytext',
-               'missing-article', // not used anymore in core, but kept for extensions
-               'missingarticle-rev', // not used anymore in core, but kept for extensions
-               'missingarticle-diff', // not used anymore in core, but kept for extensions
-               'readonly_lag',
-               'internalerror',
-               'internalerror_info',
-               'fileappenderrorread',
-               'fileappenderror',
-               'filecopyerror',
-               'filerenameerror',
-               'filedeleteerror',
-               'directorycreateerror',
-               'filenotfound',
-               'fileexistserror',
-               'unexpected',
-               'formerror',
-               'badarticleerror',
-               'cannotdelete',
-               'cannotdelete-title',
-               'delete-hook-aborted',
-               'no-null-revision',
-               'badtitle',
-               'badtitletext',
-               'perfcached',
-               'perfcachedts',
-               'querypage-no-updates',
-               'viewsource',
-               'viewsource-title',
-               'actionthrottled',
-               'actionthrottledtext',
-               'protectedpagetext',
-               'viewsourcetext',
-               'viewyourtext',
-               'protectedinterface',
-               'editinginterface',
-               'cascadeprotected',
-               'namespaceprotected',
-               'customcssprotected',
-               'customjsprotected',
-               'mycustomcssprotected',
-               'mycustomjsprotected',
-               'myprivateinfoprotected',
-               'mypreferencesprotected',
-               'ns-specialprotected',
-               'titleprotected',
-               'filereadonlyerror',
-               'invalidtitle-knownnamespace',
-               'invalidtitle-unknownnamespace',
-               'exception-nologin',
-               'exception-nologin-text',
-               'exception-nologin-text-manual',
-       ),
-       'virus' => array(
-               'virus-badscanner',
-               'virus-scanfailed',
-               'virus-unknownscanner',
-       ),
-       'login' => array(
-               'logouttext',
-               'welcomeuser',
-               'welcomecreation-msg',
-               'yourname',
-               'userlogin-yourname',
-               'userlogin-yourname-ph',
-               'createacct-another-username-ph',
-               'createacct-helpusername',
-               'yourpassword',
-               'userlogin-yourpassword',
-               'userlogin-yourpassword-ph',
-               'createacct-yourpassword-ph',
-               'yourpasswordagain',
-               'createacct-yourpasswordagain',
-               'createacct-yourpasswordagain-ph',
-               'remembermypassword',
-               'userlogin-remembermypassword',
-               'userlogin-signwithsecure',
-               'yourdomainname',
-               'password-change-forbidden',
-               'externaldberror',
-               'login',
-               'nav-login-createaccount',
-               'loginprompt',
-               'userlogin',
-               'userloginnocreate',
-               'logout',
-               'userlogout',
-               'userlogout-summary',
-               'notloggedin',
-               'userlogin-noaccount',
-               'userlogin-joinproject',
-               'nologin',
-               'nologinlink',
-               'createaccount',
-               'gotaccount',
-               'gotaccountlink',
-               'userlogin-resetlink',
-               'userlogin-resetpassword-link',
-               'helplogin-url',
-               'userlogin-helplink2',
-               'userlogin-loggedin',
-               'userlogin-createanother',
-               'createacct-join',
-               'createacct-another-join',
-               'createacct-emailrequired',
-               'createacct-emailoptional',
-               'createacct-email-ph',
-               'createacct-another-email-ph',
-               'createaccountmail',
-               'createacct-realname',
-               'createaccountreason',
-               'createacct-reason',
-               'createacct-reason-ph',
-               'createacct-captcha',
-               'createacct-imgcaptcha-help',
-               'createacct-imgcaptcha-ph',
-               'createacct-submit',
-               'createacct-another-submit',
-               'createacct-benefit-heading',
-               'createacct-benefit-icon1',
-               'createacct-benefit-head1',
-               'createacct-benefit-body1',
-               'createacct-benefit-icon2',
-               'createacct-benefit-head2',
-               'createacct-benefit-body2',
-               'createacct-benefit-icon3',
-               'createacct-benefit-head3',
-               'createacct-benefit-body3',
-               'badretype',
-               'userexists',
-               'loginerror',
-               'createacct-error',
-               'createaccounterror',
-               'nocookiesnew',
-               'nocookieslogin',
-               'nocookiesfornew',
-               'nocookiesforlogin',
-               'noname',
-               'loginsuccesstitle',
-               'loginsuccess',
-               'nosuchuser',
-               'nosuchusershort',
-               'nouserspecified',
-               'login-userblocked',
-               'wrongpassword',
-               'wrongpasswordempty',
-               'passwordtooshort',
-               'password-name-match',
-               'password-login-forbidden',
-               'mailmypassword',
-               'passwordremindertitle',
-               'passwordremindertext',
-               'noemail',
-               'noemailcreate',
-               'passwordsent',
-               'blocked-mailpassword',
-               'eauthentsent',
-               'throttled-mailpassword',
-               'loginstart',
-               'loginend',
-               'loginend-https',
-               'signupstart',
-               'signupend',
-               'signupend-https',
-               'mailerror',
-               'acct_creation_throttle_hit',
-               'emailauthenticated',
-               'emailnotauthenticated',
-               'noemailprefs',
-               'emailconfirmlink',
-               'invalidemailaddress',
-               'cannotchangeemail',
-               'emaildisabled',
-               'emailsender',
-               'accountcreated',
-               'accountcreatedtext',
-               'createaccount-title',
-               'createaccount-text',
-               'usernamehasherror',
-               'login-throttled',
-               'login-abort-generic',
-               'loginlanguagelabel',
-               'loginlanguagelinks',
-               'suspicious-userlogout',
-               'createacct-another-realname-tip',
-               'pt-login',
-               'pt-login-button',
-               'pt-createaccount',
-               'pt-userlogout',
-       ),
-       'mail' => array(
-               'pear-mail-error',
-               'php-mail-error',
-               'php-mail-error-unknown',
-               'user-mail-no-addy',
-               'user-mail-no-body',
-       ),
-       'resetpass' => array(
-               'changepassword',
-               'changepassword-summary',
-               'resetpass_announce',
-               'resetpass_text',
-               'resetpass_header',
-               'oldpassword',
-               'newpassword',
-               'retypenew',
-               'resetpass_submit',
-               'changepassword-success',
-               'changepassword-throttled',
-               'resetpass_forbidden',
-               'resetpass-no-info',
-               'resetpass-submit-loggedin',
-               'resetpass-submit-cancel',
-               'resetpass-wrong-oldpass',
-               'resetpass-recycled',
-               'resetpass-temp-emailed',
-               'resetpass-temp-password',
-               'resetpass-abort-generic',
-               'resetpass-expired',
-               'resetpass-expired-soft',
-               'resetpass-validity-soft',
-       ),
-       'passwordreset' => array(
-               'passwordreset',
-               'passwordreset-text-one',
-               'passwordreset-text-many',
-               'passwordreset-legend',
-               'passwordreset-disabled',
-               'passwordreset-emaildisabled',
-               'passwordreset-username',
-               'passwordreset-domain',
-               'passwordreset-capture',
-               'passwordreset-capture-help',
-               'passwordreset-email',
-               'passwordreset-emailtitle',
-               'passwordreset-emailtext-ip',
-               'passwordreset-emailtext-user',
-               'passwordreset-emailelement',
-               'passwordreset-emailsent',
-               'passwordreset-emailsent-capture',
-               'passwordreset-emailerror-capture',
-       ),
-       'changeemail' => array(
-               'changeemail',
-               'changeemail-summary',
-               'changeemail-header',
-               'changeemail-text',
-               'changeemail-no-info',
-               'changeemail-oldemail',
-               'changeemail-newemail',
-               'changeemail-none',
-               'changeemail-password',
-               'changeemail-submit',
-               'changeemail-cancel',
-               'changeemail-throttled'
-       ),
-       'resettokens' => array(
-               'resettokens',
-               'resettokens-summary',
-               'resettokens-text',
-               'resettokens-no-tokens',
-               'resettokens-legend',
-               'resettokens-tokens',
-               'resettokens-token-label',
-               'resettokens-watchlist-token',
-               'resettokens-done',
-               'resettokens-resetbutton',
-       ),
-       'toolbar' => array(
-               'bold_sample',
-               'bold_tip',
-               'italic_sample',
-               'italic_tip',
-               'link_sample',
-               'link_tip',
-               'extlink_sample',
-               'extlink_tip',
-               'headline_sample',
-               'headline_tip',
-               'nowiki_sample',
-               'nowiki_tip',
-               'image_sample',
-               'image_tip',
-               'media_sample',
-               'media_tip',
-               'sig_tip',
-               'hr_tip',
-       ),
-       'edit' => array(
-               'summary',
-               'subject',
-               'minoredit',
-               'watchthis',
-               'savearticle',
-               'preview',
-               'showpreview',
-               'showlivepreview',
-               'showdiff',
-               'anoneditwarning',
-               'anonpreviewwarning',
-               'missingsummary',
-               'missingcommenttext',
-               'missingcommentheader',
-               'summary-preview',
-               'subject-preview',
-               'blockedtitle',
-               'blockedtext',
-               'autoblockedtext',
-               'blockednoreason',
-               'whitelistedittext',
-               'confirmedittext',
-               'nosuchsectiontitle',
-               'nosuchsectiontext',
-               'loginreqtitle',
-               'loginreqlink',
-               'loginreqpagetext',
-               'accmailtitle',
-               'accmailtext',
-               'newarticle',
-               'newarticletext',
-               'newarticletextanon',
-               'talkpagetext',
-               'anontalkpagetext',
-               'noarticletext',
-               'noarticletext-nopermission',
-               'noarticletextanon',
-               'missing-revision',
-               'userpage-userdoesnotexist',
-               'userpage-userdoesnotexist-view',
-               'blocked-notice-logextract',
-               'clearyourcache',
-               'usercssyoucanpreview',
-               'userjsyoucanpreview',
-               'usercsspreview',
-               'userjspreview',
-               'sitecsspreview',
-               'sitejspreview',
-               'userinvalidcssjstitle',
-               'updated',
-               'note',
-               'previewnote',
-               'continue-editing',
-               'previewconflict',
-               'session_fail_preview',
-               'session_fail_preview_html',
-               'token_suffix_mismatch',
-               'edit_form_incomplete',
-               'editing',
-               'creating',
-               'editingsection',
-               'editingcomment',
-               'editconflict',
-               'explainconflict',
-               'yourtext',
-               'storedversion',
-               'nonunicodebrowser',
-               'editingold',
-               'yourdiff',
-               'copyrightwarning',
-               'copyrightwarning2',
-               'editpage-head-copy-warn',
-               'editpage-tos-summary',
-               'longpage-hint',
-               'longpageerror',
-               'readonlywarning',
-               'protectedpagewarning',
-               'semiprotectedpagewarning',
-               'cascadeprotectedwarning',
-               'titleprotectedwarning',
-               'templatesused',
-               'templatesusedpreview',
-               'templatesusedsection',
-               'template-protected',
-               'template-semiprotected',
-               'hiddencategories',
-               'edittools',
-               'edittools-upload',
-               'nocreatetext',
-               'nocreate-loggedin',
-               'sectioneditnotsupported-title',
-               'sectioneditnotsupported-text',
-               'permissionserrors',
-               'permissionserrorstext',
-               'permissionserrorstext-withaction',
-               'recreate-moveddeleted-warn',
-               'moveddeleted-notice',
-               'log-fulllog',
-               'edit-hook-aborted',
-               'edit-gone-missing',
-               'edit-conflict',
-               'edit-no-change',
-               'postedit-confirmation',
-               'edit-already-exists',
-               'addsection-preload',
-               'addsection-editintro',
-               'defaultmessagetext',
-               'content-failed-to-parse',
-               'invalid-content-data',
-               'content-not-allowed-here',
-               'editwarning-warning',
-               'editpage-notsupportedcontentformat-title',
-               'editpage-notsupportedcontentformat-text',
-       ),
-       'contentmodels' => array(
-               'content-model-wikitext',
-               'content-model-text',
-               'content-model-javascript',
-               'content-model-css',
-       ),
-       'parserwarnings' => array(
-               'expensive-parserfunction-warning',
-               'expensive-parserfunction-category',
-               'post-expand-template-inclusion-warning',
-               'post-expand-template-inclusion-category',
-               'post-expand-template-argument-warning',
-               'post-expand-template-argument-category',
-               'parser-template-loop-warning',
-               'parser-template-recursion-depth-warning',
-               'language-converter-depth-warning',
-               'node-count-exceeded-category',
-               'node-count-exceeded-warning',
-               'expansion-depth-exceeded-category',
-               'expansion-depth-exceeded-warning',
-               'parser-unstrip-loop-warning',
-               'parser-unstrip-recursion-limit',
-               'converter-manual-rule-error',
-       ),
-       'undo' => array(
-               'undo-success',
-               'undo-failure',
-               'undo-norev',
-               'undo-nochange',
-               'undo-summary',
-               'undo-summary-username-hidden',
-       ),
-       'cantcreateaccount' => array(
-               'cantcreateaccounttitle',
-               'cantcreateaccount-text',
-               'cantcreateaccount-range-text',
-               'createaccount-hook-aborted',
-       ),
-       'history' => array(
-               'viewpagelogs',
-               'nohistory',
-               'currentrev',
-               'currentrev-asof',
-               'revisionasof',
-               'revision-info',
-               'revision-info-current',
-               'revision-nav',
-               'previousrevision',
-               'nextrevision',
-               'currentrevisionlink',
-               'cur',
-               'next',
-               'last',
-               'page_first',
-               'page_last',
-               'histlegend',
-               'history-fieldset-title',
-               'history-show-deleted',
-               'history_copyright',
-               'histfirst',
-               'histlast',
-               'historysize',
-               'historyempty',
-       ),
-       'history-feed' => array(
-               'history-feed-title',
-               'history-feed-description',
-               'history-feed-item-nocomment',
-               'history-feed-empty',
-       ),
-       'revdelete' => array(
-               'rev-deleted-comment',
-               'rev-deleted-user',
-               'rev-deleted-event',
-               'rev-deleted-user-contribs',
-               'rev-deleted-text-permission',
-               'rev-deleted-text-unhide',
-               'rev-suppressed-text-unhide',
-               'rev-deleted-text-view',
-               'rev-suppressed-text-view',
-               'rev-deleted-no-diff',
-               'rev-suppressed-no-diff',
-               'rev-deleted-unhide-diff',
-               'rev-suppressed-unhide-diff',
-               'rev-deleted-diff-view',
-               'rev-suppressed-diff-view',
-               'rev-delundel',
-               'rev-showdeleted',
-               'revisiondelete',
-               'revdelete-nooldid-title',
-               'revdelete-nooldid-text',
-               'revdelete-no-file',
-               'revdelete-show-file-confirm',
-               'revdelete-show-file-submit',
-               'revdelete-selected-text',
-               'revdelete-selected-file',
-               'logdelete-selected',
-               'revdelete-text-text',
-               'revdelete-text-file',
-               'logdelete-text',
-               'revdelete-text-others',
-               'revdelete-confirm',
-               'revdelete-suppress-text',
-               'revdelete-legend',
-               'revdelete-hide-text',
-               'revdelete-hide-image',
-               'revdelete-hide-name',
-               'revdelete-hide-comment',
-               'revdelete-hide-user',
-               'revdelete-hide-restricted',
-               'revdelete-radio-same',
-               'revdelete-radio-set',
-               'revdelete-radio-unset',
-               'revdelete-suppress',
-               'revdelete-unsuppress',
-               'revdelete-log',
-               'revdelete-submit',
-               'revdelete-success',
-               'revdelete-failure',
-               'logdelete-success',
-               'logdelete-failure',
-               'revdel-restore',
-               'pagehist',
-               'deletedhist',
-               'revdelete-hide-current',
-               'revdelete-show-no-access',
-               'revdelete-modify-no-access',
-               'revdelete-modify-missing',
-               'revdelete-no-change',
-               'revdelete-concurrent-change',
-               'revdelete-only-restricted',
-               'revdelete-reason-dropdown',
-               'revdelete-otherreason',
-               'revdelete-reasonotherlist',
-               'revdelete-edit-reasonlist',
-               'revdelete-offender',
-       ),
-       'suppression' => array(
-               'suppressionlog',
-               'suppressionlogtext',
-       ),
-       'mergehistory' => array(
-               'mergehistory',
-               'mergehistory-header',
-               'mergehistory-box',
-               'mergehistory-from',
-               'mergehistory-into',
-               'mergehistory-list',
-               'mergehistory-merge',
-               'mergehistory-go',
-               'mergehistory-submit',
-               'mergehistory-empty',
-               'mergehistory-success',
-               'mergehistory-fail',
-               'mergehistory-no-source',
-               'mergehistory-no-destination',
-               'mergehistory-invalid-source',
-               'mergehistory-invalid-destination',
-               'mergehistory-autocomment',
-               'mergehistory-comment',
-               'mergehistory-same-destination',
-               'mergehistory-reason',
-               'mergehistory-revisionrow'
-       ),
-       'mergelog' => array(
-               'mergelog',
-               'pagemerge-logentry',
-               'revertmerge',
-               'mergelogpagetext',
-       ),
-       'diffs' => array(
-               'history-title',
-               'difference-title',
-               'difference-title-multipage',
-               'difference-multipage',
-               'lineno',
-               'compareselectedversions',
-               'showhideselectedversions',
-               'editundo',
-               'diff-empty',
-               'diff-multi-sameuser',
-               'diff-multi-otherusers',
-               'diff-multi-manyusers',
-               'difference-missing-revision',
-       ),
-       'search' => array(
-               'search-summary',
-               'searchresults',
-               'searchresults-title',
-               'toomanymatches',
-               'titlematches',
-               'textmatches',
-               'notextmatches',
-               'prevn',
-               'nextn',
-               'prevn-title',
-               'nextn-title',
-               'shown-title',
-               'viewprevnext',
-               'searchmenu-exists',
-               'searchmenu-new',
-               'searchmenu-new-nocreate',
-               'searchprofile-articles',
-               'searchprofile-project',
-               'searchprofile-images',
-               'searchprofile-everything',
-               'searchprofile-advanced',
-               'searchprofile-articles-tooltip',
-               'searchprofile-project-tooltip',
-               'searchprofile-images-tooltip',
-               'searchprofile-everything-tooltip',
-               'searchprofile-advanced-tooltip',
-               'search-result-size',
-               'search-result-category-size',
-               'search-result-score',
-               'search-redirect',
-               'search-section',
-               'search-file-match',
-               'search-suggest',
-               'search-interwiki-caption',
-               'search-interwiki-default',
-               'search-interwiki-custom',
-               'search-interwiki-more',
-               'search-relatedarticle',
-               'searcheverything-enable',
-               'searchrelated',
-               'searchall',
-               'showingresults',
-               'showingresultsinrange',
-               'showingresultsnum',
-               'showingresultsheader',
-               'search-nonefound',
-               'powersearch-legend',
-               'powersearch-ns',
-               'powersearch-redir',
-               'powersearch-togglelabel',
-               'powersearch-toggleall',
-               'powersearch-togglenone',
-               'search-external',
-               'searchdisabled',
-               'googlesearch',
-               'search-error',
-       ),
-       'opensearch' => array(
-               'opensearch-desc',
-       ),
-       'preferences' => array(
-               'preferences',
-               'preferences-summary',
-               'mypreferences',
-               'prefs-edits',
-               'prefsnologintext2',
-               'prefs-skin',
-               'skin-preview',
-               'datedefault',
-               'prefs-datetime',
-               'prefs-labs',
-               'prefs-user-pages',
-               'prefs-personal',
-               'prefs-rc',
-               'prefs-watchlist',
-               'prefs-watchlist-days',
-               'prefs-watchlist-days-max',
-               'prefs-watchlist-edits',
-               'prefs-watchlist-edits-max',
-               'prefs-watchlist-token',
-               'prefs-misc', // continue checking if used from here on (r49916)
-               'prefs-resetpass',
-               'prefs-changeemail',
-               'prefs-setemail',
-               'prefs-email',
-               'prefs-rendering',
-               'saveprefs',
-               'restoreprefs',
-               'prefs-editing',
-               'rows',
-               'columns',
-               'searchresultshead',
-               'stub-threshold',
-               'stub-threshold-disabled',
-               'recentchangesdays',
-               'recentchangesdays-max',
-               'recentchangescount',
-               'prefs-help-recentchangescount',
-               'prefs-help-watchlist-token2',
-               'savedprefs',
-               'timezonelegend',
-               'localtime',
-               'timezoneuseserverdefault',
-               'timezoneuseoffset',
-               'servertime',
-               'guesstimezone',
-               'timezoneregion-africa',
-               'timezoneregion-america',
-               'timezoneregion-antarctica',
-               'timezoneregion-arctic',
-               'timezoneregion-asia',
-               'timezoneregion-atlantic',
-               'timezoneregion-australia',
-               'timezoneregion-europe',
-               'timezoneregion-indian',
-               'timezoneregion-pacific',
-               'allowemail',
-               'prefs-searchoptions',
-               'prefs-namespaces',
-               'defaultns',
-               'default',
-               'prefs-files',
-               'prefs-custom-css',
-               'prefs-custom-js',
-               'prefs-common-css-js',
-               'prefs-reset-intro',
-               'prefs-emailconfirm-label',
-               'youremail',
-               'username',
-               'uid',
-               'prefs-memberingroups',
-               'prefs-memberingroups-type',
-               'prefs-registration',
-               'prefs-registration-date-time',
-               'yourrealname',
-               'yourlanguage',
-               'yourvariant',
-               'prefs-help-variant',
-               'yournick',
-               'prefs-help-signature',
-               'badsig',
-               'badsiglength',
-               'yourgender',
-               'gender-unknown',
-               'gender-male',
-               'gender-female',
-               'prefs-help-gender',
-               'email',
-               'prefs-help-realname',
-
-               # 3 messages depending upon $wgEmailConfirmToEdit and $wgEnableUserEmail
-               'prefs-help-email',
-               'prefs-help-email-others',
-               'prefs-help-email-required',
-
-               'prefs-info',
-               'prefs-i18n',
-               'prefs-signature',
-               'prefs-dateformat',
-               'prefs-timeoffset',
-               'prefs-advancedediting',
-               'prefs-editor',
-               'prefs-preview',
-               'prefs-advancedrc',
-               'prefs-advancedrendering',
-               'prefs-advancedsearchoptions',
-               'prefs-advancedwatchlist',
-               'prefs-displayrc',
-               'prefs-displaysearchoptions',
-               'prefs-displaywatchlist',
-               'prefs-tokenwatchlist',
-               'prefs-diffs',
-               'prefs-help-prefershttps',
-               'prefs-tabs-navigation-hint',
-       ),
-       'preferences-email' => array(
-               'email-address-validity-valid',
-               'email-address-validity-invalid',
-       ),
-       'userrights' => array(
-               'userrights',
-               'userrights-summary',
-               'userrights-lookup-user',
-               'userrights-user-editname',
-               'editusergroup',
-               'editinguser',
-               'userrights-editusergroup',
-               'saveusergroups',
-               'userrights-groupsmember',
-               'userrights-groupsmember-auto',
-               'userrights-groupsmember-type',
-               'userrights-groups-help',
-               'userrights-reason',
-               'userrights-no-interwiki',
-               'userrights-nodatabase',
-               'userrights-nologin',
-               'userrights-notallowed',
-               'userrights-changeable-col',
-               'userrights-unchangeable-col',
-               'userrights-irreversible-marker',
-               'userrights-conflict',
-               'userrights-removed-self',
-       ),
-       'group' => array(
-               'group',
-               'group-user',
-               'group-autoconfirmed',
-               'group-bot',
-               'group-sysop',
-               'group-bureaucrat',
-               'group-suppress',
-               'group-all',
-       ),
-       'group-member' => array(
-               'group-user-member',
-               'group-autoconfirmed-member',
-               'group-bot-member',
-               'group-sysop-member',
-               'group-bureaucrat-member',
-               'group-suppress-member',
-       ),
-       'grouppage' => array(
-               'grouppage-user',
-               'grouppage-autoconfirmed',
-               'grouppage-bot',
-               'grouppage-sysop',
-               'grouppage-bureaucrat',
-               'grouppage-suppress',
-       ),
-       'right' => array(
-               'right-read',
-               'right-edit',
-               'right-createpage',
-               'right-createtalk',
-               'right-createaccount',
-               'right-minoredit',
-               'right-move',
-               'right-move-subpages',
-               'right-move-rootuserpages',
-               'right-movefile',
-               'right-suppressredirect',
-               'right-upload',
-               'right-reupload',
-               'right-reupload-own',
-               'right-reupload-shared',
-               'right-upload_by_url',
-               'right-purge',
-               'right-autoconfirmed',
-               'right-bot',
-               'right-nominornewtalk',
-               'right-apihighlimits',
-               'right-writeapi',
-               'right-delete',
-               'right-bigdelete',
-               'right-deletelogentry',
-               'right-deleterevision',
-               'right-deletedhistory',
-               'right-deletedtext',
-               'right-browsearchive',
-               'right-undelete',
-               'right-suppressrevision',
-               'right-suppressionlog',
-               'right-block',
-               'right-blockemail',
-               'right-hideuser',
-               'right-ipblock-exempt',
-               'right-proxyunbannable',
-               'right-unblockself',
-               'right-protect',
-               'right-editprotected',
-               'right-editsemiprotected',
-               'right-editinterface',
-               'right-editusercssjs',
-               'right-editusercss',
-               'right-edituserjs',
-               'right-editmyusercss',
-               'right-editmyuserjs',
-               'right-viewmywatchlist',
-               'right-editmywatchlist',
-               'right-viewmyprivateinfo',
-               'right-editmyprivateinfo',
-               'right-editmyoptions',
-               'right-rollback',
-               'right-markbotedits',
-               'right-noratelimit',
-               'right-import',
-               'right-importupload',
-               'right-patrol',
-               'right-autopatrol',
-               'right-patrolmarks',
-               'right-unwatchedpages',
-               'right-mergehistory',
-               'right-userrights',
-               'right-userrights-interwiki',
-               'right-siteadmin',
-               'right-override-export-depth',
-               'right-sendemail',
-               'right-passwordreset',
-       ),
-       'newuserlog' => array(
-               'newuserlogpage',
-               'newuserlogpagetext',
-       ),
-       'rightslog' => array(
-               'rightslog',
-               'rightslogtext',
-       ),
-       'action' => array(
-               'action-read',
-               'action-edit',
-               'action-createpage',
-               'action-createtalk',
-               'action-createaccount',
-               'action-minoredit',
-               'action-move',
-               'action-move-subpages',
-               'action-move-rootuserpages',
-               'action-movefile',
-               'action-upload',
-               'action-reupload',
-               'action-reupload-shared',
-               'action-upload_by_url',
-               'action-writeapi',
-               'action-delete',
-               'action-deleterevision',
-               'action-deletedhistory',
-               'action-browsearchive',
-               'action-undelete',
-               'action-suppressrevision',
-               'action-suppressionlog',
-               'action-block',
-               'action-protect',
-               'action-rollback',
-               'action-import',
-               'action-importupload',
-               'action-patrol',
-               'action-autopatrol',
-               'action-unwatchedpages',
-               'action-mergehistory',
-               'action-userrights',
-               'action-userrights-interwiki',
-               'action-siteadmin',
-               'action-sendemail',
-               'action-editmywatchlist',
-               'action-viewmywatchlist',
-               'action-viewmyprivateinfo',
-               'action-editmyprivateinfo',
-       ),
-       'recentchanges' => array(
-               'nchanges',
-               'enhancedrc-since-last-visit',
-               'enhancedrc-history',
-               'recentchanges',
-               'recentchanges-url',
-               'recentchanges-legend',
-               'recentchanges-summary',
-               'recentchangestext',
-               'recentchanges-noresult',
-               'recentchanges-feed-description',
-               'recentchanges-label-newpage',
-               'recentchanges-label-minor',
-               'recentchanges-label-bot',
-               'recentchanges-label-unpatrolled',
-               'recentchanges-label-plusminus',
-               'recentchanges-legend-heading',
-               'recentchanges-legend-newpage',
-               'recentchanges-legend-plusminus',
-               'rcnotefrom',
-               'rclistfrom',
-               'rcshowhideminor',
-               'rcshowhideminor-show',
-               'rcshowhideminor-hide',
-               'rcshowhidebots',
-               'rcshowhidebots-show',
-               'rcshowhidebots-hide',
-               'rcshowhideliu',
-               'rcshowhideliu-show',
-               'rcshowhideliu-hide',
-               'rcshowhideanons',
-               'rcshowhideanons-show',
-               'rcshowhideanons-hide',
-               'rcshowhidepatr',
-               'rcshowhidepatr-show',
-               'rcshowhidepatr-hide',
-               'rcshowhidemine',
-               'rcshowhidemine-show',
-               'rcshowhidemine-hide',
-               'rclinks',
-               'diff',
-               'hist',
-               'hide',
-               'show',
-               'minoreditletter',
-               'newpageletter',
-               'boteditletter',
-               'unpatrolledletter',
-               'number_of_watching_users_RCview',
-               'number_of_watching_users_pageview',
-               'rc_categories',
-               'rc_categories_any',
-               'rc-change-size',
-               'rc-change-size-new',
-               'newsectionsummary',
-               'rc-enhanced-expand',
-               'rc-enhanced-hide',
-               'rc-old-title',
-       ),
-       'recentchangeslinked' => array(
-               'recentchangeslinked',
-               'recentchangeslinked-feed',
-               'recentchangeslinked-toolbox',
-               'recentchangeslinked-title',
-               'recentchangeslinked-summary',
-               'recentchangeslinked-page',
-               'recentchangeslinked-to',
-       ),
-       'upload' => array(
-               'upload',
-               'uploadbtn',
-               'reuploaddesc',
-               'upload-tryagain',
-               'uploadnologin',
-               'uploadnologintext',
-               'upload_directory_missing',
-               'upload_directory_read_only',
-               'uploaderror',
-               'upload-summary',
-               'upload-recreate-warning',
-               'uploadtext',
-               'upload-permitted',
-               'upload-preferred',
-               'upload-prohibited',
-               'uploadfooter',
-               'upload-default-description',
-               'uploadlog',
-               'uploadlogpage',
-               'uploadlogpagetext',
-               'filename',
-               'filedesc',
-               'fileuploadsummary',
-               'filereuploadsummary',
-               'filestatus',
-               'filesource',
-               'uploadedfiles',
-               'ignorewarning',
-               'ignorewarnings',
-               'minlength1',
-               'illegalfilename',
-               'filename-toolong',
-               'badfilename',
-               'filetype-mime-mismatch',
-               'filetype-badmime',
-               'filetype-bad-ie-mime',
-               'filetype-unwanted-type',
-               'filetype-banned-type',
-               'filetype-missing',
-               'empty-file',
-               'file-too-large',
-               'filename-tooshort',
-               'filetype-banned',
-               'verification-error',
-               'hookaborted',
-               'illegal-filename',
-               'overwrite',
-               'unknown-error',
-               'tmp-create-error',
-               'tmp-write-error',
-               'large-file',
-               'largefileserver',
-               'emptyfile',
-               'windows-nonascii-filename',
-               'fileexists',
-               'filepageexists',
-               'fileexists-extension',
-               'fileexists-thumbnail-yes',
-               'file-thumbnail-no',
-               'fileexists-forbidden',
-               'fileexists-shared-forbidden',
-               'file-exists-duplicate',
-               'file-deleted-duplicate',
-               'file-deleted-duplicate-notitle',
-               'uploadwarning',
-               'uploadwarning-text',
-               'savefile',
-               'uploadedimage',
-               'overwroteimage',
-               'uploaddisabled',
-               'copyuploaddisabled',
-               'uploadfromurl-queued',
-               'uploaddisabledtext',
-               'php-uploaddisabledtext',
-               'uploadscripted',
-               'uploadscriptednamespace',
-               'uploadinvalidxml',
-               'uploadvirus',
-               'uploadjava',
-               'upload-source',
-               'sourcefilename',
-               'sourceurl',
-               'destfilename',
-               'upload-maxfilesize',
-               'upload-description',
-               'upload-options',
-               'watchthisupload',
-               'filewasdeleted',
-               'filename-bad-prefix',
-               'filename-prefix-blacklist',
-               'upload-success-subj',
-               'upload-success-msg',
-               'upload-failure-subj',
-               'upload-failure-msg',
-               'upload-warning-subj',
-               'upload-warning-msg',
-       ),
-       'upload-errors' => array(
-               'upload-proto-error',
-               'upload-proto-error-text',
-               'upload-file-error',
-               'upload-file-error-text',
-               'upload-misc-error',
-               'upload-misc-error-text',
-               'upload-too-many-redirects',
-               'upload-unknown-size',
-               'upload-http-error',
-               'upload-copy-upload-invalid-domain',
-       ),
-
-       'filebackend-errors' => array(
-               'backend-fail-stream',
-               'backend-fail-backup',
-               'backend-fail-notexists',
-               'backend-fail-hashes',
-               'backend-fail-notsame',
-               'backend-fail-invalidpath',
-               'backend-fail-delete',
-               'backend-fail-describe',
-               'backend-fail-alreadyexists',
-               'backend-fail-store',
-               'backend-fail-copy',
-               'backend-fail-move',
-               'backend-fail-opentemp',
-               'backend-fail-writetemp',
-               'backend-fail-closetemp',
-               'backend-fail-read',
-               'backend-fail-create',
-               'backend-fail-maxsize',
-               'backend-fail-readonly',
-               'backend-fail-synced',
-               'backend-fail-connect',
-               'backend-fail-internal',
-               'backend-fail-contenttype',
-               'backend-fail-batchsize',
-               'backend-fail-usable'
-       ),
-
-       'filejournal-errors' => array(
-               'filejournal-fail-dbconnect',
-               'filejournal-fail-dbquery'
-       ),
-
-       'lockmanager-errors' => array(
-               'lockmanager-notlocked',
-               'lockmanager-fail-closelock',
-               'lockmanager-fail-deletelock',
-               'lockmanager-fail-acquirelock',
-               'lockmanager-fail-openlock',
-               'lockmanager-fail-releaselock',
-               'lockmanager-fail-db-bucket',
-               'lockmanager-fail-db-release',
-               'lockmanager-fail-svr-acquire',
-               'lockmanager-fail-svr-release'
-       ),
-
-       'zip' => array(
-               'zip-file-open-error',
-               'zip-wrong-format',
-               'zip-bad',
-               'zip-unsupported'
-       ),
-
-       'uploadstash' => array(
-               'uploadstash',
-               'uploadstash-summary',
-               'uploadstash-clear',
-               'uploadstash-nofiles',
-               'uploadstash-badtoken',
-               'uploadstash-errclear',
-               'uploadstash-refresh',
-               'invalid-chunk-offset',
-       ),
-
-       'img-auth' => array(
-               'img-auth-accessdenied',
-               'img-auth-desc',
-               'img-auth-nopathinfo',
-               'img-auth-notindir',
-               'img-auth-badtitle',
-               'img-auth-nologinnWL',
-               'img-auth-nofile',
-               'img-auth-isdir',
-               'img-auth-streaming',
-               'img-auth-public',
-               'img-auth-noread',
-               'img-auth-bad-query-string',
-       ),
-
-       'http-errors' => array(
-               'http-invalid-url',
-               'http-invalid-scheme',
-               'http-request-error',
-               'http-read-error',
-               'http-timed-out',
-               'http-curl-error',
-               'http-bad-status',
-       ),
-
-       'upload-curl-errors' => array(
-               'upload-curl-error6',
-               'upload-curl-error6-text',
-               'upload-curl-error28',
-               'upload-curl-error28-text',
-       ),
-       'licenses' => array(
-               'license',
-               'license-header',
-               'nolicense',
-               'licenses',
-               'license-nopreview',
-               'upload_source_url',
-               'upload_source_file',
-       ),
-       'filelist' => array(
-               'listfiles-summary',
-               'listfiles_search_for',
-               'imgfile',
-               'listfiles',
-               'listfiles_thumb',
-               'listfiles_date',
-               'listfiles_name',
-               'listfiles_user',
-               'listfiles_size',
-               'listfiles_description',
-               'listfiles_count',
-               'listfiles-show-all',
-               'listfiles-latestversion',
-               'listfiles-latestversion-yes',
-               'listfiles-latestversion-no',
-       ),
-       'filedescription' => array(
-               'file-anchor-link',
-               'filehist',
-               'filehist-help',
-               'filehist-deleteall',
-               'filehist-deleteone',
-               'filehist-revert',
-               'filehist-current',
-               'filehist-datetime',
-               'filehist-thumb',
-               'filehist-thumbtext',
-               'filehist-nothumb',
-               'filehist-user',
-               'filehist-dimensions',
-               'filehist-filesize',
-               'filehist-comment',
-               'filehist-missing',
-               'imagelinks',
-               'linkstoimage',
-               'linkstoimage-more',
-               'nolinkstoimage',
-               'morelinkstoimage',
-               'linkstoimage-redirect',
-               'duplicatesoffile',
-               'sharedupload',
-               'sharedupload-desc-there',
-               'sharedupload-desc-here',
-               'sharedupload-desc-edit',
-               'sharedupload-desc-create',
-               'shareddescriptionfollows',
-               'filepage-nofile',
-               'filepage-nofile-link',
-               'uploadnewversion-linktext',
-               'shared-repo-from',
-               'shared-repo',
-               'shared-repo-name-wikimediacommons',
-               'filepage.css',
-               'upload-disallowed-here',
-       ),
-       'filerevert' => array(
-               'filerevert',
-               'filerevert-legend',
-               'filerevert-intro',
-               'filerevert-comment',
-               'filerevert-defaultcomment',
-               'filerevert-submit',
-               'filerevert-success',
-               'filerevert-badversion',
-       ),
-       'filedelete' => array(
-               'filedelete',
-               'filedelete-legend',
-               'filedelete-intro',
-               'filedelete-intro-old',
-               'filedelete-comment',
-               'filedelete-submit',
-               'filedelete-success',
-               'filedelete-success-old',
-               'filedelete-nofile',
-               'filedelete-nofile-old',
-               'filedelete-otherreason',
-               'filedelete-reason-otherlist',
-               'filedelete-reason-dropdown',
-               'filedelete-edit-reasonlist',
-               'filedelete-maintenance',
-               'filedelete-maintenance-title',
-       ),
-       'mimesearch' => array(
-               'mimesearch',
-               'mimesearch-summary',
-               'mimetype',
-               'download',
-       ),
-       'unwatchedpages' => array(
-               'unwatchedpages',
-               'unwatchedpages-summary',
-       ),
-       'listredirects' => array(
-               'listredirects',
-               'listredirects-summary',
-       ),
-       'listduplicatedfiles' => array(
-               'listduplicatedfiles',
-               'listduplicatedfiles-summary',
-               'listduplicatedfiles-entry',
-       ),
-       'unusedtemplates' => array(
-               'unusedtemplates',
-               'unusedtemplates-summary',
-               'unusedtemplatestext',
-               'unusedtemplateswlh',
-       ),
-       'randompage' => array(
-               'randompage',
-               'randompage-nopages',
-               'randompage-url',
-       ),
-       'randomincategory' => array(
-               'randomincategory',
-               'randomincategory-invalidcategory',
-               'randomincategory-nopages',
-               'randomincategory-selectcategory',
-               'randomincategory-selectcategory-submit',
-       ),
-       'randomredirect' => array(
-               'randomredirect',
-               'randomredirect-nopages',
-       ),
-       'statistics' => array(
-               'statistics',
-               'statistics-summary',
-               'statistics-header-pages',
-               'statistics-header-edits',
-               'statistics-header-views',
-               'statistics-header-users',
-               'statistics-header-hooks',
-               'statistics-articles',
-               'statistics-pages',
-               'statistics-pages-desc',
-               'statistics-files',
-               'statistics-edits',
-               'statistics-edits-average',
-               'statistics-views-total',
-               'statistics-views-total-desc',
-               'statistics-views-peredit',
-               'statistics-users',
-               'statistics-users-active',
-               'statistics-users-active-desc',
-               'statistics-mostpopular',
-               'statistics-footer',
-       ),
-       'pageswithprop' => array(
-               'pageswithprop',
-               'pageswithprop-summary',
-               'pageswithprop-legend',
-               'pageswithprop-text',
-               'pageswithprop-prop',
-               'pageswithprop-submit',
-               'pageswithprop-prophidden-long',
-               'pageswithprop-prophidden-binary',
-       ),
-       'doubleredirects' => array(
-               'doubleredirects',
-               'doubleredirects-summary',
-               'doubleredirectstext',
-               'double-redirect-fixed-move',
-               'double-redirect-fixed-maintenance',
-               'double-redirect-fixer',
-       ),
-       'brokenredirects' => array(
-               'brokenredirects',
-               'brokenredirects-summary',
-               'brokenredirectstext',
-               'brokenredirects-edit',
-               'brokenredirects-delete',
-       ),
-       'withoutinterwiki' => array(
-               'withoutinterwiki',
-               'withoutinterwiki-summary',
-               'withoutinterwiki-legend',
-               'withoutinterwiki-submit',
-       ),
-       'fewestrevisions' => array(
-               'fewestrevisions',
-               'fewestrevisions-summary',
-       ),
-       'specialpages' => array(
-               'nbytes',
-               'ncategories',
-               'ninterwikis',
-               'nlinks',
-               'nmembers',
-               'nmemberschanged',
-               'nrevisions',
-               'nviews',
-               'nimagelinks',
-               'ntransclusions',
-               'specialpage-empty',
-               'lonelypages',
-               'lonelypages-summary',
-               'lonelypagestext',
-               'uncategorizedpages',
-               'uncategorizedpages-summary',
-               'uncategorizedcategories',
-               'uncategorizedcategories-summary',
-               'uncategorizedimages',
-               'uncategorizedimages-summary',
-               'uncategorizedtemplates',
-               'uncategorizedtemplates-summary',
-               'unusedcategories',
-               'unusedcategories-summary',
-               'unusedimages',
-               'unusedimages-summary',
-               'popularpages',
-               'popularpages-summary',
-               'wantedcategories',
-               'wantedcategories-summary',
-               'wantedpages',
-               'wantedpages-summary',
-               'wantedpages-badtitle',
-               'wantedfiles',
-               'wantedfiles-summary',
-               'wantedfiletext-cat',
-               'wantedfiletext-nocat',
-               'wantedtemplates',
-               'wantedtemplates-summary',
-               'mostlinked',
-               'mostlinked-summary',
-               'mostlinkedcategories',
-               'mostlinkedcategories-summary',
-               'mostlinkedtemplates',
-               'mostlinkedtemplates-summary',
-               'mostcategories',
-               'mostcategories-summary',
-               'mostimages',
-               'mostimages-summary',
-               'mostinterwikis',
-               'mostinterwikis-summary',
-               'mostrevisions',
-               'mostrevisions-summary',
-               'prefixindex',
-               'prefixindex-namespace',
-               'prefixindex-summary',
-               'prefixindex-strip',
-               'shortpages',
-               'shortpages-summary',
-               'longpages',
-               'longpages-summary',
-               'deadendpages',
-               'deadendpages-summary',
-               'deadendpagestext',
-               'protectedpages',
-               'protectedpages-indef',
-               'protectedpages-summary',
-               'protectedpages-cascade',
-               'protectedpages-noredirect',
-               'protectedpagesempty',
-               'protectedpages-timestamp',
-               'protectedpages-page',
-               'protectedpages-expiry',
-               'protectedpages-performer',
-               'protectedpages-params',
-               'protectedpages-reason',
-               'protectedpages-unknown-timestamp',
-               'protectedpages-unknown-performer',
-               'protectedpages-unknown-reason',
-               'protectedtitles',
-               'protectedtitles-summary',
-               'protectedtitlesempty',
-               'listusers',
-               'listusers-summary',
-               'listusers-editsonly',
-               'listusers-creationsort',
-               'listusers-desc',
-               'usereditcount',
-               'usercreated',
-               'newpages',
-               'newpages-summary',
-               'newpages-username',
-               'ancientpages',
-               'ancientpages-summary',
-               'move',
-               'movethispage',
-               'unusedimagestext',
-               'unusedcategoriestext',
-               'notargettitle',
-               'notargettext',
-               'nopagetitle',
-               'nopagetext',
-               'pager-newer-n',
-               'pager-older-n',
-               'suppress',
-               'querypage-disabled',
-       ),
-       'booksources' => array(
-               'booksources',
-               'booksources-summary',
-               'booksources-search-legend',
-               'booksources-isbn',
-               'booksources-go',
-               'booksources-text',
-               'booksources-invalid-isbn',
-       ),
-       'magicwords' => array(
-               'rfcurl',
-               'pubmedurl',
-       ),
-       'logpages' => array(
-               'specialloguserlabel',
-               'speciallogtitlelabel',
-               'log',
-               'all-logs-page',
-               'alllogstext',
-               'logempty',
-               'log-title-wildcard',
-               'showhideselectedlogentries',
-       ),
-       'allpages' => array(
-               'allpages',
-               'allpages-summary',
-               'alphaindexline',
-               'nextpage',
-               'prevpage',
-               'allpagesfrom',
-               'allpagesto',
-               'allarticles',
-               'allinnamespace',
-               'allpagessubmit',
-               'allpagesprefix',
-               'allpagesbadtitle',
-               'allpages-bad-ns',
-               'allpages-hide-redirects',
-       ),
-       'cachedspecial' => array(
-               'cachedspecial-viewing-cached-ttl',
-               'cachedspecial-viewing-cached-ts',
-               'cachedspecial-refresh-now',
-       ),
-       'categories' => array(
-               'categories',
-               'categories-summary',
-               'categoriespagetext',
-               'categoriesfrom',
-               'special-categories-sort-count',
-               'special-categories-sort-abc',
-       ),
-       'deletedcontribs' => array(
-               'deletedcontributions',
-               'deletedcontributions-summary',
-               'deletedcontributions-title',
-               'sp-deletedcontributions-contribs',
-       ),
-       'linksearch' => array(
-               'linksearch',
-               'linksearch-summary',
-               'linksearch-pat',
-               'linksearch-ns',
-               'linksearch-ok',
-               'linksearch-text',
-               'linksearch-line',
-               'linksearch-error',
-       ),
-       'listusers' => array(
-               'listusersfrom',
-               'listusers-submit',
-               'listusers-noresult',
-               'listusers-blocked',
-       ),
-       'activeusers' => array(
-               'activeusers',
-               'activeusers-summary',
-               'activeusers-intro',
-               'activeusers-count',
-               'activeusers-from',
-               'activeusers-hidebots',
-               'activeusers-hidesysops',
-               'activeusers-submit',
-               'activeusers-noresult',
-       ),
-       'listgrouprights' => array(
-               'listgrouprights',
-               'listgrouprights-summary',
-               'listgrouprights-key',
-               'listgrouprights-group',
-               'listgrouprights-rights',
-               'listgrouprights-helppage',
-               'listgrouprights-members',
-               'listgrouprights-right-display',
-               'listgrouprights-right-revoked',
-               'listgrouprights-addgroup',
-               'listgrouprights-removegroup',
-               'listgrouprights-addgroup-all',
-               'listgrouprights-removegroup-all',
-               'listgrouprights-addgroup-self',
-               'listgrouprights-removegroup-self',
-               'listgrouprights-addgroup-self-all',
-               'listgrouprights-removegroup-self-all',
-
-       ),
-       'emailuser' => array(
-               'mailnologin',
-               'mailnologintext',
-               'emailuser',
-               'emailuser-title-target',
-               'emailuser-title-notarget',
-               'emailuser-summary',
-               'emailpage',
-               'emailpagetext',
-               'usermailererror',
-               'defemailsubject',
-               'usermaildisabled',
-               'usermaildisabledtext',
-               'noemailtitle',
-               'noemailtext',
-               'nowikiemailtitle',
-               'nowikiemailtext',
-               'emailnotarget',
-               'emailtarget',
-               'emailusername',
-               'emailusernamesubmit',
-               'email-legend',
-               'emailfrom',
-               'emailto',
-               'emailsubject',
-               'emailmessage',
-               'emailsend',
-               'emailccme',
-               'emailccsubject',
-               'emailsent',
-               'emailsenttext',
-               'emailuserfooter',
-       ),
-       'usermessage' => array(
-               'usermessage-summary',
-               'usermessage-editor',
-               'usermessage-template',
-       ),
-       'watchlist' => array(
-               'watchlist',
-               'watchlist-summary',
-               'mywatchlist',
-               'watchlistfor2',
-               'nowatchlist',
-               'watchlistanontext',
-               'watchnologin',
-               'watchnologintext',
-               'addwatch',
-               'addedwatchtext',
-               'removewatch',
-               'removedwatchtext',
-               'watch',
-               'watchthispage',
-               'unwatch',
-               'unwatchthispage',
-               'notanarticle',
-               'notvisiblerev',
-               'watchlist-details',
-               'wlheader-enotif',
-               'wlheader-showupdated',
-               'watchmethod-recent',
-               'watchmethod-list',
-               'watchlistcontains',
-               'iteminvalidname',
-               'wlnote2',
-               'wlshowlast',
-               'watchlist-options',
-       ),
-       'watching' => array(
-               'watching',
-               'unwatching',
-               'watcherrortext',
-       ),
-       'enotif' => array(
-               'enotif_mailer',
-               'enotif_reset',
-               'enotif_impersonal_salutation',
-               'enotif_subject_deleted',
-               'enotif_subject_created',
-               'enotif_subject_moved',
-               'enotif_subject_restored',
-               'enotif_subject_changed',
-               'enotif_body_intro_deleted',
-               'enotif_body_intro_created',
-               'enotif_body_intro_moved',
-               'enotif_body_intro_restored',
-               'enotif_body_intro_changed',
-               'enotif_lastvisited',
-               'enotif_lastdiff',
-               'enotif_anon_editor',
-               'enotif_body',
-               'created',
-               'changed',
-       ),
-       'delete' => array(
-               'deletepage',
-               'confirm',
-               'excontent',
-               'excontentauthor',
-               'exbeforeblank',
-               'exblank',
-               'delete-confirm',
-               'delete-legend',
-               'historywarning',
-               'confirmdeletetext',
-               'actioncomplete',
-               'actionfailed',
-               'deletedtext',
-               'dellogpage',
-               'dellogpagetext',
-               'deletionlog',
-               'reverted',
-               'deletecomment',
-               'deleteotherreason',
-               'deletereasonotherlist',
-               'deletereason-dropdown',
-               'delete-edit-reasonlist',
-               'delete-toobig',
-               'delete-warning-toobig',
-               'deleting-backlinks-warning',
-       ),
-       'rollback' => array(
-               'rollback',
-               'rollback_short',
-               'rollbacklink',
-               'rollbacklinkcount',
-               'rollbacklinkcount-morethan',
-               'rollbackfailed',
-               'cantrollback',
-               'alreadyrolled',
-               'editcomment',
-               'revertpage',
-               'revertpage-nouser',
-               'rollback-success',
-       ),
-       'edittokens' => array(
-               'sessionfailure-title',
-               'sessionfailure',
-       ),
-       'protect' => array(
-               'protectlogpage',
-               'protectlogtext',
-               'protectedarticle',
-               'modifiedarticleprotection',
-               'unprotectedarticle',
-               'movedarticleprotection',
-               'protect-title',
-               'protect-title-notallowed',
-               'prot_1movedto2',
-               'protect-badnamespace-title',
-               'protect-badnamespace-text',
-               'protect-norestrictiontypes-text',
-               'protect-norestrictiontypes-title',
-               'protect-legend',
-               'protectcomment',
-               'protectexpiry',
-               'protect_expiry_invalid',
-               'protect_expiry_old',
-               'protect-unchain-permissions',
-               'protect-text',
-               'protect-locked-blocked',
-               'protect-locked-dblock',
-               'protect-locked-access',
-               'protect-cascadeon',
-               'protect-default',
-               'protect-fallback',
-               'protect-level-autoconfirmed',
-               'protect-level-sysop',
-               'protect-summary-desc',
-               'protect-summary-cascade',
-               'protect-expiring',
-               'protect-expiring-local',
-               'protect-expiry-indefinite',
-               'protect-cascade',
-               'protect-cantedit',
-               'protect-othertime',
-               'protect-othertime-op',
-               'protect-existing-expiry',
-               'protect-otherreason',
-               'protect-otherreason-op',
-               'protect-dropdown',
-               'protect-edit-reasonlist',
-               'protect-expiry-options',
-               'restriction-type',
-               'restriction-level',
-               'minimum-size',
-               'maximum-size',
-               'pagesize',
-       ),
-       'restrictions' => array(
-               'restriction-edit',
-               'restriction-move',
-               'restriction-create',
-               'restriction-upload',
-       ),
-       'restriction-levels' => array(
-               'restriction-level-sysop',
-               'restriction-level-autoconfirmed',
-               'restriction-level-all',
-       ),
-       'undelete' => array(
-               'undelete',
-               'undelete-summary',
-               'undeletepage',
-               'undeletepagetitle',
-               'viewdeletedpage',
-               'undeletepagetext',
-               'undelete-fieldset-title',
-               'undeleteextrahelp',
-               'undeleterevisions',
-               'undeletehistory',
-               'undeleterevdel',
-               'undeletehistorynoadmin',
-               'undelete-revision',
-               'undeleterevision-missing',
-               'undelete-nodiff',
-               'undeletebtn',
-               'undeletelink',
-               'undeleteviewlink',
-               'undeleteinvert',
-               'undeletecomment',
-               'undeletedrevisions',
-               'undeletedrevisions-files',
-               'undeletedfiles',
-               'cannotundelete',
-               'undeletedpage',
-               'undelete-header',
-               'undelete-search-title',
-               'undelete-search-box',
-               'undelete-search-prefix',
-               'undelete-search-submit',
-               'undelete-no-results',
-               'undelete-filename-mismatch',
-               'undelete-bad-store-key',
-               'undelete-cleanup-error',
-               'undelete-missing-filearchive',
-               'undelete-error',
-               'undelete-error-short',
-               'undelete-error-long',
-               'undelete-show-file-confirm',
-               'undelete-show-file-submit',
-               'undelete-revision-row',
-       ),
-       'nsform' => array(
-               'namespace',
-               'invert',
-               'tooltip-invert',
-               'namespace_association',
-               'tooltip-namespace_association',
-               'blanknamespace',
-       ),
-       'contributions' => array(
-               'contributions',
-               'contributions-summary',
-               'contributions-title',
-               'mycontris',
-               'contribsub2',
-               'nocontribs',
-               'uctop',
-               'month',
-               'year',
-       ),
-       'sp-contributions' => array(
-               'sp-contributions-newbies',
-               'sp-contributions-newbies-sub',
-               'sp-contributions-newbies-title',
-               'sp-contributions-blocklog',
-               'sp-contributions-deleted',
-               'sp-contributions-uploads',
-               'sp-contributions-logs',
-               'sp-contributions-talk',
-               'sp-contributions-userrights',
-               'sp-contributions-blocked-notice',
-               'sp-contributions-blocked-notice-anon',
-               'sp-contributions-search',
-               'sp-contributions-suppresslog',
-               'sp-contributions-username',
-               'sp-contributions-toponly',
-               'sp-contributions-newonly',
-               'sp-contributions-submit',
-               'sp-contributions-explain',
-               'sp-contributions-footer',
-               'sp-contributions-footer-anon',
-               'sp-contributions-footer-newbies',
-       ),
-       'whatlinkshere' => array(
-               'whatlinkshere',
-               'whatlinkshere-title',
-               'whatlinkshere-summary',
-               'whatlinkshere-page',
-               'linkshere',
-               'nolinkshere',
-               'nolinkshere-ns',
-               'isredirect',
-               'istemplate',
-               'isimage',
-               'whatlinkshere-prev',
-               'whatlinkshere-next',
-               'whatlinkshere-links',
-               'whatlinkshere-hideredirs',
-               'whatlinkshere-hidetrans',
-               'whatlinkshere-hidelinks',
-               'whatlinkshere-hideimages',
-               'whatlinkshere-filters',
-       ),
-       'block' => array(
-               'autoblockid',
-               'block',
-               'unblock',
-               'unblock-summary',
-               'blockip',
-               'blockip-legend',
-               'blockiptext',
-               'ipadressorusername',
-               'ipbexpiry',
-               'ipbreason',
-               'ipbreason-dropdown',
-               'ipb-hardblock',
-               'ipbcreateaccount',
-               'ipbemailban',
-               'ipbenableautoblock',
-               'ipbsubmit',
-               'ipbother',
-               'ipboptions',
-               'ipbhidename',
-               'ipbwatchuser',
-               'ipb-disableusertalk',
-               'ipb-change-block',
-               'ipb-confirm',
-               'badipaddress',
-               'blockipsuccesssub',
-               'blockipsuccesstext',
-               'ipb-blockingself',
-               'ipb-confirmhideuser',
-               'ipb-confirmaction',
-               'ipb-edit-dropdown',
-               'ipb-unblock-addr',
-               'ipb-unblock',
-               'ipb-blocklist',
-               'ipb-blocklist-contribs',
-               'unblockip',
-               'unblockiptext',
-               'ipusubmit',
-               'unblocked',
-               'unblocked-range',
-               'unblocked-id',
-               'blocklist',
-               'ipblocklist',
-               'ipblocklist-legend',
-               'blocklist-userblocks',
-               'blocklist-tempblocks',
-               'blocklist-addressblocks',
-               'blocklist-rangeblocks',
-               'blocklist-timestamp',
-               'blocklist-target',
-               'blocklist-expiry',
-               'blocklist-by',
-               'blocklist-params',
-               'blocklist-reason',
-               'blocklist-summary',
-               'ipblocklist-submit',
-               'ipblocklist-localblock',
-               'ipblocklist-otherblocks',
-
-               'infiniteblock',
-               'expiringblock',
-               'anononlyblock',
-               'noautoblockblock',
-               'createaccountblock',
-               'emailblock',
-               'blocklist-nousertalk',
-               'ipblocklist-empty',
-               'ipblocklist-no-results',
-               'blocklink',
-               'unblocklink',
-               'change-blocklink',
-               'contribslink',
-               'emaillink',
-               'autoblocker',
-               'blocklogpage',
-               'blocklog-showlog',
-               'blocklog-showsuppresslog',
-               'blocklogentry',
-               'reblock-logentry',
-               'blocklogtext',
-               'unblocklogentry',
-               'block-log-flags-anononly',
-               'block-log-flags-nocreate',
-               'block-log-flags-noautoblock',
-               'block-log-flags-noemail',
-               'block-log-flags-nousertalk',
-               'block-log-flags-angry-autoblock',
-               'block-log-flags-hiddenname',
-               'range_block_disabled',
-               'ipb_expiry_invalid',
-               'ipb_expiry_temp',
-               'ipb_hide_invalid',
-               'ipb_already_blocked',
-               'ipb-needreblock',
-               'ipb-otherblocks-header',
-               'unblock-hideuser',
-               'ipb_cant_unblock',
-               'ipb_blocked_as_range',
-               'ip_range_invalid',
-               'ip_range_toolarge',
-               'proxyblocker',
-               'proxyblockreason',
-               'sorbs',
-               'sorbsreason',
-               'sorbs_create_account_reason',
-               'xffblockreason',
-               'cant-see-hidden-user',
-               'ipbblocked',
-               'ipbnounblockself',
-               'ipb-default-expiry',
-       ),
-       'developertools' => array(
-               'lockdb',
-               'unlockdb',
-               'lockdbtext',
-               'unlockdbtext',
-               'lockconfirm',
-               'unlockconfirm',
-               'lockbtn',
-               'unlockbtn',
-               'locknoconfirm',
-               'lockdbsuccesssub',
-               'unlockdbsuccesssub',
-               'lockdbsuccesstext',
-               'unlockdbsuccesstext',
-               'lockfilenotwritable',
-               'databasenotlocked',
-               'lockedbyandtime',
-       ),
-       'movepage' => array(
-               'move-page',
-               'movepage-summary',
-               'move-page-legend',
-               'movepagetext',
-               'movepagetext-noredirectfixer',
-               'movepagetalktext',
-               'movearticle',
-               'moveuserpage-warning',
-               'movenologintext',
-               'movenotallowed',
-               'movenotallowedfile',
-               'cant-move-user-page',
-               'cant-move-to-user-page',
-               'newtitle',
-               'move-watch',
-               'movepagebtn',
-               'pagemovedsub',
-               'movepage-moved',
-               'movepage-moved-redirect',
-               'movepage-moved-noredirect',
-               'articleexists',
-               'cantmove-titleprotected',
-               'movetalk',
-               'move-subpages',
-               'move-talk-subpages',
-               'movepage-page-exists',
-               'movepage-page-moved',
-               'movepage-page-unmoved',
-               'movepage-max-pages',
-               'movelogpage',
-               'movelogpagetext',
-               'movesubpage',
-               'movesubpagetext',
-               'movenosubpage',
-               'movereason',
-               'move-redirect-text',
-               'revertmove',
-               'delete_and_move',
-               'delete_and_move_text',
-               'delete_and_move_confirm',
-               'delete_and_move_reason',
-               'selfmove',
-               'immobile-source-namespace',
-               'immobile-target-namespace',
-               'immobile-target-namespace-iw',
-               'immobile-source-page',
-               'immobile-target-page',
-               'bad-target-model',
-               'immobile_namespace',
-               'imagenocrossnamespace',
-               'nonfile-cannot-move-to-file',
-               'imagetypemismatch',
-               'imageinvalidfilename',
-               'fix-double-redirects',
-               'move-leave-redirect',
-               'protectedpagemovewarning',
-               'semiprotectedpagemovewarning',
-               'move-over-sharedrepo',
-               'file-exists-sharedrepo',
-       ),
-       'export' => array(
-               'export',
-               'export-summary',
-               'exporttext',
-               'exportall',
-               'exportcuronly',
-               'exportnohistory',
-               'exportlistauthors',
-               'export-submit',
-               'export-addcattext',
-               'export-addcat',
-               'export-addnstext',
-               'export-addns',
-               'export-download',
-               'export-templates',
-               'export-pagelinks',
-       ),
-       'allmessages' => array(
-               'allmessages',
-               'allmessagesname',
-               'allmessagesdefault',
-               'allmessagescurrent',
-               'allmessagestext',
-               'allmessagesnotsupportedDB',
-               'allmessages-filter-legend',
-               'allmessages-filter',
-               'allmessages-filter-unmodified',
-               'allmessages-filter-all',
-               'allmessages-filter-modified',
-               'allmessages-prefix',
-               'allmessages-language',
-               'allmessages-filter-submit',
-               'allmessages-filter-translate',
-       ),
-       'thumbnails' => array(
-               'thumbnail-more',
-               'filemissing',
-               'thumbnail_error',
-               'thumbnail_error_remote',
-               'djvu_page_error',
-               'djvu_no_xml',
-               'thumbnail-temp-create',
-               'thumbnail-dest-create',
-               'thumbnail_invalid_params',
-               'thumbnail_dest_directory',
-               'thumbnail_image-type',
-               'thumbnail_gd-library',
-               'thumbnail_image-missing',
-               'thumbnail_image-failure-limit'
-       ),
-       'import' => array(
-               'import',
-               'import-summary',
-               'importinterwiki',
-               'import-interwiki-text',
-               'import-interwiki-source',
-               'import-interwiki-history',
-               'import-interwiki-templates',
-               'import-interwiki-submit',
-               'import-interwiki-namespace',
-               'import-interwiki-rootpage',
-               'import-upload-filename',
-               'import-comment',
-               'importtext',
-               'importstart',
-               'import-revision-count',
-               'importnopages',
-               'imported-log-entries',
-               'importfailed',
-               'importunknownsource',
-               'importcantopen',
-               'importbadinterwiki',
-               'importnotext',
-               'importsuccess',
-               'importhistoryconflict',
-               'importnosources',
-               'importnofile',
-               'importuploaderrorsize',
-               'importuploaderrorpartial',
-               'importuploaderrortemp',
-               'import-parse-failure',
-               'import-noarticle',
-               'import-nonewrevisions',
-               'xml-error-string',
-               'import-upload',
-               'import-token-mismatch',
-               'import-invalid-interwiki',
-               'import-error-edit',
-               'import-error-create',
-               'import-error-interwiki',
-               'import-error-special',
-               'import-error-invalid',
-               'import-error-unserialize',
-               'import-error-bad-location',
-               'import-options-wrong',
-               'import-rootpage-invalid',
-               'import-rootpage-nosubpage',
-       ),
-       'importlog' => array(
-               'importlogpage',
-               'importlogpagetext',
-               'import-logentry-upload',
-               'import-logentry-upload-detail',
-               'import-logentry-interwiki',
-               'import-logentry-interwiki-detail',
-       ),
-       'javaccripttest' => array(
-               'javascripttest',
-               'javascripttest-backlink',
-               'javascripttest-title',
-               'javascripttest-pagetext-noframework',
-               'javascripttest-pagetext-unknownframework',
-               'javascripttest-pagetext-frameworks',
-               'javascripttest-pagetext-skins',
-               'javascripttest-qunit-name',
-               'javascripttest-qunit-intro',
-               'javascripttest-qunit-heading',
-       ),
-       'accesskeys' => array(
-               'accesskey-pt-userpage',
-               'accesskey-pt-anonuserpage',
-               'accesskey-pt-mytalk',
-               'accesskey-pt-anontalk',
-               'accesskey-pt-preferences',
-               'accesskey-pt-watchlist',
-               'accesskey-pt-mycontris',
-               'accesskey-pt-login',
-               'accesskey-pt-logout',
-               'accesskey-ca-talk',
-               'accesskey-ca-edit',
-               'accesskey-ca-addsection',
-               'accesskey-ca-viewsource',
-               'accesskey-ca-history',
-               'accesskey-ca-protect',
-               'accesskey-ca-unprotect',
-               'accesskey-ca-delete',
-               'accesskey-ca-undelete',
-               'accesskey-ca-move',
-               'accesskey-ca-watch',
-               'accesskey-ca-unwatch',
-               'accesskey-search',
-               'accesskey-search-go',
-               'accesskey-search-fulltext',
-               'accesskey-p-logo',
-               'accesskey-n-mainpage',
-               'accesskey-n-mainpage-description',
-               'accesskey-n-portal',
-               'accesskey-n-currentevents',
-               'accesskey-n-recentchanges',
-               'accesskey-n-randompage',
-               'accesskey-n-help',
-               'accesskey-t-whatlinkshere',
-               'accesskey-t-recentchangeslinked',
-               'accesskey-t-random',
-               'accesskey-feed-rss',
-               'accesskey-feed-atom',
-               'accesskey-t-contributions',
-               'accesskey-t-emailuser',
-               'accesskey-t-permalink',
-               'accesskey-t-print',
-               'accesskey-t-upload',
-               'accesskey-t-specialpages',
-               'accesskey-ca-nstab-main',
-               'accesskey-ca-nstab-user',
-               'accesskey-ca-nstab-media',
-               'accesskey-ca-nstab-special',
-               'accesskey-ca-nstab-project',
-               'accesskey-ca-nstab-image',
-               'accesskey-ca-nstab-mediawiki',
-               'accesskey-ca-nstab-template',
-               'accesskey-ca-nstab-help',
-               'accesskey-ca-nstab-category',
-               'accesskey-minoredit',
-               'accesskey-save',
-               'accesskey-preview',
-               'accesskey-diff',
-               'accesskey-compareselectedversions',
-               'accesskey-watch',
-               'accesskey-upload',
-               'accesskey-preferences-save',
-               'accesskey-summary',
-               'accesskey-userrights-set',
-               'accesskey-blockip-block',
-               'accesskey-export',
-               'accesskey-import',
-               'accesskey-watchlistedit-normal-submit',
-               'accesskey-watchlistedit-raw-submit',
-       ),
-       'tooltips' => array(
-               'tooltip-pt-userpage',
-               'tooltip-pt-anonuserpage',
-               'tooltip-pt-mytalk',
-               'tooltip-pt-anontalk',
-               'tooltip-pt-preferences',
-               'tooltip-pt-watchlist',
-               'tooltip-pt-mycontris',
-               'tooltip-pt-login',
-               'tooltip-pt-logout',
-               'tooltip-ca-talk',
-               'tooltip-ca-edit',
-               'tooltip-ca-addsection',
-               'tooltip-ca-viewsource',
-               'tooltip-ca-history',
-               'tooltip-ca-protect',
-               'tooltip-ca-unprotect',
-               'tooltip-ca-delete',
-               'tooltip-ca-undelete',
-               'tooltip-ca-move',
-               'tooltip-ca-watch',
-               'tooltip-ca-unwatch',
-               'tooltip-search',
-               'tooltip-search-go',
-               'tooltip-search-fulltext',
-               'tooltip-p-logo',
-               'tooltip-n-mainpage',
-               'tooltip-n-mainpage-description',
-               'tooltip-n-portal',
-               'tooltip-n-currentevents',
-               'tooltip-n-recentchanges',
-               'tooltip-n-randompage',
-               'tooltip-n-help',
-               'tooltip-t-whatlinkshere',
-               'tooltip-t-recentchangeslinked',
-               'tooltip-t-random',
-               'tooltip-feed-rss',
-               'tooltip-feed-atom',
-               'tooltip-t-contributions',
-               'tooltip-t-emailuser',
-               'tooltip-t-upload',
-               'tooltip-t-specialpages',
-               'tooltip-t-print',
-               'tooltip-t-permalink',
-               'tooltip-ca-nstab-main',
-               'tooltip-ca-nstab-user',
-               'tooltip-ca-nstab-media',
-               'tooltip-ca-nstab-special',
-               'tooltip-ca-nstab-project',
-               'tooltip-ca-nstab-image',
-               'tooltip-ca-nstab-mediawiki',
-               'tooltip-ca-nstab-template',
-               'tooltip-ca-nstab-help',
-               'tooltip-ca-nstab-category',
-               'tooltip-minoredit',
-               'tooltip-save',
-               'tooltip-preview',
-               'tooltip-diff',
-               'tooltip-compareselectedversions',
-               'tooltip-watch',
-               'tooltip-watchlistedit-normal-submit',
-               'tooltip-watchlistedit-raw-submit',
-               'tooltip-recreate',
-               'tooltip-upload',
-               'tooltip-rollback',
-               'tooltip-undo',
-               'tooltip-preferences-save',
-               'tooltip-summary',
-               'interlanguage-link-title',
-               'interlanguage-link-title-langonly',
-       ),
-       'stylesheets' => array(
-               'common.css',
-               'cologneblue.css',
-               'monobook.css',
-               'modern.css',
-               'vector.css',
-               'print.css',
-               'noscript.css',
-               'group-autoconfirmed.css',
-               'group-user.css',
-               'group-bot.css',
-               'group-sysop.css',
-               'group-bureaucrat.css',
-       ),
-       'scripts' => array(
-               'common.js',
-               'cologneblue.js',
-               'monobook.js',
-               'modern.js',
-               'vector.js',
-               'group-autoconfirmed.js',
-               'group-user.js',
-               'group-bot.js',
-               'group-sysop.js',
-               'group-bureaucrat.js',
-       ),
-       'metadata_cc' => array(
-               'notacceptable',
-       ),
-       'attribution' => array(
-               'anonymous',
-               'siteuser',
-               'anonuser',
-               'lastmodifiedatby',
-               'othercontribs',
-               'others',
-               'siteusers',
-               'anonusers',
-               'creditspage',
-               'nocredits',
-       ),
-       'spamprotection' => array(
-               'spamprotectiontitle',
-               'spamprotectiontext',
-               'spamprotectionmatch',
-               'spambot_username',
-               'spam_reverting',
-               'spam_blanking',
-               'spam_deleting',
-               'simpleantispam-label',
-       ),
-       'info' => array(
-               'pageinfo-header',
-               'pageinfo-title',
-               'pageinfo-not-current',
-               'pageinfo-header-basic',
-               'pageinfo-header-edits',
-               'pageinfo-header-restrictions',
-               'pageinfo-header-properties',
-               'pageinfo-display-title',
-               'pageinfo-default-sort',
-               'pageinfo-length',
-               'pageinfo-article-id',
-               'pageinfo-language',
-               'pageinfo-content-model',
-               'pageinfo-robot-policy',
-               'pageinfo-robot-index',
-               'pageinfo-robot-noindex',
-               'pageinfo-views',
-               'pageinfo-watchers',
-               'pageinfo-few-watchers',
-               'pageinfo-redirects-name',
-               'pageinfo-redirects-value',
-               'pageinfo-subpages-name',
-               'pageinfo-subpages-value',
-               'pageinfo-firstuser',
-               'pageinfo-firsttime',
-               'pageinfo-lastuser',
-               'pageinfo-lasttime',
-               'pageinfo-edits',
-               'pageinfo-authors',
-               'pageinfo-recent-edits',
-               'pageinfo-recent-authors',
-               'pageinfo-magic-words',
-               'pageinfo-hidden-categories',
-               'pageinfo-templates',
-               'pageinfo-transclusions',
-               'pageinfo-footer',
-               'pageinfo-toolboxlink',
-               'pageinfo-redirectsto',
-               'pageinfo-redirectsto-info',
-               'pageinfo-contentpage',
-               'pageinfo-contentpage-yes',
-               'pageinfo-protect-cascading',
-               'pageinfo-protect-cascading-yes',
-               'pageinfo-protect-cascading-from',
-               'pageinfo-category-info',
-               'pageinfo-category-pages',
-               'pageinfo-category-subcats',
-               'pageinfo-category-files'
-       ),
-       'skin' => array(
-               'skinname-cologneblue',
-               'skinname-monobook',
-               'skinname-modern',
-               'skinname-vector',
-       ),
-       'patrolling' => array(
-               'markaspatrolleddiff',
-               'markaspatrolledlink',
-               'markaspatrolledtext',
-               'markedaspatrolled',
-               'markedaspatrolledtext',
-               'rcpatroldisabled',
-               'rcpatroldisabledtext',
-               'markedaspatrollederror',
-               'markedaspatrollederrortext',
-               'markedaspatrollederror-noautopatrol',
-               'markedaspatrollednotify',
-               'markedaspatrollederrornotify',
-       ),
-       'patrol-log' => array(
-               'patrol-log-page',
-               'patrol-log-header',
-               'log-show-hide-patrol',
-       ),
-       'imagedeletion' => array(
-               'deletedrevision',
-               'filedeleteerror-short',
-               'filedeleteerror-long',
-               'filedelete-missing',
-               'filedelete-old-unregistered',
-               'filedelete-current-unregistered',
-               'filedelete-archive-read-only',
-       ),
-       'browsediffs' => array(
-               'previousdiff',
-               'nextdiff',
-       ),
-       'media-info' => array(
-               'mediawarning',
-               'imagemaxsize',
-               'thumbsize',
-               'widthheight',
-               'widthheightpage',
-               'file-info',
-               'file-info-size',
-               'file-info-size-pages',
-               'file-nohires',
-               'svg-long-desc',
-               'svg-long-desc-animated',
-               'svg-long-error',
-               'show-big-image',
-               'show-big-image-preview',
-               'show-big-image-other',
-               'show-big-image-size',
-               'file-info-gif-looped',
-               'file-info-gif-frames',
-               'file-info-png-looped',
-               'file-info-png-repeat',
-               'file-info-png-frames',
-               'file-no-thumb-animation',
-               'file-no-thumb-animation-gif',
-       ),
-       'newfiles' => array(
-               'newimages',
-               'imagelisttext',
-               'newimages-summary',
-               'newimages-legend',
-               'newimages-label',
-               'showhidebots',
-               'noimages',
-               'ilsubmit',
-               'bydate',
-               'sp-newimages-showfrom',
-       ),
-       'video-info' => array(
-               'video-dims',
-               'seconds-abbrev',
-               'minutes-abbrev',
-               'hours-abbrev',
-               'days-abbrev',
-               'seconds',
-               'minutes',
-               'hours',
-               'days',
-               'weeks',
-               'months',
-               'years',
-               'ago',
-               'just-now',
-       ),
-       'human-timestamps' => array(
-               'hours-ago',
-               'minutes-ago',
-               'seconds-ago',
-               'monday-at',
-               'tuesday-at',
-               'wednesday-at',
-               'thursday-at',
-               'friday-at',
-               'saturday-at',
-               'sunday-at',
-               'today-at',
-               'yesterday-at',
-       ),
-       'badimagelist' => array(
-               'bad_image_list',
-       ),
-       'variantname-zh' => array(
-               'variantname-zh-hans',
-               'variantname-zh-hant',
-               'variantname-zh-cn',
-               'variantname-zh-tw',
-               'variantname-zh-hk',
-               'variantname-zh-mo',
-               'variantname-zh-sg',
-               'variantname-zh-my',
-               'variantname-zh',
-       ),
-       'variantname-gan' => array(
-               'variantname-gan-hans',
-               'variantname-gan-hant',
-               'variantname-gan',
-       ),
-       'variantname-sr' => array(
-               'variantname-sr-ec',
-               'variantname-sr-el',
-               'variantname-sr',
-       ),
-       'variantname-kk' => array(
-               'variantname-kk-kz',
-               'variantname-kk-tr',
-               'variantname-kk-cn',
-               'variantname-kk-cyrl',
-               'variantname-kk-latn',
-               'variantname-kk-arab',
-               'variantname-kk',
-       ),
-       'variantname-ku' => array(
-               'variantname-ku-arab',
-               'variantname-ku-latn',
-               'variantname-ku',
-       ),
-       'variantname-tg' => array(
-               'variantname-tg-cyrl',
-               'variantname-tg-latn',
-               'variantname-tg',
-       ),
-       'variantname-iu' => array(
-               'variantname-ike-cans',
-               'variantname-ike-latn',
-               'variantname-iu',
-       ),
-       'variantname-shi' => array(
-               'variantname-shi-tfng',
-               'variantname-shi-latn',
-               'variantname-shi',
-       ),
-       'metadata' => array(
-               'metadata',
-               'metadata-help',
-               'metadata-expand',
-               'metadata-collapse',
-               'metadata-fields',
-               'metadata-langitem',
-               'metadata-langitem-default',
-       ),
-       'exif' => array(
-               'exif-imagewidth',
-               'exif-imagelength',
-               'exif-bitspersample',
-               'exif-compression',
-               'exif-photometricinterpretation',
-               'exif-orientation',
-               'exif-samplesperpixel',
-               'exif-planarconfiguration',
-               'exif-ycbcrsubsampling',
-               'exif-ycbcrpositioning',
-               'exif-xresolution',
-               'exif-yresolution',
-               'exif-resolutionunit',
-               'exif-stripoffsets',
-               'exif-rowsperstrip',
-               'exif-stripbytecounts',
-               'exif-jpeginterchangeformat',
-               'exif-jpeginterchangeformatlength',
-               'exif-whitepoint',
-               'exif-primarychromaticities',
-               'exif-ycbcrcoefficients',
-               'exif-referenceblackwhite',
-               'exif-datetime',
-               'exif-imagedescription',
-               'exif-make',
-               'exif-model',
-               'exif-software',
-               'exif-artist',
-               'exif-copyright',
-               'exif-exifversion',
-               'exif-flashpixversion',
-               'exif-colorspace',
-               'exif-componentsconfiguration',
-               'exif-compressedbitsperpixel',
-               'exif-pixelydimension',
-               'exif-pixelxdimension',
-               'exif-usercomment',
-               'exif-relatedsoundfile',
-               'exif-datetimeoriginal',
-               'exif-datetimedigitized',
-               'exif-subsectime',
-               'exif-subsectimeoriginal',
-               'exif-subsectimedigitized',
-               'exif-exposuretime',
-               'exif-exposuretime-format',
-               'exif-fnumber',
-               'exif-fnumber-format',
-               'exif-exposureprogram',
-               'exif-spectralsensitivity',
-               'exif-isospeedratings',
-               'exif-shutterspeedvalue',
-               'exif-aperturevalue',
-               'exif-brightnessvalue',
-               'exif-exposurebiasvalue',
-               'exif-maxaperturevalue',
-               'exif-subjectdistance',
-               'exif-meteringmode',
-               'exif-lightsource',
-               'exif-flash',
-               'exif-focallength',
-               'exif-focallength-format',
-               'exif-subjectarea',
-               'exif-flashenergy',
-               'exif-focalplanexresolution',
-               'exif-focalplaneyresolution',
-               'exif-focalplaneresolutionunit',
-               'exif-subjectlocation',
-               'exif-exposureindex',
-               'exif-sensingmethod',
-               'exif-filesource',
-               'exif-scenetype',
-               'exif-customrendered',
-               'exif-exposuremode',
-               'exif-whitebalance',
-               'exif-digitalzoomratio',
-               'exif-focallengthin35mmfilm',
-               'exif-scenecapturetype',
-               'exif-gaincontrol',
-               'exif-contrast',
-               'exif-saturation',
-               'exif-sharpness',
-               'exif-devicesettingdescription',
-               'exif-subjectdistancerange',
-               'exif-imageuniqueid',
-               'exif-gpsversionid',
-               'exif-gpslatituderef',
-               'exif-gpslatitude',
-               'exif-gpslongituderef',
-               'exif-gpslongitude',
-               'exif-gpsaltituderef',
-               'exif-gpsaltitude',
-               'exif-gpstimestamp',
-               'exif-gpssatellites',
-               'exif-gpsstatus',
-               'exif-gpsmeasuremode',
-               'exif-gpsdop',
-               'exif-gpsspeedref',
-               'exif-gpsspeed',
-               'exif-gpstrackref',
-               'exif-gpstrack',
-               'exif-gpsimgdirectionref',
-               'exif-gpsimgdirection',
-               'exif-gpsmapdatum',
-               'exif-gpsdestlatituderef',
-               'exif-gpsdestlatitude',
-               'exif-gpsdestlongituderef',
-               'exif-gpsdestlongitude',
-               'exif-gpsdestbearingref',
-               'exif-gpsdestbearing',
-               'exif-gpsdestdistanceref',
-               'exif-gpsdestdistance',
-               'exif-gpsprocessingmethod',
-               'exif-gpsareainformation',
-               'exif-gpsdatestamp',
-               'exif-gpsdifferential',
-               'exif-coordinate-format',
-               'exif-jpegfilecomment',
-               'exif-keywords',
-               'exif-worldregioncreated',
-               'exif-countrycreated',
-               'exif-countrycodecreated',
-               'exif-provinceorstatecreated',
-               'exif-citycreated',
-               'exif-sublocationcreated',
-               'exif-worldregiondest',
-               'exif-countrydest',
-               'exif-countrycodedest',
-               'exif-provinceorstatedest',
-               'exif-citydest',
-               'exif-sublocationdest',
-               'exif-objectname',
-               'exif-specialinstructions',
-               'exif-headline',
-               'exif-credit',
-               'exif-source',
-               'exif-editstatus',
-               'exif-urgency',
-               'exif-fixtureidentifier',
-               'exif-locationdest',
-               'exif-locationdestcode',
-               'exif-objectcycle',
-               'exif-contact',
-               'exif-writer',
-               'exif-languagecode',
-               'exif-iimversion',
-               'exif-iimcategory',
-               'exif-iimsupplementalcategory',
-               'exif-datetimeexpires',
-               'exif-datetimereleased',
-               'exif-originaltransmissionref',
-               'exif-identifier',
-               'exif-lens',
-               'exif-serialnumber',
-               'exif-cameraownername',
-               'exif-label',
-               'exif-datetimemetadata',
-               'exif-nickname',
-               'exif-rating',
-               'exif-rightscertificate',
-               'exif-copyrighted',
-               'exif-copyrightowner',
-               'exif-usageterms',
-               'exif-webstatement',
-               'exif-originaldocumentid',
-               'exif-licenseurl',
-               'exif-morepermissionsurl',
-               'exif-attributionurl',
-               'exif-preferredattributionname',
-               'exif-pngfilecomment',
-               'exif-disclaimer',
-               'exif-contentwarning',
-               'exif-giffilecomment',
-               'exif-intellectualgenre',
-               'exif-subjectnewscode',
-               'exif-scenecode',
-               'exif-event',
-               'exif-organisationinimage',
-               'exif-personinimage',
-               'exif-originalimageheight',
-               'exif-originalimagewidth',
-       ),
-       'exif-values' => array(
-               'exif-make-value',
-               'exif-model-value',
-               'exif-software-value',
-               'exif-software-version-value',
-               'exif-contact-value',
-               'exif-subjectnewscode-value',
-       ),
-       'exif-compression' => array(
-               'exif-compression-1',
-               'exif-compression-2',
-               'exif-compression-3',
-               'exif-compression-4',
-               'exif-compression-5',
-               'exif-compression-6',
-               'exif-compression-7',
-               'exif-compression-8',
-               'exif-compression-32773',
-               'exif-compression-32946',
-               'exif-compression-34712',
-       ),
-       'exif-copyrighted' => array(
-               'exif-copyrighted-true',
-               'exif-copyrighted-false',
-       ),
-       'exif-photometricinterpretation' => array(
-               'exif-photometricinterpretation-2',
-               'exif-photometricinterpretation-6',
-       ),
-       'exif-unknowndate' => array(
-               'exif-unknowndate',
-       ),
-       'exif-orientation' => array(
-               'exif-orientation-1',
-               'exif-orientation-2',
-               'exif-orientation-3',
-               'exif-orientation-4',
-               'exif-orientation-5',
-               'exif-orientation-6',
-               'exif-orientation-7',
-               'exif-orientation-8',
-       ),
-       'exif-planarconfiguration' => array(
-               'exif-planarconfiguration-1',
-               'exif-planarconfiguration-2',
-       ),
-       'exif-xyresolution' => array(
-               'exif-xyresolution-i',
-               'exif-xyresolution-c',
-       ),
-       'exif-colorspace' => array(
-               'exif-colorspace-1',
-               'exif-colorspace-65535',
-       ),
-       'exif-componentsconfiguration' => array(
-               'exif-componentsconfiguration-0',
-               'exif-componentsconfiguration-1',
-               'exif-componentsconfiguration-2',
-               'exif-componentsconfiguration-3',
-               'exif-componentsconfiguration-4',
-               'exif-componentsconfiguration-5',
-               'exif-componentsconfiguration-6',
-       ),
-       'exif-exposureprogram' => array(
-               'exif-exposureprogram-0',
-               'exif-exposureprogram-1',
-               'exif-exposureprogram-2',
-               'exif-exposureprogram-3',
-               'exif-exposureprogram-4',
-               'exif-exposureprogram-5',
-               'exif-exposureprogram-6',
-               'exif-exposureprogram-7',
-               'exif-exposureprogram-8',
-       ),
-       'exif-subjectdistance-value' => array(
-               'exif-subjectdistance-value',
-       ),
-       'exif-meteringmode' => array(
-               'exif-meteringmode-0',
-               'exif-meteringmode-1',
-               'exif-meteringmode-2',
-               'exif-meteringmode-3',
-               'exif-meteringmode-4',
-               'exif-meteringmode-5',
-               'exif-meteringmode-6',
-               'exif-meteringmode-255',
-       ),
-       'exif-lightsource' => array(
-               'exif-lightsource-0',
-               'exif-lightsource-1',
-               'exif-lightsource-2',
-               'exif-lightsource-3',
-               'exif-lightsource-4',
-               'exif-lightsource-9',
-               'exif-lightsource-10',
-               'exif-lightsource-11',
-               'exif-lightsource-12',
-               'exif-lightsource-13',
-               'exif-lightsource-14',
-               'exif-lightsource-15',
-               'exif-lightsource-17',
-               'exif-lightsource-18',
-               'exif-lightsource-19',
-               'exif-lightsource-20',
-               'exif-lightsource-21',
-               'exif-lightsource-22',
-               'exif-lightsource-23',
-               'exif-lightsource-24',
-               'exif-lightsource-255',
-       ),
-       'exif-flash' => array(
-               'exif-flash-fired-0',
-               'exif-flash-fired-1',
-               'exif-flash-return-0',
-               'exif-flash-return-2',
-               'exif-flash-return-3',
-               'exif-flash-mode-1',
-               'exif-flash-mode-2',
-               'exif-flash-mode-3',
-               'exif-flash-function-1',
-               'exif-flash-redeye-1',
-       ),
-       'exif-focalplaneresolutionunit' => array(
-               'exif-focalplaneresolutionunit-2',
-       ),
-       'exif-sensingmethod' => array(
-               'exif-sensingmethod-1',
-               'exif-sensingmethod-2',
-               'exif-sensingmethod-3',
-               'exif-sensingmethod-4',
-               'exif-sensingmethod-5',
-               'exif-sensingmethod-7',
-               'exif-sensingmethod-8',
-       ),
-       'exif-filesource' => array(
-               'exif-filesource-3',
-       ),
-       'exif-scenetype' => array(
-               'exif-scenetype-1',
-       ),
-       'exif-customrendered' => array(
-               'exif-customrendered-0',
-               'exif-customrendered-1',
-       ),
-       'exif-exposuremode' => array(
-               'exif-exposuremode-0',
-               'exif-exposuremode-1',
-               'exif-exposuremode-2',
-       ),
-       'exif-whitebalance' => array(
-               'exif-whitebalance-0',
-               'exif-whitebalance-1',
-       ),
-       'exif-scenecapturetype' => array(
-               'exif-scenecapturetype-0',
-               'exif-scenecapturetype-1',
-               'exif-scenecapturetype-2',
-               'exif-scenecapturetype-3',
-       ),
-       'exif-gaincontrol' => array(
-               'exif-gaincontrol-0',
-               'exif-gaincontrol-1',
-               'exif-gaincontrol-2',
-               'exif-gaincontrol-3',
-               'exif-gaincontrol-4',
-       ),
-       'exif-contrast' => array(
-               'exif-contrast-0',
-               'exif-contrast-1',
-               'exif-contrast-2',
-       ),
-       'exif-saturation' => array(
-               'exif-saturation-0',
-               'exif-saturation-1',
-               'exif-saturation-2',
-       ),
-       'exif-sharpness' => array(
-               'exif-sharpness-0',
-               'exif-sharpness-1',
-               'exif-sharpness-2',
-       ),
-       'exif-subjectdistancerange' => array(
-               'exif-subjectdistancerange-0',
-               'exif-subjectdistancerange-1',
-               'exif-subjectdistancerange-2',
-               'exif-subjectdistancerange-3',
-       ),
-       'exif-gpslatitude' => array(
-               'exif-gpslatitude-n',
-               'exif-gpslatitude-s',
-       ),
-       'exif-gpslongitude' => array(
-               'exif-gpslongitude-e',
-               'exif-gpslongitude-w',
-       ),
-       'exif-altituderef' => array(
-               'exif-gpsaltitude-above-sealevel',
-               'exif-gpsaltitude-below-sealevel',
-       ),
-       'exif-gpsstatus' => array(
-               'exif-gpsstatus-a',
-               'exif-gpsstatus-v',
-       ),
-       'exif-gpsmeasuremode' => array(
-               'exif-gpsmeasuremode-2',
-               'exif-gpsmeasuremode-3',
-       ),
-       'exif-gpsspeed' => array(
-               'exif-gpsspeed-k',
-               'exif-gpsspeed-m',
-               'exif-gpsspeed-n',
-       ),
-       'exif-gpsdestdistanceref' => array(
-               'exif-gpsdestdistance-k',
-               'exif-gpsdestdistance-m',
-               'exif-gpsdestdistance-n',
-       ),
-       'exif-gdop' => array(
-               'exif-gpsdop-excellent',
-               'exif-gpsdop-good',
-               'exif-gpsdop-moderate',
-               'exif-gpsdop-fair',
-               'exif-gpsdop-poor',
-       ),
-       'exif-objectcycle' => array(
-               'exif-objectcycle-a',
-               'exif-objectcycle-p',
-               'exif-objectcycle-b',
-       ),
-       'exif-gpsdirection' => array(
-               'exif-gpsdirection-t',
-               'exif-gpsdirection-m',
-       ),
-       'exif-ycbcrpositioning' => array(
-               'exif-ycbcrpositioning-1',
-               'exif-ycbcrpositioning-2',
-       ),
-       'exif-dc' => array(
-               'exif-dc-contributor',
-               'exif-dc-coverage',
-               'exif-dc-date',
-               'exif-dc-publisher',
-               'exif-dc-relation',
-               'exif-dc-rights',
-               'exif-dc-source',
-               'exif-dc-type',
-       ),
-       'exif-rating' => array(
-               'exif-rating-rejected',
-       ),
-       'exif-isospeedratings' => array(
-               'exif-isospeedratings-overflow',
-       ),
-       'exif-maxaperturevalue' => array(
-               'exif-maxaperturevalue-value',
-       ),
-       'exif-iimcategory' => array(
-               'exif-iimcategory-ace',
-               'exif-iimcategory-clj',
-               'exif-iimcategory-dis',
-               'exif-iimcategory-fin',
-               'exif-iimcategory-edu',
-               'exif-iimcategory-evn',
-               'exif-iimcategory-hth',
-               'exif-iimcategory-hum',
-               'exif-iimcategory-lab',
-               'exif-iimcategory-lif',
-               'exif-iimcategory-pol',
-               'exif-iimcategory-rel',
-               'exif-iimcategory-sci',
-               'exif-iimcategory-soi',
-               'exif-iimcategory-spo',
-               'exif-iimcategory-war',
-               'exif-iimcategory-wea',
-       ),
-       'exif-urgency' => array(
-               'exif-urgency-normal',
-               'exif-urgency-low',
-               'exif-urgency-high',
-               'exif-urgency-other',
-       ),
-       'all' => array(
-               'watchlistall2',
-               'namespacesall',
-               'monthsall',
-       ),
-       'confirmemail' => array(
-               'confirmemail',
-               'confirmemail_noemail',
-               'confirmemail_text',
-               'confirmemail_pending',
-               'confirmemail_send',
-               'confirmemail_sent',
-               'confirmemail_oncreate',
-               'confirmemail_sendfailed',
-               'confirmemail_invalid',
-               'confirmemail_needlogin',
-               'confirmemail_success',
-               'confirmemail_loggedin',
-               'confirmemail_subject',
-               'confirmemail_body',
-               'confirmemail_body_changed',
-               'confirmemail_body_set',
-               'confirmemail_invalidated',
-               'invalidateemail',
-       ),
-       'scarytransclusion' => array(
-               'scarytranscludedisabled',
-               'scarytranscludefailed',
-               'scarytranscludefailed-httpstatus',
-               'scarytranscludetoolong',
-       ),
-       'deleteconflict' => array(
-               'deletedwhileediting',
-               'confirmrecreate',
-               'confirmrecreate-noreason',
-               'recreate',
-       ),
-       'unit-pixel' => array(
-               'unit-pixel',
-       ),
-       'purge' => array(
-               'confirm_purge_button',
-               'confirm-purge-top',
-               'confirm-purge-bottom',
-       ),
-       'watch-unwatch' => array(
-               'confirm-watch-button',
-               'confirm-watch-top',
-               'confirm-unwatch-button',
-               'confirm-unwatch-top',
-       ),
-       'separators' => array(
-               'semicolon-separator',
-               'comma-separator',
-               'colon-separator',
-               'autocomment-prefix',
-               'pipe-separator',
-               'word-separator',
-               'ellipsis',
-               'percent',
-               'parentheses',
-               'brackets',
-               'quotation-marks',
-       ),
-       'imgmulti' => array(
-               'imgmultipageprev',
-               'imgmultipagenext',
-               'imgmultigo',
-               'imgmultigoto',
-       ),
-       'img-lang' => array(
-               'img-lang-opt',
-               'img-lang-default',
-               'img-lang-info',
-               'img-lang-go',
-       ),
-       'tablepager' => array(
-               'ascending_abbrev',
-               'descending_abbrev',
-               'table_pager_next',
-               'table_pager_prev',
-               'table_pager_first',
-               'table_pager_last',
-               'table_pager_limit',
-               'table_pager_limit_label',
-               'table_pager_limit_submit',
-               'table_pager_empty',
-       ),
-       'autosumm' => array(
-               'autosumm-blank',
-               'autosumm-replace',
-               'autoredircomment',
-               'autosumm-new',
-       ),
-       'autoblock_whitelist' => array(
-               'autoblock_whitelist',
-       ),
-       'sizeunits' => array(
-               'size-bytes',
-               'size-kilobytes',
-               'size-megabytes',
-               'size-gigabytes',
-               'size-terabytes',
-               'size-petabytes',
-               'size-exabytes',
-               'size-zetabytes',
-               'size-yottabytes',
-       ),
-       'bitrateunits' => array(
-               'bitrate-bits',
-               'bitrate-kilobits',
-               'bitrate-megabits',
-               'bitrate-gigabits',
-               'bitrate-terabits',
-               'bitrate-petabits',
-               'bitrate-exabits',
-               'bitrate-zetabits',
-               'bitrate-yottabits',
-       ),
-       'livepreview' => array(
-               'livepreview-loading',
-               'livepreview-ready',
-               'livepreview-failed',
-               'livepreview-error',
-       ),
-       'lagwarning' => array(
-               'lag-warn-normal',
-               'lag-warn-high',
-       ),
-       'watchlisteditor' => array(
-               'editwatchlist-summary',
-               'watchlistedit-numitems',
-               'watchlistedit-noitems',
-               'watchlistedit-normal-title',
-               'watchlistedit-normal-legend',
-               'watchlistedit-normal-explain',
-               'watchlistedit-normal-submit',
-               'watchlistedit-normal-done',
-               'watchlistedit-raw-title',
-               'watchlistedit-raw-legend',
-               'watchlistedit-raw-explain',
-               'watchlistedit-raw-titles',
-               'watchlistedit-raw-submit',
-               'watchlistedit-raw-done',
-               'watchlistedit-raw-added',
-               'watchlistedit-raw-removed',
-       ),
-       'watchlisttools' => array(
-               'watchlisttools-view',
-               'watchlisttools-edit',
-               'watchlisttools-raw',
-       ),
-       'iranian-dates' => array(
-               'iranian-calendar-m1',
-               'iranian-calendar-m2',
-               'iranian-calendar-m3',
-               'iranian-calendar-m4',
-               'iranian-calendar-m5',
-               'iranian-calendar-m6',
-               'iranian-calendar-m7',
-               'iranian-calendar-m8',
-               'iranian-calendar-m9',
-               'iranian-calendar-m10',
-               'iranian-calendar-m11',
-               'iranian-calendar-m12',
-       ),
-       'hijri-dates' => array(
-               'hijri-calendar-m1',
-               'hijri-calendar-m2',
-               'hijri-calendar-m3',
-               'hijri-calendar-m4',
-               'hijri-calendar-m5',
-               'hijri-calendar-m6',
-               'hijri-calendar-m7',
-               'hijri-calendar-m8',
-               'hijri-calendar-m9',
-               'hijri-calendar-m10',
-               'hijri-calendar-m11',
-               'hijri-calendar-m12',
-       ),
-       'hebrew-dates' => array(
-               'hebrew-calendar-m1',
-               'hebrew-calendar-m2',
-               'hebrew-calendar-m3',
-               'hebrew-calendar-m4',
-               'hebrew-calendar-m5',
-               'hebrew-calendar-m6',
-               'hebrew-calendar-m6a',
-               'hebrew-calendar-m6b',
-               'hebrew-calendar-m7',
-               'hebrew-calendar-m8',
-               'hebrew-calendar-m9',
-               'hebrew-calendar-m10',
-               'hebrew-calendar-m11',
-               'hebrew-calendar-m12',
-               'hebrew-calendar-m1-gen',
-               'hebrew-calendar-m2-gen',
-               'hebrew-calendar-m3-gen',
-               'hebrew-calendar-m4-gen',
-               'hebrew-calendar-m5-gen',
-               'hebrew-calendar-m6-gen',
-               'hebrew-calendar-m6a-gen',
-               'hebrew-calendar-m6b-gen',
-               'hebrew-calendar-m7-gen',
-               'hebrew-calendar-m8-gen',
-               'hebrew-calendar-m9-gen',
-               'hebrew-calendar-m10-gen',
-               'hebrew-calendar-m11-gen',
-               'hebrew-calendar-m12-gen',
-       ),
-       'signatures' => array(
-               'signature',
-               'signature-anon',
-               'timezone-utc',
-       ),
-       'CoreParserFunctions' => array(
-               'unknown_extension_tag',
-               'duplicate-defaultsort',
-       ),
-       'version' => array(
-               'version',
-               'version-summary',
-               'version-extensions',
-               'version-specialpages',
-               'version-parserhooks',
-               'version-variables',
-               'version-antispam',
-               'version-skins',
-               'version-api',
-               'version-other',
-               'version-mediahandlers',
-               'version-hooks',
-               'version-parser-extensiontags',
-               'version-parser-function-hooks',
-               'version-hook-name',
-               'version-hook-subscribedby',
-               'version-version',
-               'version-svn-revision',
-               'version-license',
-               'version-ext-license',
-               'version-ext-colheader-name',
-               'version-ext-colheader-version',
-               'version-ext-colheader-license',
-               'version-ext-colheader-description',
-               'version-ext-colheader-credits',
-               'version-license-title',
-               'version-license-not-found',
-               'version-credits-title',
-               'version-credits-not-found',
-               'version-poweredby-credits',
-               'version-poweredby-others',
-               'version-poweredby-translators',
-               'version-credits-summary',
-               'version-license-info',
-               'version-software',
-               'version-software-product',
-               'version-software-version',
-               'version-db-mysql-url',
-               'version-db-mariadb-url',
-               'version-db-percona-url',
-               'version-db-postgres-url',
-               'version-db-oracle-url',
-               'version-db-sqlite-url',
-               'version-db-mssql-url',
-               'version-entrypoints',
-               'version-entrypoints-header-entrypoint',
-               'version-entrypoints-header-url',
-               'version-entrypoints-articlepath',
-               'version-entrypoints-scriptpath',
-               'version-entrypoints-index-php',
-               'version-entrypoints-api-php',
-               'version-entrypoints-load-php',
-       ),
-       'redirect' => array(
-               'redirect',
-               'redirect-legend',
-               'redirect-text',
-               'redirect-summary',
-               'redirect-submit',
-               'redirect-lookup',
-               'redirect-value',
-               'redirect-user',
-               'redirect-page',
-               'redirect-revision',
-               'redirect-file',
-               'redirect-not-exists',
-       ),
-       'fileduplicatesearch' => array(
-               'fileduplicatesearch',
-               'fileduplicatesearch-summary',
-               'fileduplicatesearch-legend',
-               'fileduplicatesearch-filename',
-               'fileduplicatesearch-submit',
-               'fileduplicatesearch-info',
-               'fileduplicatesearch-result-1',
-               'fileduplicatesearch-result-n',
-               'fileduplicatesearch-noresults',
-       ),
-       'special-specialpages' => array(
-               'specialpages',
-               'specialpages-summary',
-               'specialpages-note-top',
-               'specialpages-note',
-               'specialpages-group-maintenance',
-               'specialpages-group-other',
-               'specialpages-group-login',
-               'specialpages-group-changes',
-               'specialpages-group-media',
-               'specialpages-group-users',
-               'specialpages-group-highuse',
-               'specialpages-group-pages',
-               'specialpages-group-pagetools',
-               'specialpages-group-wiki',
-               'specialpages-group-redirects',
-               'specialpages-group-spam',
-       ),
-       'special-blank' => array(
-               'blankpage',
-               'intentionallyblankpage',
-       ),
-       'external_images' => array(
-               'external_image_whitelist',
-       ),
-       'special-tags' => array(
-               'tags',
-               'tags-summary',
-               'tag-filter',
-               'tag-filter-submit',
-               'tag-list-wrapper',
-               'tags-title',
-               'tags-intro',
-               'tags-tag',
-               'tags-display-header',
-               'tags-description-header',
-               'tags-active-header',
-               'tags-hitcount-header',
-               'tags-active-yes',
-               'tags-active-no',
-               'tags-edit',
-               'tags-hitcount',
-       ),
-       'comparepages' => array(
-               'comparepages',
-               'comparepages-summary',
-               'compare-page1',
-               'compare-page2',
-               'compare-rev1',
-               'compare-rev2',
-               'compare-submit',
-               'compare-invalid-title',
-               'compare-title-not-exists',
-               'compare-revision-not-exists',
-       ),
-       'db-error-messages' => array(
-               'dberr-header',
-               'dberr-problems',
-               'dberr-again',
-               'dberr-info',
-               'dberr-info-hidden',
-               'dberr-usegoogle',
-               'dberr-outofdate',
-               'dberr-cachederror',
-       ),
-       'html-forms' => array(
-               'htmlform-invalid-input',
-               'htmlform-select-badoption',
-               'htmlform-int-invalid',
-               'htmlform-float-invalid',
-               'htmlform-int-toolow',
-               'htmlform-int-toohigh',
-               'htmlform-required',
-               'htmlform-submit',
-               'htmlform-reset',
-               'htmlform-selectorother-other',
-               'htmlform-no',
-               'htmlform-yes',
-               'htmlform-chosen-placeholder',
-               'htmlform-cloner-create',
-               'htmlform-cloner-delete',
-               'htmlform-cloner-required',
-       ),
-       'sqlite' => array(
-               'sqlite-has-fts',
-               'sqlite-no-fts',
-       ),
-       'logging' => array(
-               'logentry-delete-delete',
-               'logentry-delete-restore',
-               'logentry-delete-event',
-               'logentry-delete-revision',
-               'logentry-delete-event-legacy',
-               'logentry-delete-revision-legacy',
-               'logentry-suppress-delete',
-               'logentry-suppress-event',
-               'logentry-suppress-revision',
-               'logentry-suppress-event-legacy',
-               'logentry-suppress-revision-legacy',
-               'revdelete-content-hid',
-               'revdelete-summary-hid',
-               'revdelete-uname-hid',
-               'revdelete-content-unhid',
-               'revdelete-summary-unhid',
-               'revdelete-uname-unhid',
-               'revdelete-restricted',
-               'revdelete-unrestricted',
-               'logentry-move-move',
-               'logentry-move-move-noredirect',
-               'logentry-move-move_redir',
-               'logentry-move-move_redir-noredirect',
-               'logentry-patrol-patrol',
-               'logentry-patrol-patrol-auto',
-               'logentry-newusers-newusers',
-               'logentry-newusers-create',
-               'logentry-newusers-create2',
-               'logentry-newusers-byemail',
-               'logentry-newusers-autocreate',
-               'logentry-rights-rights',
-               'logentry-rights-rights-legacy',
-               'logentry-rights-autopromote',
-               'rightsnone',
-       ),
-       'logging-irc' => array(
-               'revdelete-logentry',
-               'logdelete-logentry',
-               'revdelete-content',
-               'revdelete-summary',
-               'revdelete-uname',
-               'revdelete-hid',
-               'revdelete-unhid',
-               'revdelete-log-message',
-               'logdelete-log-message',
-               'deletedarticle',
-               'suppressedarticle',
-               'undeletedarticle',
-               'patrol-log-line',
-               'patrol-log-auto',
-               'patrol-log-diff',
-               '1movedto2',
-               '1movedto2_redir',
-               'move-redirect-suppressed',
-               'newuserlog-create-entry',
-               'newuserlog-create2-entry',
-               'newuserlog-autocreate-entry',
-               // 'uploadedimage',
-               // 'overwroteimage',
-               'rightslogentry',
-               'rightslogentry-autopromote',
-       ),
-       'feedback' => array(
-               'feedback-bugornote',
-               'feedback-subject',
-               'feedback-message',
-               'feedback-cancel',
-               'feedback-submit',
-               'feedback-adding',
-               'feedback-error1',
-               'feedback-error2',
-               'feedback-error3',
-               'feedback-thanks',
-               'feedback-close',
-               'feedback-bugcheck',
-               'feedback-bugnew',
-       ),
-       'searchsuggestions' => array(
-               'searchsuggest-search',
-               'searchsuggest-containing',
-       ),
-       'apierrors' => array(
-               'api-error-badaccess-groups',
-               'api-error-badtoken',
-               'api-error-copyuploaddisabled',
-               'api-error-duplicate',
-               'api-error-duplicate-archive',
-               'api-error-duplicate-archive-popup-title',
-               'api-error-duplicate-popup-title',
-               'api-error-empty-file',
-               'api-error-emptypage',
-               'api-error-fetchfileerror',
-               'api-error-fileexists-forbidden',
-               'api-error-fileexists-shared-forbidden',
-               'api-error-file-too-large',
-               'api-error-filename-tooshort',
-               'api-error-filetype-banned',
-               'api-error-filetype-banned-type',
-               'api-error-filetype-missing',
-               'api-error-hookaborted',
-               'api-error-http',
-               'api-error-illegal-filename',
-               'api-error-internal-error',
-               'api-error-invalid-file-key',
-               'api-error-missingparam',
-               'api-error-missingresult',
-               'api-error-mustbeloggedin',
-               'api-error-mustbeposted',
-               'api-error-noimageinfo',
-               'api-error-nomodule',
-               'api-error-ok-but-empty',
-               'api-error-overwrite',
-               'api-error-stashfailed',
-               'api-error-publishfailed',
-               'api-error-stasherror',
-               'api-error-timeout',
-               'api-error-unclassified',
-               'api-error-unknown-code',
-               'api-error-unknown-error',
-               'api-error-unknown-warning',
-               'api-error-unknownerror',
-               'api-error-uploaddisabled',
-               'api-error-verification-error',
-       ),
-       'duration' => array(
-               'duration-seconds',
-               'duration-minutes',
-               'duration-hours',
-               'duration-days',
-               'duration-weeks',
-               'duration-years',
-               'duration-decades',
-               'duration-centuries',
-               'duration-millennia'
-       ),
-       'rotation' => array(
-               'rotate-comment',
-       ),
-       'limitreport' => array(
-               'limitreport-title',
-               'limitreport-cputime',
-               'limitreport-cputime-value',
-               'limitreport-walltime',
-               'limitreport-walltime-value',
-               'limitreport-ppvisitednodes',
-               'limitreport-ppvisitednodes-value',
-               'limitreport-ppgeneratednodes',
-               'limitreport-ppgeneratednodes-value',
-               'limitreport-postexpandincludesize',
-               'limitreport-postexpandincludesize-value',
-               'limitreport-templateargumentsize',
-               'limitreport-templateargumentsize-value',
-               'limitreport-expansiondepth',
-               'limitreport-expansiondepth-value',
-               'limitreport-expensivefunctioncount',
-               'limitreport-expensivefunctioncount-value',
-       ),
-       'expandtemplates' => array(
-               'expandtemplates',
-               'expand_templates_intro',
-               'expand_templates_title',
-               'expand_templates_input',
-               'expand_templates_output',
-               'expand_templates_xml_output',
-               'expand_templates_html_output',
-               'expand_templates_ok',
-               'expand_templates_remove_comments',
-               'expand_templates_remove_nowiki',
-               'expand_templates_generate_xml',
-               'expand_templates_generate_rawhtml',
-               'expand_templates_preview',
-       ),
-       'trackingcategories' => array(
-               'trackingcategories',
-               'trackingcategories-summary',
-               'trackingcategories-msg',
-               'trackingcategories-name',
-               'trackingcategories-desc',
-               'noindex-category-desc',
-               'index-category-desc',
-               'post-expand-template-inclusion-category-desc',
-               'post-expand-template-argument-category-desc',
-               'expensive-parserfunction-category-desc',
-               'broken-file-category-desc',
-               'hidden-category-category-desc',
-               'trackingcategories-nodesc',
-               'trackcategories-disabled',
-       ),
-);
-
-/** Comments for each block */
-$wgBlockComments = array(
-       'sidebar' => "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 do not depend on this behavior for
-future releases. Also note that since each list value is wrapped in a unique
-(X)HTML id it should only appear once and include characters that are legal
-(X)HTML id names.",
-       'toggles' => 'User preference toggles',
-       'underline' => '',
-       'editfont' => 'Font style option in Special:Preferences',
-       'dates' => 'Dates',
-       'categorypages' => 'Categories related messages',
-       'mainpage' => '',
-       'miscellaneous1' => '',
-       'cologneblue' => 'Cologne Blue skin',
-       'vector' => 'Vector skin',
-       'miscellaneous2' => '',
-       'links' => 'All link text and link target definitions of links into project namespace ' .
-               'that get used by other message strings, with the exception of user group pages (see grouppage).',
-       'badaccess' => '',
-       'versionrequired' => '',
-       'miscellaneous3' => '',
-       'nstab' => "Short words for each namespace, by default used in the namespace tab in monobook",
-       'main' => 'Main script and global functions',
-       'errors' => 'General errors',
-       'virus' => 'Virus scanner',
-       'login' => 'Login and logout pages',
-       'mail' => 'Email sending',
-       'passwordstrength' => 'JavaScript password checks',
-       'resetpass' => 'Change password dialog',
-       'passwordreset' => 'Special:PasswordReset',
-       'changeemail' => 'Special:ChangeEmail',
-       'resettokens' => 'Special:ResetTokens',
-       'toolbar' => 'Edit page toolbar',
-       'edit' => 'Edit pages',
-       'parserwarnings' => 'Parser/template warnings',
-       'contentmodels' => 'Content models',
-       'undo' => '"Undo" feature',
-       'cantcreateaccount' => 'Account creation failure',
-       'history' => 'History pages',
-       'history-feed' => 'Revision feed',
-       'revdelete' => 'Revision deletion',
-       'suppression' => 'Suppression log',
-       'mergehistory' => 'History merging',
-       'mergelog' => 'Merge log',
-       'diffs' => 'Diffs',
-       'search' => 'Search results',
-       'opensearch' => 'OpenSearch description',
-       'preferences' => 'Preferences page',
-       'preferences-email' => 'User preference: email validation using jQuery',
-       'userrights' => 'User rights',
-       'group' => 'Groups',
-       'group-member' => '',
-       'grouppage' => '',
-       'right' => 'Rights',
-       'action' => 'Associated actions - in the sentence "You do not have permission to X"',
-       'rightslog' => 'User rights log',
-       'recentchanges' => 'Recent changes',
-       'recentchangeslinked' => 'Recent changes linked',
-       'upload' => 'Upload',
-       'zip' => 'ZipDirectoryReader',
-       'upload-errors' => '',
-       'filebackend-errors' => 'File backend',
-       'filejournal-errors' => 'File journal errors',
-       'lockmanager-errors' => 'Lock manager',
-       'uploadstash' => 'Special:UploadStash',
-       'img-auth' => 'img_auth script messages',
-       'http-errors' => 'HTTP errors',
-       'upload-curl-errors' => 'Some likely curl errors. More could be added from ' .
-               '<http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
-       'licenses' => '',
-       'filelist' => 'Special:ListFiles',
-       'filedescription' => 'File description page',
-       'filerevert' => 'File reversion',
-       'filedelete' => 'File deletion',
-       'mimesearch' => 'MIME search',
-       'unwatchedpages' => 'Unwatched pages',
-       'listduplicatedfiles' => 'List duplicated files special page',
-       'listredirects' => 'List redirects',
-       'unusedtemplates' => 'Unused templates',
-       'randompage' => 'Random page',
-       'randomincategory' => 'Random page in category',
-       'randomredirect' => 'Random redirect',
-       'statistics' => 'Statistics',
-       'pageswithprop' => '',
-       'doubleredirects' => '',
-       'brokenredirects' => '',
-       'withoutinterwiki' => '',
-       'fewestrevisions' => '',
-       'specialpages' => 'Miscellaneous special pages',
-       'booksources' => 'Book sources',
-       'magicwords' => 'Magic words',
-       'logpages' => 'Special:Log',
-       'allpages' => 'Special:AllPages',
-       'categories' => 'Special:Categories',
-       'deletedcontribs' => 'Special:DeletedContributions',
-       'linksearch' => 'Special:LinkSearch',
-       'listusers' => 'Special:ListUsers',
-       'activeusers' => 'Special:ActiveUsers',
-       'newuserlog' => 'Special:Log/newusers',
-       'listgrouprights' => 'Special:ListGroupRights',
-       'emailuser' => 'Email user',
-       'usermessage' => 'User Messenger',
-       'watchlist' => 'Watchlist',
-       'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
-       'enotif' => '',
-       'delete' => 'Delete',
-       'rollback' => 'Rollback',
-       'edittokens' => 'Edit tokens',
-       'protect' => 'Protect',
-       'restrictions' => 'Restrictions (nouns)',
-       'restriction-levels' => 'Restriction levels',
-       'undelete' => 'Undelete',
-       'nsform' => 'Namespace form on various pages',
-       'contributions' => 'Contributions',
-       'sp-contributions' => '',
-       'whatlinkshere' => 'What links here',
-       'block' => 'Block/unblock',
-       'developertools' => 'Developer tools',
-       'movepage' => 'Move page',
-       'export' => 'Export',
-       'allmessages' => 'Namespace 8 related',
-       'thumbnails' => 'Thumbnails',
-       'import' => 'Special:Import',
-       'importlog' => 'Import log',
-       'javaccripttest' => 'JavaScriptTest',
-       'accesskeys' => 'Keyboard access keys for power users',
-       'tooltips' => 'Tooltip help for the actions',
-       'stylesheets' => 'Stylesheets',
-       'scripts' => 'Scripts',
-       'metadata_cc' => 'Metadata',
-       'attribution' => 'Attribution',
-       'spamprotection' => 'Spam protection',
-       'info' => 'Info page',
-       'skin' => 'Skin names',
-       'patrolling' => 'Patrolling',
-       'patrol-log' => 'Patrol log',
-       'imagedeletion' => 'Image deletion',
-       'browsediffs' => 'Browsing diffs',
-       'newfiles' => 'Special:NewFiles',
-       'video-info' => 'Video information, used by Language::formatTimePeriod() to ' .
-               'format lengths in the above messages',
-       'human-timestamps' => 'Human-readable timestamps',
-       'badimagelist' => 'Bad image list',
-       'variantname-zh' => "Short names for language variants used for language conversion links.
-Variants for Chinese language",
-       'variantname-gan' => 'Variants for Gan language',
-       'variantname-sr' => 'Variants for Serbian language',
-       'variantname-kk' => 'Variants for Kazakh language',
-       'variantname-ku' => 'Variants for Kurdish language',
-       'variantname-tg' => 'Variants for Tajiki language',
-       'variantname-iu' => 'Variants for Inuktitut language',
-       'variantname-shi' => 'Variants for Tachelhit language',
-       'media-info' => 'Media information',
-       'metadata' => 'Metadata',
-       'exif' => 'Exif tags',
-       'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
-       'exif-compression' => 'Exif attributes',
-       'exif-copyrighted' => '',
-       'exif-unknowndate' => '',
-       'exif-photometricinterpretation' => '',
-       'exif-orientation' => '',
-       'exif-planarconfiguration' => '',
-       'exif-xyresolution' => '',
-       'exif-colorspace' => '',
-       'exif-componentsconfiguration' => '',
-       'exif-exposureprogram' => '',
-       'exif-subjectdistance-value' => '',
-       'exif-meteringmode' => '',
-       'exif-lightsource' => '',
-       'exif-flash' => 'Flash modes',
-       'exif-focalplaneresolutionunit' => '',
-       'exif-sensingmethod' => '',
-       'exif-filesource' => '',
-       'exif-scenetype' => '',
-       'exif-customrendered' => '',
-       'exif-exposuremode' => '',
-       'exif-whitebalance' => '',
-       'exif-scenecapturetype' => '',
-       'exif-gaincontrol' => '',
-       'exif-contrast' => '',
-       'exif-saturation' => '',
-       'exif-sharpness' => '',
-       'exif-subjectdistancerange' => '',
-       'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
-       'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
-       'exif-altituderef' => 'Pseudotags used for GPSAltitudeRef',
-       'exif-gpsstatus' => '',
-       'exif-gpsmeasuremode' => '',
-       'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef',
-       'exif-gpsdestdistanceref' => 'Pseudotags used for GPSDestDistanceRef',
-       'exif-gdop' => '',
-       'exif-objectcycle' => '',
-       'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
-       'exif-ycbcrpositioning' => '',
-       'exif-dc' => '',
-       'exif-rating' => '',
-       'exif-isospeedratings' => '',
-       'exif-maxaperturevalue' => '',
-       'exif-iimcategory' => '',
-       'exif-urgency' => '',
-       'all' => "'all' in various places, this might be different for inflected languages",
-       'confirmemail' => 'Email address confirmation',
-       'scarytransclusion' => 'Scary transclusion',
-       'deleteconflict' => 'Delete conflict',
-       'unit-pixel' => '',
-       'purge' => 'action=purge',
-       'watch-unwatch' => 'action=watch/unwatch',
-       'separators' => 'Separators for various lists, etc.',
-       'imgmulti' => 'Multipage image navigation',
-       'img-lang' => 'Language selector for translatable SVGs',
-       'tablepager' => 'Table pager',
-       'autosumm' => 'Auto-summaries',
-       'autoblock_whitelist' => 'Autoblock whitelist',
-       'sizeunits' => 'Size units',
-       'bitrateunits' => 'Bitrate units',
-       'livepreview' => 'Live preview',
-       'lagwarning' => 'Friendlier slave lag warnings',
-       'watchlisteditor' => 'Watchlist editor',
-       'watchlisttools' => 'Watchlist editing tools',
-       'iranian-dates' => 'Iranian month names',
-       'hijri-dates' => 'Hijri month names',
-       'hebrew-dates' => 'Hebrew month names',
-       'signatures' => 'Signatures',
-       'CoreParserFunctions' => 'Core parser functions',
-       'version' => 'Special:Version',
-       'redirect' => 'Special:Redirect',
-       'fileduplicatesearch' => 'Special:FileDuplicateSearch',
-       'special-specialpages' => 'Special:SpecialPages',
-       'special-blank' => 'Special:BlankPage',
-       'external_images' => 'External image whitelist',
-       'special-tags' => 'Special:Tags',
-       'comparepages' => 'Special:ComparePages',
-       'db-error-messages' => 'Database error messages',
-       'html-forms' => 'HTML forms',
-       'sqlite' => 'SQLite database support',
-       'logging' => 'New logging system',
-       'logging-irc' => 'For IRC, see bug 34508. Do not change',
-       'feedback' => 'Feedback',
-       'searchsuggestions' => 'Search suggestions',
-       'apierrors' => 'API errors',
-       'duration' => 'Durations',
-       'cachedspecial' => 'SpecialCachedPage',
-       'rotation' => 'Image rotation',
-       'limitreport' => 'Limit report',
-       'expandtemplates' => 'Special:ExpandTemplates',
-       'trackingcategories' => 'Special:TrackingCategories'
-);
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
deleted file mode 100644 (file)
index ea55a8e..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Rewrite the messages array in the files languages/messages/MessagesXx.php.
- *
- * 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
- *
- * @file
- * @ingroup MaintenanceLanguage
- * @defgroup MaintenanceLanguage MaintenanceLanguage
- */
-
-require_once __DIR__ . '/../commandLine.inc';
-require_once 'languages.inc';
-require_once 'writeMessagesArray.inc';
-
-/**
- * Rewrite a messages array.
- *
- * @param Languages $languages
- * @param string $code The language code.
- * @param bool $write Write to the messages file?
- * @param bool $listUnknown List the unknown messages?
- * @param bool $removeUnknown Remove the unknown messages?
- * @param bool $removeDupes Remove the duplicated messages?
- * @param string $dupeMsgSource The source file intended to remove from the array.
- * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
- */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown,
-       $removeDupes, $dupeMsgSource, $messagesFolder
-) {
-       $messages = $languages->getMessages( $code );
-       $messages = $messages['all'];
-       if ( $removeDupes ) {
-               $messages = removeDupes( $messages, $dupeMsgSource );
-       }
-       MessageWriter::writeMessagesToFile(
-               $messages,
-               $code,
-               $write,
-               $listUnknown,
-               $removeUnknown,
-               $messagesFolder
-       );
-}
-
-/**
- * Remove duplicates from a message array.
- *
- * @param array $oldMsgArray The input message array.
- * @param string $dupeMsgSource The source file path for duplicates.
- * @return array The output message array, with duplicates removed.
- */
-function removeDupes( $oldMsgArray, $dupeMsgSource ) {
-       if ( file_exists( $dupeMsgSource ) ) {
-               include $dupeMsgSource;
-               if ( !isset( $dupeMessages ) ) {
-                       echo "There are no duplicated messages in the source file provided.";
-                       exit( 1 );
-               }
-       } else {
-               echo "The specified file $dupeMsgSource cannot be found.";
-               exit( 1 );
-       }
-       $newMsgArray = $oldMsgArray;
-       foreach ( $oldMsgArray as $key => $value ) {
-               if ( array_key_exists( $key, $dupeMessages ) ) {
-                       unset( $newMsgArray[$key] );
-               }
-       }
-
-       return $newMsgArray;
-}
-
-# Show help
-if ( isset( $options['help'] ) ) {
-       echo <<<TEXT
-Run this script to rewrite the messages array in the files
-languages/messages/MessagesXX.php.
-Parameters:
-       * lang: Language code (default: the installation default language).
-         You can also specify "all" to check all the languages.
-       * help: Show this help.
-Options:
-       * dry-run: Do not write the array to the file.
-       * no-unknown: Do not list the unknown messages.
-       * remove-unknown: Remove unknown messages.
-       * remove-duplicates: Remove duplicated messages based on a PHP source file.
-       * messages-folder: An alternative folder with MediaWiki messages.
-
-TEXT;
-       exit( 1 );
-}
-
-# Get the language code
-if ( isset( $options['lang'] ) ) {
-       $wgCode = $options['lang'];
-} else {
-       $wgCode = $wgContLang->getCode();
-}
-
-# Get the duplicate message source
-if ( isset( $options['remove-duplicates'] ) && ( strcmp( $options['remove-duplicates'], '' ) ) ) {
-       $wgDupeMessageSource = $options['remove-duplicates'];
-} else {
-       $wgDupeMessageSource = '';
-}
-
-# Get the options
-$wgWriteToFile = !isset( $options['dry-run'] );
-$wgListUnknownMessages = !isset( $options['no-unknown'] );
-$wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
-$wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
-$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
-
-# Get language objects
-$languages = new Languages();
-
-# Write all the language
-if ( $wgCode == 'all' ) {
-       foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage(
-                       $languages,
-                       $languageCode,
-                       $wgWriteToFile,
-                       $wgListUnknownMessages,
-                       $wgRemoveUnknownMessages,
-                       $wgRemoveDuplicateMessages,
-                       $wgDupeMessageSource,
-                       $messagesFolder
-               );
-       }
-} else {
-       rebuildLanguage(
-               $languages,
-               $wgCode,
-               $wgWriteToFile,
-               $wgListUnknownMessages,
-               $wgRemoveUnknownMessages,
-               $wgRemoveDuplicateMessages,
-               $wgDupeMessageSource,
-               $messagesFolder
-       );
-}
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
deleted file mode 100644 (file)
index aa2067e..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-/**
- * Write a messages array as a PHP text.
- *
- * 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
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/**
- * @ingroup MaintenanceLanguage
- */
-class MessageWriter {
-       protected static $optionalComment =
-               'only translate this message to other languages if you have to change it';
-       protected static $ignoredComment = "do not translate or duplicate this message to other languages";
-
-       protected static $messageStructure;
-       protected static $blockComments;
-       protected static $ignoredMessages;
-       protected static $optionalMessages;
-
-       /**
-        * Write a messages array as a PHP text and write it to the messages file.
-        *
-        * @param array $messages The messages array.
-        * @param string $code The language code.
-        * @param bool $write Write to the messages file?
-        * @param bool $listUnknown List the unknown messages?
-        * @param bool $removeUnknown Whether to remove unkown messages
-        * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
-        *   Defaults to the current install.
-        */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown,
-               $removeUnknown, $messagesFolder = false
-       ) {
-               # Rewrite the messages array
-               $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
-               $messagesText = $messages[0];
-               $sortedMessages = $messages[1];
-
-               # Write to the file
-               if ( $messagesFolder ) {
-                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
-               } else {
-                       $filename = Language::getMessagesFileName( $code );
-               }
-
-               if ( file_exists( $filename ) ) {
-                       $contents = file_get_contents( $filename );
-               } else {
-                       $contents = '<?php
-$messages = array(
-);
-';
-               }
-
-               if ( strpos( $contents, '$messages' ) !== false ) {
-                       $contents = explode( '$messages', $contents );
-                       if ( $messagesText == '$messages' . $contents[1] ) {
-                               echo "Generated messages for language $code. Same as the current file.\n";
-                       } else {
-                               if ( $write ) {
-                                       $new = $contents[0];
-                                       $new .= $messagesText;
-                                       file_put_contents( $filename, $new );
-                                       echo "Generated and wrote messages for language $code.\n";
-                               } else {
-                                       echo "Generated messages for language $code.\n" .
-                                               "Please run the script again (without the parameter \"dry-run\") " .
-                                               "to write the array to the file.\n";
-                               }
-                       }
-                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) &&
-                               !empty( $sortedMessages['unknown'] )
-                       ) {
-                               if ( $removeUnknown ) {
-                                       echo "\nThe following " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages have been removed:\n";
-                               } else {
-                                       echo "\nThere are " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages, please check them:\n";
-                               }
-                               foreach ( $sortedMessages['unknown'] as $key => $value ) {
-                                       echo "* " . $key . "\n";
-                               }
-                       }
-               } else {
-                       echo "Generated messages for language $code. There seem to be no messages array in the file.\n";
-               }
-       }
-
-       /**
-        * Write a messages array as a PHP text.
-        *
-        * @param array $messages The messages array.
-        * @param bool $ignoredComments Show comments about ignored and optional
-        *   messages? (For English.)
-        * @param string $prefix Base path for messages.inc and messageTypes.inc files
-        *   or false for default path (this directory)
-        * @param bool $removeUnknown Whether to remove unkown messages
-        *
-        * @return array Array of the PHP text and the sorted messages array.
-        */
-       public static function writeMessagesArray( $messages, $ignoredComments = false,
-               $prefix = false, $removeUnknown = false
-       ) {
-               # Load messages
-               $dir = $prefix ? $prefix : __DIR__;
-
-               require $dir . '/messages.inc';
-               self::$messageStructure = $wgMessageStructure;
-               self::$blockComments = $wgBlockComments;
-
-               require $dir . '/messageTypes.inc';
-               self::$ignoredMessages = $wgIgnoredMessages;
-               self::$optionalMessages = $wgOptionalMessages;
-
-               # Sort messages to blocks
-               $sortedMessages['unknown'] = $messages;
-               foreach ( self::$messageStructure as $blockName => $block ) {
-                       /**
-                        * @var $block array
-                        */
-                       foreach ( $block as $key ) {
-                               if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
-                                       $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
-                                       unset( $sortedMessages['unknown'][$key] );
-                               }
-                       }
-               }
-
-               # Write all the messages
-               $messagesText = "\$messages = array(
-";
-               foreach ( $sortedMessages as $block => $messages ) {
-                       # Skip if it's the block of unknown messages - handle that in the end of file
-                       if ( $block == 'unknown' ) {
-                               continue;
-                       }
-
-                       if ( $ignoredComments ) {
-                               $ignored = self::$ignoredMessages;
-                               $optional = self::$optionalMessages;
-                       } else {
-                               $ignored = array();
-                               $optional = array();
-                       }
-                       $comments = self::makeComments( array_keys( $messages ), $ignored, $optional );
-
-                       # Write the block
-                       $messagesText .= self::writeMessagesBlock( self::$blockComments[$block], $messages, $comments );
-               }
-
-               # Write the unknown messages, alphabetically sorted.
-               # Of course, we don't have any comments for them, because they are unknown.
-               if ( !$removeUnknown ) {
-                       ksort( $sortedMessages['unknown'] );
-                       $messagesText .= self::writeMessagesBlock( 'Unknown messages', $sortedMessages['unknown'] );
-               }
-               $messagesText .= ");
-";
-
-               return array( $messagesText, $sortedMessages );
-       }
-
-       /**
-        * Generates an array of comments for messages.
-        *
-        * @param array $messages Key of messages.
-        * @param array $ignored List of ingored message keys.
-        * @param array $optional List of optional message keys.
-        * @return array
-        */
-       public static function makeComments( $messages, $ignored, $optional ) {
-               # Comment collector
-               $commentArray = array();
-
-               # List of keys only
-               foreach ( $messages as $key ) {
-                       if ( in_array( $key, $ignored ) ) {
-                               $commentArray[$key] = ' # ' . self::$ignoredComment;
-                       } elseif ( in_array( $key, $optional ) ) {
-                               $commentArray[$key] = ' # ' . self::$optionalComment;
-                       }
-               }
-
-               return $commentArray;
-       }
-
-       /**
-        * Write a block of messages to PHP.
-        *
-        * @param string $blockComment The comment of whole block.
-        * @param array $messages The block messages.
-        * @param array $messageComments Optional comments for messages in this block.
-        * @param string $prefix Prefix for every line, for indenting purposes.
-        *
-        * @return string The block, formatted in PHP.
-        */
-       public static function writeMessagesBlock( $blockComment, $messages,
-               $messageComments = array(), $prefix = '' ) {
-
-               $blockText = '';
-
-               # Skip the block if it includes no messages
-               if ( empty( $messages ) ) {
-                       return '';
-               }
-
-               # Format the block comment (if exists); check for multiple lines comments
-               if ( !empty( $blockComment ) ) {
-                       if ( strpos( $blockComment, "\n" ) === false ) {
-                               $blockText .= "$prefix# $blockComment
-";
-                       } else {
-                               $blockText .= "$prefix/*
-$blockComment
-*/
-";
-                       }
-               }
-
-               # Get max key length
-               $maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
-
-               # Format the messages
-               foreach ( $messages as $key => $value ) {
-                       # Add the key name
-                       $blockText .= "$prefix'$key'";
-
-                       # Add the appropriate block whitespace
-                       $blockText .= str_repeat( ' ', $maxKeyLength - strlen( $key ) );
-
-                       # Refer to the value
-                       $blockText .= ' => ';
-
-                       # Check for the appropriate apostrophe and add the value
-                       # Quote \ here, because it needs always escaping
-                       $value = addcslashes( $value, '\\' );
-
-                       # For readability
-                       $single = "'";
-                       $double = '"';
-
-                       if ( strpos( $value, $single ) === false ) {
-                               # Nothing ugly, just use '
-                               $blockText .= $single . $value . $single;
-                       } elseif ( strpos( $value, $double ) === false &&
-                               !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value )
-                       ) {
-                               # No "-quotes, no variables that need quoting, use "
-                               $blockText .= $double . $value . $double;
-                       } else {
-                               # Something needs quoting, pick the quote which causes less quoting
-
-                               if ( substr_count( $value, $double ) + substr_count( $value, '$' ) >=
-                                       substr_count( $value, $single )
-                               ) {
-                                       $quote = $single;
-                               } else {
-                                       $quote = $double;
-                               }
-
-                               if ( $quote === $double ) {
-                                       $extra = '$';
-                               } else {
-                                       $extra = '';
-                               }
-                               $blockText .= $quote . addcslashes( $value, $quote . $extra ) . $quote;
-                       }
-
-                       # Comma
-                       $blockText .= ',';
-
-                       # Add comments, if there is any
-                       if ( array_key_exists( $key, $messageComments ) ) {
-                               $blockText .= $messageComments[$key];
-                       }
-
-                       # Newline
-                       $blockText .= "
-";
-               }
-
-               # Newline to end the block
-               $blockText .= "
-";
-
-               return $blockText;
-       }
-}
diff --git a/maintenance/oracle/archives/patch-page_links_updated.sql b/maintenance/oracle/archives/patch-page_links_updated.sql
new file mode 100644 (file)
index 0000000..5360329
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page ADD page_links_updated TIMESTAMP(6) WITH TIME ZONE;
+
diff --git a/maintenance/oracle/archives/patch-rc_source.sql b/maintenance/oracle/archives/patch-rc_source.sql
new file mode 100644 (file)
index 0000000..0c80afa
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.recentchanges ADD rc_source VARCHAR2(16);
index 8e752da..824cc82 100644 (file)
@@ -1,3 +1,3 @@
 define mw_prefix='{$wgDBprefix}';
 
-ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL;
+ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE;
index f05c0cc..ff84858 100644 (file)
@@ -19,7 +19,7 @@ CREATE TABLE &mw_prefix.mwuser ( -- replace reserved word 'user'
   user_touched              TIMESTAMP(6) WITH TIME ZONE,
   user_registration         TIMESTAMP(6) WITH TIME ZONE,
   user_editcount            NUMBER,
-  user_password_expires     TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL
+  user_password_expires     TIMESTAMP(6) WITH TIME ZONE
 );
 ALTER TABLE &mw_prefix.mwuser ADD CONSTRAINT &mw_prefix.mwuser_pk PRIMARY KEY (user_id);
 CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
@@ -28,7 +28,8 @@ CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
 
 -- Create a dummy user to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.mwuser
-  VALUES (0,'Anonymous',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, '', current_timestamp, current_timestamp, 0);
+  (user_id, user_name, user_options, user_touched, user_registration, user_editcount)
+  VALUES (0,'Anonymous','', current_timestamp, current_timestamp,0);
 
 CREATE TABLE &mw_prefix.user_groups (
   ug_user   NUMBER      DEFAULT 0 NOT NULL,
@@ -73,6 +74,7 @@ CREATE TABLE &mw_prefix.page (
   page_is_new        CHAR(1)           DEFAULT '0' NOT NULL,
   page_random        NUMBER(15,14) NOT NULL,
   page_touched       TIMESTAMP(6) WITH TIME ZONE,
+  page_links_updated TIMESTAMP(6) WITH TIME ZONE,
   page_latest        NUMBER        DEFAULT 0 NOT NULL, -- FK?
   page_len           NUMBER        DEFAULT 0 NOT NULL,
   page_content_model VARCHAR2(32)
@@ -85,7 +87,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0, NULL);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -403,7 +405,7 @@ CREATE SEQUENCE recentchanges_rc_id_seq;
 CREATE TABLE &mw_prefix.recentchanges (
   rc_id              NUMBER      NOT NULL,
   rc_timestamp       TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
+  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE,
   rc_user            NUMBER          DEFAULT 0 NOT NULL,
   rc_user_text       VARCHAR2(255)         NOT NULL,
   rc_namespace       NUMBER     DEFAULT 0 NOT NULL,
@@ -416,6 +418,7 @@ CREATE TABLE &mw_prefix.recentchanges (
   rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
+  rc_source                                     VARCHAR2(16),
   rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
   rc_ip              VARCHAR2(15),
   rc_old_len         NUMBER,
diff --git a/maintenance/pageExists.php b/maintenance/pageExists.php
new file mode 100644 (file)
index 0000000..c4b208a
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/**
+ * 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
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class PageExists extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Report whether a specific page exists";
+               $this->addArg( 'title', 'Page title to check whether it exists' );
+       }
+
+       public function execute() {
+               $titleArg = $this->getArg();
+               $title = Title::newFromText( $titleArg );
+               $pageExists = $title && $title->exists();
+
+               $text = '';
+               $code = 0;
+               if ( $pageExists ) {
+                       $text = "{$title} exists.";
+               } else {
+                       $text = "{$title} doesn't exist.";
+                       $code = 1;
+               }
+               $this->output( $text );
+               $this->error( '', $code );
+       }
+}
+
+$maintClass = "PageExists";
+require_once RUN_MAINTENANCE_IF_MAIN;
+
old mode 100644 (file)
new mode 100755 (executable)
index f96ee39..a51564a
@@ -1,3 +1,4 @@
+#!/usr/bin/env php
 <?php
 /**
  * Run all updaters.
index 6057b39..3a6f5e3 100644 (file)
@@ -191,6 +191,7 @@ return array(
 
        'jquery' => array(
                'scripts' => 'resources/lib/jquery/jquery.js',
+               'debugScripts' => 'resources/lib/jquery/jquery.migrate.js',
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1136,10 +1137,10 @@ return array(
        'mediawiki.page.watch.ajax' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
                'dependencies' => array(
-                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
-                       'mediawiki.util',
                        'mediawiki.notify',
+                       'mediawiki.util',
+                       'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                ),
                'messages' => array(
diff --git a/resources/lib/jquery/jquery.migrate.js b/resources/lib/jquery/jquery.migrate.js
new file mode 100644 (file)
index 0000000..25b6c81
--- /dev/null
@@ -0,0 +1,521 @@
+/*!
+ * jQuery Migrate - v1.2.1 - 2013-05-08
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && window.console.log ) {
+       window.console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+       var console = window.console;
+       if ( !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       if ( Object.defineProperty ) {
+               // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+               // allow property to be overwritten in case some other plugin wants it
+               try {
+                       Object.defineProperty( obj, prop, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function() {
+                                       migrateWarn( msg );
+                                       return value;
+                               },
+                               set: function( newValue ) {
+                                       migrateWarn( msg );
+                                       value = newValue;
+                               }
+                       });
+                       return;
+               } catch( err ) {
+                       // IE8 is a dope about Object.defineProperty, can't warn there
+               }
+       }
+
+       // Non-ES5 (or broken) browser; just set the property
+       jQuery._definePropertyBroken = true;
+       obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+       // jQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+       oldAttr = jQuery.attr,
+       valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+               function() { return null; },
+       valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+               function() { return undefined; },
+       rnoType = /^(?:input|button)$/i,
+       rnoAttrNodeType = /^[238]$/,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+       var lowerName = name.toLowerCase(),
+               nType = elem && elem.nodeType;
+
+       if ( pass ) {
+               // Since pass is used internally, we only warn for new jQuery
+               // versions where there isn't a pass arg in the formal params
+               if ( oldAttr.length < 4 ) {
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+               }
+               if ( elem && !rnoAttrNodeType.test( nType ) &&
+                       (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+       }
+
+       // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+       // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+       if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+       }
+
+       // Restore boolHook for boolean property/attribute synchronization
+       if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+               jQuery.attrHooks[ lowerName ] = {
+                       get: function( elem, name ) {
+                               // Align boolean attributes with corresponding properties
+                               // Fall back to attribute presence where some booleans are not supported
+                               var attrNode,
+                                       property = jQuery.prop( elem, name );
+                               return property === true || typeof property !== "boolean" &&
+                                       ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+                                       name.toLowerCase() :
+                                       undefined;
+                       },
+                       set: function( elem, value, name ) {
+                               var propName;
+                               if ( value === false ) {
+                                       // Remove boolean attributes when set to false
+                                       jQuery.removeAttr( elem, name );
+                               } else {
+                                       // value is true since we know at this point it's type boolean and not false
+                                       // Set boolean attributes to the same name and set the DOM property
+                                       propName = jQuery.propFix[ name ] || name;
+                                       if ( propName in elem ) {
+                                               // Only set the IDL specifically if it already exists on the element
+                                               elem[ propName ] = true;
+                                       }
+
+                                       elem.setAttribute( name, name.toLowerCase() );
+                               }
+                               return name;
+                       }
+               };
+
+               // Warn only for attributes that can remain distinct from their properties post-1.9
+               if ( ruseDefault.test( lowerName ) ) {
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+               }
+       }
+
+       return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+       get: function( elem, name ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrGet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+               }
+               return name in elem ?
+                       elem.value :
+                       null;
+       },
+       set: function( elem, value ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrSet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+               }
+               // Does not return so that setAttribute is also used
+               elem.value = value;
+       }
+};
+
+
+var matched, browser,
+       oldInit = jQuery.fn.init,
+       oldParseJSON = jQuery.parseJSON,
+       // Note: XSS check is done below after string is trimmed
+       rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+       var match;
+
+       if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+                       (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+               // This is an HTML string according to the "old" rules; is it still?
+               if ( selector.charAt( 0 ) !== "<" ) {
+                       migrateWarn("$(html) HTML strings must start with '<' character");
+               }
+               if ( match[ 3 ] ) {
+                       migrateWarn("$(html) HTML text after last tag is ignored");
+               }
+               // Consistently reject any HTML-like string starting with a hash (#9521)
+               // Note that this may break jQuery 1.6.x code that otherwise would work.
+               if ( match[ 0 ].charAt( 0 ) === "#" ) {
+                       migrateWarn("HTML string cannot start with a '#' character");
+                       jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+               }
+               // Now process using loose rules; let pre-1.8 play too
+               if ( context && context.context ) {
+                       // jQuery object as context; parseHTML expects a DOM object
+                       context = context.context;
+               }
+               if ( jQuery.parseHTML ) {
+                       return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
+                                       context, rootjQuery );
+               }
+       }
+       return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+       if ( !json && json !== null ) {
+               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               return null;
+       }
+       return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+       matched = jQuery.uaMatch( navigator.userAgent );
+       browser = {};
+
+       if ( matched.browser ) {
+               browser[ matched.browser ] = true;
+               browser.version = matched.version;
+       }
+
+       // Chrome is Webkit, but Webkit is also Safari.
+       if ( browser.chrome ) {
+               browser.webkit = true;
+       } else if ( browser.webkit ) {
+               browser.safari = true;
+       }
+
+       jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
+               }
+
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       migrateWarn( "jQuery.sub() is deprecated" );
+       return jQuerySub;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+       converters: {
+               "text json": jQuery.parseJSON
+       }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+       var ret, evt,
+               elem = this[0];
+
+       // Handles 1.7 which has this behavior and 1.8 which doesn't
+       if ( elem && name === "events" && arguments.length === 1 ) {
+               ret = jQuery.data( elem, name );
+               evt = jQuery._data( elem, name );
+               if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       return evt;
+               }
+       }
+       return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+       oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+       jQuery.clean = function( elems, context, fragment, scripts ) {
+               // Set context per 1.8 logic
+               context = context || document;
+               context = !context.nodeType && context[0] || context;
+               context = context.ownerDocument || context;
+
+               migrateWarn("jQuery.clean() is deprecated");
+
+               var i, elem, handleScript, jsTags,
+                       ret = [];
+
+               jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+               // Complex logic lifted directly from jQuery 1.8
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
+
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var eventAdd = jQuery.event.add,
+       eventRemove = jQuery.event.remove,
+       eventTrigger = jQuery.event.trigger,
+       oldToggle = jQuery.fn.toggle,
+       oldLive = jQuery.fn.live,
+       oldDie = jQuery.fn.die,
+       ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+       rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       hoverHack = function( events ) {
+               if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+                       return events;
+               }
+               if ( rhoverHack.test( events ) ) {
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+               }
+               return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+       jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+       if ( elem !== document && rajaxEvent.test( types ) ) {
+               migrateWarn( "AJAX events should be attached to document: " + types );
+       }
+       eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+       eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+       var args = Array.prototype.slice.call( arguments, 0);
+       migrateWarn("jQuery.fn.error() is deprecated");
+       args.splice( 0, 0, "error" );
+       if ( arguments.length ) {
+               return this.bind.apply( this, args );
+       }
+       // error event should not bubble to window, although it does pre-1.7
+       this.triggerHandler.apply( this, args );
+       return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+       // Don't mess with animation or css toggles
+       if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+               return oldToggle.apply( this, arguments );
+       }
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+       // Save reference to arguments for access in closure
+       var args = arguments,
+               guid = fn.guid || jQuery.guid++,
+               i = 0,
+               toggler = function( event ) {
+                       // Figure out which function to execute
+                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                       // Make sure that clicks stop
+                       event.preventDefault();
+
+                       // and execute the function
+                       return args[ lastToggle ].apply( this, arguments ) || false;
+               };
+
+       // link all the functions, so any of them can unbind this click handler
+       toggler.guid = guid;
+       while ( i < args.length ) {
+               args[ i++ ].guid = guid;
+       }
+
+       return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+       migrateWarn("jQuery.fn.live() is deprecated");
+       if ( oldLive ) {
+               return oldLive.apply( this, arguments );
+       }
+       jQuery( this.context ).on( types, this.selector, data, fn );
+       return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+       migrateWarn("jQuery.fn.die() is deprecated");
+       if ( oldDie ) {
+               return oldDie.apply( this, arguments );
+       }
+       jQuery( this.context ).off( types, this.selector || "**", fn );
+       return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+       if ( !elem && !rajaxEvent.test( event ) ) {
+               migrateWarn( "Global events are undocumented and deprecated" );
+       }
+       return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+       function( _, name ) {
+               jQuery.event.special[ name ] = {
+                       setup: function() {
+                               var elem = this;
+
+                               // The document needs no shimming; must be !== for oldIE
+                               if ( elem !== document ) {
+                                       jQuery.event.add( document, name + "." + jQuery.guid, function() {
+                                               jQuery.event.trigger( name, null, elem, true );
+                                       });
+                                       jQuery._data( this, name, jQuery.guid++ );
+                               }
+                               return false;
+                       },
+                       teardown: function() {
+                               if ( this !== document ) {
+                                       jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+                               }
+                               return false;
+                       }
+               };
+       }
+);
+
+
+})( jQuery, window );
index dfb3d22..18c66e9 100644 (file)
@@ -6,5 +6,7 @@
        },
        "ooui-dialog-action-close": "Джаб",
        "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
-       "ooui-outline-control-move-up": "Элементни башына кёчюр"
+       "ooui-outline-control-move-up": "Элементни башына кёчюр",
+       "ooui-outline-control-remove": "Пунктну кетер",
+       "ooui-toolbar-more": "Энтда"
 }
index b5f8824..495056f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7d2507b267)
+ * OOjs UI v0.1.0-pre (7b3672591f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon May 05 2014 14:13:13 GMT-0700 (PDT)
+ * Date: Fri May 09 2014 13:27:04 GMT+0200 (CEST)
  */
 ( function ( OO ) {
 
index 0c2cfaf..68d73d9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7d2507b267)
+ * OOjs UI v0.1.0-pre (7b3672591f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon May 05 2014 14:13:12 GMT-0700 (PDT)
+ * Date: Fri May 09 2014 13:27:04 GMT+0200 (CEST)
  */
 
 /* Textures */
index 22e8652..7d200ff 100644 (file)
@@ -535,15 +535,20 @@ $.fn.suggestions = function () {
                                                        if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                $.suggestions.highlight( context, $result, true );
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.result.select === 'function' ) {
                                                                        context.config.result.select.call( $result, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                )
@@ -563,14 +568,19 @@ $.fn.suggestions = function () {
                                                        if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.special.select === 'function' ) {
                                                                        context.config.special.select.call( $special, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                                .mousemove( function ( e ) {
index f8448e6..dcd2b0b 100644 (file)
@@ -2,16 +2,20 @@
  * Javascript for module editWarning
  */
 ( function ( mw, $ ) {
+       'use strict';
+
        $( function () {
+               var savedWindowOnBeforeUnload,
+                       $wpTextbox1 = $( '#wpTextbox1' ),
+                       $wpSummary = $( '#wpSummary' );
                // Check if EditWarning is enabled and if we need it
-               if ( $( '#wpTextbox1' ).length === 0 ) {
+               if ( $wpTextbox1.length === 0 ) {
                        return true;
                }
                // Get the original values of some form elements
-               $( '#wpTextbox1, #wpSummary' ).each( function () {
+               $wpTextbox1.add( $wpSummary ).each( function () {
                        $( this ).data( 'origtext', $( this ).val() );
                } );
-               var savedWindowOnBeforeUnload;
                $( window )
                        .on( 'beforeunload.editwarning', function () {
                                var retval;
@@ -20,8 +24,8 @@
                                // the original values
                                if (
                                        mw.config.get( 'wgAction' ) === 'submit' ||
-                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
-                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+                                               $wpTextbox1.data( 'origtext' ) !== $wpTextbox1.val() ||
+                                               $wpSummary.data( 'origtext' ) !== $wpSummary.val()
                                ) {
                                        // Return our message
                                        retval = mw.msg( 'editwarning-warning' );
index 9962534..6444d93 100644 (file)
 
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               mw.log( 'mw.Api error: ', code, details );
+                               if ( code !== 'abort' ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
                        } );
                },
 
index aa33d86..af2dee1 100644 (file)
        function doWatchInternal( pages, ok, err, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
                // documentation in the public method...
-               var apiPromise = this.post(
+               var apiPromise = this.postWithToken( 'watch',
                        $.extend(
                                {
                                        action: 'watch',
                                        titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       token: mw.user.tokens.get( 'watchToken' ),
                                        uselang: mw.config.get( 'wgUserLanguage' )
                                },
                                addParams
index 850177f..3b0aeee 100644 (file)
@@ -17,7 +17,7 @@
         * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
         */
        function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li, otherAction;
+               var msgKey, $li, otherAction;
 
                // A valid but empty jQuery object shouldn't throw a TypeError
                if ( !$link.length ) {
@@ -32,7 +32,6 @@
                // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
                msgKey = state === 'loading' ? action + 'ing' : action;
                otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
                $li = $link.closest( 'li' );
 
                // Trigger a 'watchpage' event for this List item.
@@ -45,9 +44,8 @@
 
                $link
                        .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
+                       .updateTooltipAccessKeys()
                        .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
                                        title: title,
                                        action: action
index 4ec5ffa..eb7072c 100644 (file)
@@ -19,9 +19,6 @@
 table.mw-allpages-table-form, table.mw-allpages-table-chunk {
        width: 100%;
 }
-td.mw-allpages-alphaindexline {
-       text-align: right;
-}
 .mw-allpages-nav {
        text-align: right;
        margin-bottom: 1em;
index 6eb8552..e8dd473 100644 (file)
@@ -1,57 +1,47 @@
-/**
- * @private
- * @singleton
- * @class mw.toc
- */
 ( function ( mw, $ ) {
        'use strict';
 
        // Table of contents toggle
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc;
+               $toc = $content.find( '#toc' );
+               $tocTitle = $content.find( '#toctitle' );
+               $tocToggleLink = $content.find( '#togglelink' );
+               $tocList = $toc.find( 'ul' ).eq( 0 );
 
-               /**
-                * Hide/show the table of contents element
-                *
-                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
-                */
-               function toggleToc( $toggleLink ) {
-                       var $tocList = $content.find( '#toc ul:first' );
-
-                       // This function shouldn't be called if there's no TOC,
-                       // but just in case...
-                       if ( $tocList.length ) {
-                               if ( $tocList.is( ':hidden' ) ) {
-                                       $tocList.slideDown( 'fast' );
-                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
-                                       $content.find( '#toc' ).removeClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', null, {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               } else {
-                                       $tocList.slideUp( 'fast' );
-                                       $toggleLink.text( mw.msg( 'showtoc' ) );
-                                       $content.find( '#toc' ).addClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', '1', {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               }
+               // Hide/show the table of contents element
+               function toggleToc() {
+                       if ( $tocList.is( ':hidden' ) ) {
+                               $tocList.slideDown( 'fast' );
+                               $tocToggleLink.text( mw.msg( 'hidetoc' ) );
+                               $toc.removeClass( 'tochidden' );
+                               $.cookie( 'mw_hidetoc', null, {
+                                       expires: 30,
+                                       path: '/'
+                               } );
+                       } else {
+                               $tocList.slideUp( 'fast' );
+                               $tocToggleLink.text( mw.msg( 'showtoc' ) );
+                               $toc.addClass( 'tochidden' );
+                               $.cookie( 'mw_hidetoc', '1', {
+                                       expires: 30,
+                                       path: '/'
+                               } );
                        }
                }
 
-               var $tocTitle, $tocToggleLink, hideTocCookie;
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               // Only add it if there is a TOC and there is no toggle added already
-               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-                       hideTocCookie = $.cookie( 'mw_hidetoc' );
+               // Only add it if there is a complete TOC and it doesn't
+               // have a toggle added already
+               if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
+                       hideToc = $.cookie( 'mw_hidetoc' ) === '1';
+
                        $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
-                               .text( mw.msg( 'hidetoc' ) )
+                               .text( hideToc ? mw.msg( 'showtoc' ) : mw.msg( 'hidetoc' ) )
                                .click( function ( e ) {
                                        e.preventDefault();
-                                       toggleToc( $( this ) );
+                                       toggleToc();
                                } );
+
                        $tocTitle.append(
                                $tocToggleLink
                                        .wrap( '<span class="toctoggle"></span>' )
@@ -60,8 +50,9 @@
                                                .append( ']&nbsp;' )
                        );
 
-                       if ( hideTocCookie === '1' ) {
-                               toggleToc( $tocToggleLink );
+                       if ( hideToc ) {
+                               $tocList.hide();
+                               $toc.addClass( 'tochidden' );
                        }
                }
        } );
index 221ac74..298415c 100644 (file)
         *
         * Should match:
         *
-        * - "ctrl-option-"
-        * - "alt-shift-"
-        * - "ctrl-alt-"
-        * - "ctrl-"
+        * - "[ctrl-option-x]"
+        * - "[alt-shift-x]"
+        * - "[ctrl-alt-x]"
+        * - "[ctrl-x]"
         *
         * The accesskey is matched in group $6.
         *
index 4157b55..6bf01ae 100644 (file)
@@ -143,7 +143,7 @@ html .thumbimage {
 html .thumbcaption {
        border: none;
        line-height: 1.4em;
-       padding: 3px !important;
+       padding: 3px;
        font-size: 94%;
 }
 
index b64ceb0..a6d3b55 100644 (file)
@@ -104,16 +104,6 @@ img.thumbborder {
        border: 1px solid #dddddd;
 }
 
-/* table standards */
-table.rimage {
-       float: right;
-       width: 1pt;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
 body {
        background: white;
        color: black;
@@ -277,7 +267,6 @@ span.texhtml {
 /* Galleries (see shared.css for more info) */
 li.gallerybox {
        vertical-align: top;
-       display: -moz-inline-box;
        display: inline-block;
 }
 
index ac7f407..a5612e2 100644 (file)
@@ -39,6 +39,12 @@ mark {
        color: black;
 }
 
+/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
+/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
+wbr {
+       display: inline-block;
+}
+
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
 input[type="submit"],
index d30f554..fdfca0a 100644 (file)
@@ -157,11 +157,12 @@ mw.log.deprecate( win, 'jsMsg', function ( message ) {
  * @deprecated since 1.17 Use mediawiki.util instead
  */
 msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
 mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
 mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+msg = 'Use jquery.accessKeyLabel instead.';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 
 /**
  * Wikipage import methods
diff --git a/skins/vector/components/thumbnails.less b/skins/vector/components/thumbnails.less
new file mode 100644 (file)
index 0000000..afb5f2a
--- /dev/null
@@ -0,0 +1,32 @@
+// FIXME: Due to commonContent.css we have to use html tag to make sure these are more specific
+html .thumb {
+       &.tright {
+               padding: 1px 0 0 15px;
+       }
+
+       &.tleft {
+               padding: 1px 15px 0 0;
+       }
+
+       // these resets should be unnecessary
+       div.thumbinner {
+               border: none;
+               background: none;
+               font-size: 100%;
+       }
+
+       .thumbcaption {
+               line-height: @content-line-height;
+               font-size: .85em;
+               padding: 3px 0 0 0;
+               color: #333;
+       }
+
+       .magnify {
+               display: none;
+       }
+
+       .thumbimage {
+               border: none;
+       }
+}
index f7b374f..3e824f3 100644 (file)
@@ -8,3 +8,4 @@
 @import "components/footer.less";
 @import 'components/notifications.less';
 @import "components/externalLinks.less";
+@import "components/thumbnails.less";
index b4e903d..1875ac5 100644 (file)
@@ -763,6 +763,7 @@ class ParserTest {
 
                $settings = array(
                        'wgServer' => 'http://example.org',
+                       'wgServerName' => 'example.org',
                        'wgScript' => '/index.php',
                        'wgScriptPath' => '/',
                        'wgArticlePath' => '/wiki/$1',
index 49fdd48..350e83f 100644 (file)
@@ -36,7 +36,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
         * @covers MWNamespace::isMovable
         */
        public function testIsMovable() {
-               $this->assertFalse( MWNamespace::isMovable( NS_CATEGORY ) );
+               $this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
                # @todo FIXME: Write more tests!!
        }
 
index ecfcfa3..2add9f2 100644 (file)
@@ -491,4 +491,18 @@ class DummyContentForTesting extends AbstractContent {
        ) {
                return new ParserOutput( $this->getNativeData() );
        }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
 }
index bd6d41f..40484d3 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
  */
-class CssContentTest extends MediaWikiTestCase {
+class CssContentTest extends JavaScriptContentTest {
 
        protected function setUp() {
                parent::setUp();
index 253a035..03cbbc0 100644 (file)
@@ -7,14 +7,21 @@
  */
 class TextContentTest extends MediaWikiLangTestCase {
        protected $context;
+       protected $savedContentGetParserOutput;
 
        protected function setUp() {
+               global $wgHooks;
+
                parent::setUp();
 
                // Anon user
                $user = new User();
                $user->setName( '127.0.0.1' );
 
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( 'Test' ) );
+               $this->context->setUser( $user );
+
                $this->setMwGlobals( array(
                        'wgUser' => $user,
                        'wgTextModelsToParse' => array(
@@ -26,9 +33,22 @@ class TextContentTest extends MediaWikiLangTestCase {
                        'wgAlwaysUseTidy' => false,
                ) );
 
-               $this->context = new RequestContext( new FauxRequest() );
-               $this->context->setTitle( Title::newFromText( 'Test' ) );
-               $this->context->setUser( $user );
+               // bypass hooks that force custom rendering
+               if ( isset( $wgHooks['ContentGetParserOutput'] )  ) {
+                       $this->savedContentGetParserOutput = $wgHooks['ContentGetParserOutput'];
+                       unset( $wgHooks['ContentGetParserOutput'] );
+               }
+       }
+
+       public function teardown() {
+               global $wgHooks;
+
+               // restore hooks that force custom rendering
+               if ( $this->savedContentGetParserOutput !== null ) {
+                       $wgHooks['ContentGetParserOutput'] = $this->savedContentGetParserOutput;
+               }
+
+               parent::teardown();
        }
 
        public function newContent( $text ) {
index 66ed020..14bcac0 100644 (file)
@@ -65,6 +65,7 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgContLang'] = Language::factory( 'en' );
                $tmpGlobals['wgSitename'] = 'MediaWiki';
                $tmpGlobals['wgServer'] = 'http://example.org';
+               $tmpGlobals['wgServerName'] = 'example.org';
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
index 229eeb4..4ea8fc6 100644 (file)
@@ -29,6 +29,26 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Parser state cleared while parsing. Did you call Parser::parse recursively?
+        * @covers Parser::lock
+        */
+       public function testRecursiveParse() {
+               global $wgParser;
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $wgParser->setHook( 'recursivecallparser', array( $this, 'helperParserFunc' ) );
+               $wgParser->parse( '<recursivecallparser>baz</recursivecallparser>', $title, $po );
+       }
+
+       public function helperParserFunc( $input, $args, $parser) {
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $parser->parse( $input, $title, $po );
+               return 'bar';
+       }
+
        /**
         * @covers Parser::callParserFunction
         */
index 1f60293..022f998 100755 (executable)
@@ -20,7 +20,8 @@ else if ( has_binary pear ); then
     pear channel-discover components.ez.no
     pear channel-discover pear.symfony.com
     pear update-channels
-    pear install --alldeps phpunit/PHPUnit
+    #Temporary fix for 64597
+    pear install --alldeps phpunit/PHPUnit-3.7.35
 else if ( has_binary apt-get ); then
     echo Installing phpunit with apt-get
     apt-get install phpunit
index f422bc1..e6c2b5c 100644 (file)
@@ -6,14 +6,8 @@
        } );
 
        QUnit.test( 'user status', 11, function ( assert ) {
-               /**
-                * Tests can be run under three different conditions:
-                *   1) From tests/qunit/index.html, user will be anonymous.
-                *   2) Logged in on [[Special:JavaScriptTest/qunit]]
-                *   3) Anonymously at the same special page.
-                */
 
-               // Forge an anonymous user:
+               // Forge an anonymous user
                mw.config.set( 'wgUserName', null );
                delete mw.config.values.wgUserId;
 
index 59bf8dc..d7bf453 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -116,6 +116,10 @@ function wfStreamThumb( array $params ) {
                $params['width'] = $params['w'];
                unset( $params['w'] );
        }
+       if ( isset( $params['width'] ) && substr( $params['width'], -2 ) == 'px' ) {
+               // strip the px (pixel) suffix, if found
+               $params['width'] = substr( $width, 0, strlen( $width ) - 2 );
+       }
        if ( isset( $params['p'] ) ) {
                $params['page'] = $params['p'];
        }